2009-12-24 231 views
1

我想使用AJAX将htmlfile加载到<div>然后我需要在此上运行jsMath。我用innerHTML完成的所有事情都是一两段,也许是一张表格和/或图片。没什么太花哨。innerHTML大小限制

当我将innerHTML设置为外部25k文件时,可能会发生什么样的潜在问题,以及各种复杂的css格式? (感谢jsMath)我想不出任何其他方法做这件事,但需要知道是否有任何限制。

在此先感谢。

--Dave

+1

提醒一下,你应该接受你的问题的答案。这是SO方式。 – 2010-01-13 02:36:28

回答

1

没有什么可以阻止您在技术上做到这一点。最大的问题将是页面加载时间。确保包含某种数据正在加载的指示,或者看起来没有任何事情发生。

1

在我目前正在使用的应用程序中,我没有任何问题在任何浏览器将innerHTML设置为30k或更多的字符串。 (不知道限制是什么)

0

这种类型的东西的唯一限制是纯粹的带宽和处理器相关。您应该确保您的ajax请求没有设置较低的超时时间。您还应该测试一些速度较低的计算机以查看是否存在内存问题。一些旧的浏览器可能对内存中的大型对象非常宽容。

0

您可能想要使用类似dynatrace ajaxspeed tracer这样的工具来分析此问题,以了解如何将innerHTML设置为真正巨大的值以影响性能。您可能想要将其与另一种方法比较,如将新内容放入iframe中,或对内容进行分页。

+0

我没有想到本身我使用AJAX来决定第6章审查,第7章审查等,但我没有想过将每个审查分裂。谢谢 – 2009-12-24 04:41:57

0

您的限制很可能是从您的Web服务器设置的下载限制。通常是几MB。几个Web框架允许增加这个大小,但你不能这样做,因为这意味着增加缓冲区大小,这不是一件好事。

1

我不知道任何浏览器特定的大小限制,但是如果您分配的字符串长度超过65536,Chrome会将其分割成多个elem.childNodes,因此您可能必须遍历这些节点并将它们连接起来。

在Chrome开发工具中运行以下内容。它构造一个160 k字符串,但theDivElement.childNodes[0]被剪辑为65536个字符。

var longString = '1234567890'; 
for (var i = 0; i < 14; ++i) { 
    longString = longString + longString; 
} 
console.log('The length of our long string: ' + longString.length); 
var elem = document.createElement('div'); 
elem.innerHTML = longString; 
var innerHtmlValue = elem.childNodes[0].nodeValue; 
console.log('The length as innerHTML-childNodes[0]: ' + innerHtmlValue.length); 
console.log('Num child nodes: ' + elem.childNodes.length); 

结果:(Chrome版本39.0.2171.95(64位),Linux Mint的17)

The length of our long string: 163840 
The length as innerHTML-childNodes[0]: 65536 
Num child nodes: 3 

,但在Firefox innerHTML内容不分割成许多节点:(FF版本34.0 ,Linux Mint的17)

"The length of our long string: 163840" 
"The length as innerHTML-childNodes[0]: 163840" 
"Num child nodes: 1" 

所以,你需要考虑到不同的浏览器处理childNodes不同,或许遍历所有子节点并连接。 (我注意到这一点,因为我试图用innerHTML到反转义一> 100k的HTML编码的字符串。)

事实上,在Firefox我可以通过循环到上述i < 24创建长度167 772 160的innerHTML-childNodes[0]。但是在这个长度以上的地方,有一个InternalError: allocation size overflow错误。