大家。 Chrome存在问题(我不知道其他浏览器是否也会出现这种情况)。情况是有一个几年前的网站。是用标准JavaScript开发的,而不是jQuery。有数千条代码行,因此现在更新它不是一种选择。
问题是,这会从服务器上的数据库中读取数据,该数据库返回10行,有时超过500行。这是正常操作。在任何情况下,请求都是通过简单的AJAX完成的,它返回一个XML。数据库在不到一秒的时间内响应,XML的格式也是一秒钟,也许是在缓慢的一天。但是当JavaScript收到它时,那就是问题所在。使用XML中的10个元素没有问题,但是当它为500时,我想要自杀。
经过几天的调试并试图找到问题,我终于做到了,但不知道如何修复它。问题是,当XML返回时,每个元素都以简单的<table>
显示,这意味着每个节点基本上都是<tr>
,每个节点的子节点都是<td>
和<input type="text">
。最后,无论它有多少行,该表都有7列。
所以这是一个例子。它只是遍历节点并使用输入字段创建行和单元格:
var table = document.getElementById("theTable");
for (var i = 0; i < theXML.childNodes.length; i++)
{
var row = table.insertRow(table.rows.length);
row.style.backgroundColor = "Red";
for (var j = 0; j < theXML.childNodes[i].childNodes.length; j++)
{
var cell = row.insertCell(row.cells.length);
cell.width = "200px";
cell.className = "cellClass";
var d = document.createElement("input")
d.type = "text";
d.width = "190px";
cell.appendChild(d);
}
}
现在,问题
代码执行它应该执行的操作,使用正确的行,列和输入创建表,但每次通过宽度,appendChild,className或其他属性设置时,Chrome都会调用{{ 1}}事件,它首先在content.js文件中的DOMSubtreeModified
函数中定义(不属于我的项目,因此它最多是Chrome的)。该事件调用Startup()
函数,该函数接收onDomChange
作为参数,该函数仅调用document
并向其发送调用updateDocumentListeners
的参数,该参数遍历每个单个输入文档使用updateInputListeners
,只是为了调用for()
,只会根据某些条件返回true或false。
现在,当只有10行时,这意味着最终我们将有70个输入,这意味着到最后它会多次调用updateInputListeners
,即:70 + 69 + 68 + ....,因为它经历了之前添加的所有内容。而且这也会与您设置的每个属性相乘。
换句话说,每创建一个输入,它就会调用onDomChange
。在我设置的每个属性上,它调用onDomChange
。如果我添加第二个输入,它会两次,一次是元素和/或我正在设置的属性,另一个是前一个。这是它的作用:
onDomChange
有500个输入,也就是500个单元,它根本就不会结束。哦,如果已有其他输入(包括隐藏类型,无线电等),它们将包含在循环中。然后Chrome有胆量发送一条消息,其中包含一个选项,告诉我它耗时太长,并提示我是否要等待或取消。
我尝试了什么
因为这一切都是因为事件而发生的,所以我试图删除它,处理表然后恢复它,但是我无法删除它,因为它在content.js中被声明为这样
//This is the code I found while debugging
function updateDocumentListeners(document)
{
var inputs = document.getElementsByTagName('INPUT');
for (var i = 0; i < inputs.length; ++i)
updateInputListeners(inputs[i]);
}
这意味着我不能使用removeEventListener,因为它被定义为匿名函数。我已经尝试过了。
有什么建议吗?
感谢。