JavaScript代码崩溃iOS Safari

时间:2011-12-31 15:51:57

标签: javascript json list sencha-touch

我正在编写一个Sencha Touch应用程序,用户将以JSON格式下载5000条记录,并使用它们来填充Ext.List控件。该应用程序下载记录正常,因为我只是使用JSON.parse(...),然后使用本地存储库将此数据添加到列表中。

当我尝试查看列表时,应用程序崩溃并且在Chrome上它会滞后很多。我想可能有些东西我搞乱了代码但是当我尝试使用这个小提琴http://jsfiddle.net/Z8GVm/1/进行iOS测试时,它会让Safari无法响应。难道我不应该用JavaScript在iOS Safari中保存那么多数据吗?如果这是真的,我得到一个论点,即网络仍然不成熟,因为它假设它可以完成本机应用程序可以做的所有事情。

尝试使用chrome http://senchafiddle.com/#gxtZ9 试试iOS Safari http://jsfiddle.net/Z8GVm/1/

1 个答案:

答案 0 :(得分:3)

这可能是连续处理的数据太多而没有让浏览器有任何周期而且移动浏览器认为javascript没有响应。在我的四核桌面上处理甚至需要几秒钟。

您可以将其分成块,并在每个块之间给浏览器一个呼吸(setTimeout)。在这里演示:http://jsfiddle.net/jfriend00/XFgAa/。请注意,这比在每行上使用document.write()的先前版本快几倍,因为这会累积一个对象的数据,并在一个DOM操作中一次性添加所有数据,因此这个新版本的数量是DOM操作。

function addBigData() {
    // populate big array
    var items = [], i;
    for (i = 0; i < 5000; i++) {
        var data = {};
        for (var j = 1; j <= 8; j++) {
            data["prop" + j] = "Some Big Data " + j;
        }

        var item = {};
        item.data = data;

        items.push(item);
    }

    i = 0;
    function addNextChunk() {
        var chunkEnd = Math.min(i + 20, items.length);
        var chunk = [], item;
        while (i < chunkEnd) {
            item = items[i++];
            chunk.push("Item " + i);
            chunk.push("<br />");
            for (var prop in item.data) {
                chunk.push("&nbsp;&nbsp;&nbsp;");
                chunk.push(prop + " = " + item.data[prop]);
                chunk.push("<br />");
            }

            chunk.push("<br /><br />");
        }
        var div = document.createElement("div");
        div.innerHTML = chunk.join("");
        document.body.appendChild(div);
        if (i < items.length) {
            setTimeout(addNextChunk, 1);
        }
    }

    addNextChunk();
}

addBigData();

仅供参考,在移动浏览器中,您可以比使用桌面浏览器更快地获得可用内存或本地存储的限制,因此您不应该将大量数据放入页面甚至本地存储中。