【问题标题】:Best Practice For Creating HTML (PHP Or Jquery)?创建 HTML(PHP 或 Jquery)的最佳实践?
【发布时间】:2012-05-26 04:37:50
【问题描述】:

我有一个 JavaScript 对象,其中包含一些信息。

我可以想到 2 个选项来从这个对象创建 HTML。我想知道哪一种是正确的做事方式,这只是所有偏好吗?

1) 使用 JavaScript 循环遍历这个数组并使用 Jquery 创建 HTML?

2) Ajax 将对象发布/获取到 PHP 并循环通过该对象(php 数组)并以这种方式创建 HMTL?然后返回一个带有 HMTL 的 json 编码对象并将其附加到 div 中?

我目前所做的构建

    var OutterDiv = $(document.createElement('div'));

    for loop{
        OutterDiv.append("<span>SOME INFO</span>");


        var InnerDiv = $(document.createElement('div'));
        for loop{
            InnerDiv.append("<span>SOME INFO</span>");
            InnerDiv.append("<span>SOME INFO</span>");
        }

        OutterDiv.append(InnerDiv);
    }


    $("#content").append(OutterDiv);

【问题讨论】:

  • 如何获取 html 并不重要,只要您有效地附加它即可。例如,追加整个文档片段或 html 字符串比在 for 循环中一次追加 1 个元素更有效。
  • @Kevin B - 所以我的问题是在那个循环中附加会被认为很慢?但在构建 DIV 之前,我不会真正附加到 DOM...
  • 您正在做的事情很好,因为您要附加到文档片段,而不是文档。

标签: php jquery html ajax


【解决方案1】:

为什么不循环遍历对象并从 JavaScript 创建一个 HTML 字符串?然后在需要的地方插入该字符串?我相信这是您可以完成您想做的事情的最快方式。主要思想是连接字符串比插入 DOM 元素更快,并且可能比 Http 请求引起的延迟更快。

** 编辑 **

显然,IE 在字符串连接(大惊喜)和使用array is better 时速度较慢。 示例:

var html = [];
for (...) {
   html.push( <some html content from your object here> );
}
$(selector).html(html.join(''));

// find the elements you need to handle and perform bindings here
// ex: $('#someelment').click(...);

这可能是你能得到的最快的。

** 更新 **

虽然使用 JavaScript 执行构建 HTML 的任务通常仍然更快,但经过一些测试,似乎连接字符串或构建数组并不比创建文本节点快。该测试可以在jsfiddle.net 上查看和分叉,或者这里用于存档目的:

function runTest(testFn, duration) {

    var endTime = +new Date() + duration;
    var runs = 0;
    var charCount = 0;

    while (+new Date() < endTime) {
        charCount += testFn();
        ++runs;
    }        
    teardown();

    //console.log(testFn.title, 'ran', runs, 'times.');
    $('#log').append($('<div></div>').text(testFn.title + ' ran ' + runs + ' times (' + (charCount/1000) + ' cps).'));
}

///

function teardown() {
    while (targetDiv.firstChild) {
        targetDiv.removeChild(targetDiv.firstChild);
    }
}

///

var testData;
var sample, sampleData;
function generateTestData() {
    testData = {};
    for (var i=0; i < (Math.random() * (sample[1]-sample[0])) + sample[0]; i++) {
        testData['item'+i] = randomString();
    }
}


function randomString()
{
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 0123456789";

    for( var i=0; i < (Math.random() * (sampleData[1]-sampleData[0])) + sampleData[0]; i++ )
        text += possible.charAt(Math.floor(Math.random() * possible.length));

    return text;
}

function shuffle(arr) {
    var len = arr.length;
    var i = len;
    while (i--) {
        var p = parseInt(Math.random()*len);
        var t = arr[i];
        arr[i] = arr[p];
        arr[p] = t;
    }
    return arr;
};

///

var $targetDiv = $('#targetDiv');
var targetDiv = document.getElementById('targetDiv');

///

function jq() {

    var html = [];
    var count = 0;

    for (var key in testData) {
        count += testData[key].length;
        html.push('<div>' + testData[key] + '</div>');
    }

    $targetDiv.html(html.join(''));

    return count;
}

function inner() {

    var html = [];
    var count = 0;

    for (var key in testData) {
        count += testData[key].length;
        html.push('<div>' + testData[key] + '</div>');
    }

    targetDiv.innerHTML = html.join('');

    return count;
}


function dom() {

    var root = document.createElement('div');
    var node;
    var count = 0;

    for (var key in testData) {
        count += testData[key].length;
        node = document.createElement('div');
        node.appendChild(document.createTextNode(testData[key]));
        root.appendChild(node);
    }
    targetDiv.appendChild(root);

    return count;            
}

///

jq.title = 'jQuery .html';
inner.title = 'innerHTML';
dom.title = 'DOM';

///

sample = [10, 100];
sampleData = [100, 1000];
generateTestData();

var duration = 1000;
var testFn = shuffle([jq, inner, dom]);

$.each(testFn, function(k, fn) {
    setTimeout(function() { runTest(fn, duration); }, 0);
});
​

总体而言,虽然每种方法在某些条件下(大量 或 少量数据、长 或 短字符串等)更有效,但 DOM 方法似乎通常更快在所有情况下。

所以,你有它。感谢 GGG 提供初始测试用例。

【讨论】:

  • 也许我读错了,但我不明白字符串连接后跟 innerHTML 之类的内容会比跳过字符串连接步骤并仅插入 DOM 元素更快...你有吗某种性能测试来支持这种说法,还是我误读了你?
  • 我也想问同样的问题?生病添加一些我目前正在做的示例代码。我在构建之前不会插入它
  • 每次将元素插入 DOM 时,文档都会被重新解析和重新索引。如果你使用一次innerHTML,这个过程只进行一次。
  • 除非您需要处理特定已创建元素的事件,否则无需为每个已创建元素创建 jQuery-object-wrapped 元素。
【解决方案2】:

在 javascript 中执行。如果您已经拥有 javascript 中的数据,那么额外前往服务器让 PHP 执行此操作(让 javascript 代理该连接)是一种浪费。如果是密集计算,考虑到速度,让 PHP 来做可能是有意义的,否则就显得浪费了。

【讨论】:

    【解决方案3】:

    您可以使用 JSON.stringify(array) 在 JavaScript 中对数组进行编码,然后使用 $array=json_decode($_POST['jsondata']);在您的 PHP 脚本中检索它。

    【讨论】:

    • 这样你应该去 jqeury .append() 或 .html() 或者你可以简单地在javascript中创建html字符串并将它传递给你的html页面
    猜你喜欢
    • 2011-01-14
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 2015-05-25
    • 1970-01-01
    相关资源
    最近更新 更多