防止Chrome中的DOMSubtreeModified事件触发JS

时间:2017-08-22 22:52:40

标签: javascript google-chrome

大家。 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,因为它被定义为匿名函数。我已经尝试过了。

有什么建议吗?

感谢。

0 个答案:

没有答案