Find()的Javascript代码优化

我有c#代码在SQL中运行查询并返回大约2000行。 然后创建Treeview控件并添加我的主页面。 这几乎是立即完成的,这很好。

var orgId = $('select[name="ctl00$PageContent$FunctionsDropDownList"] option:selected').val(); if (!orgId) { return false; } //calls serverside get data //This line happens quickly $('#ctl00_PageContent_HiddenRulesDialogTriggerButton').click(); //This part takes about 10-15 minutes to finally get to the true var i = setInterval(function () { if ($('#ctl00_PageContent_treeview').find('table').length > 0) { clearInterval(i); StartDialog(); return false; } }); 

所以打到clearInterval(i)需要大约10-15分钟。 当它发生时, i = 978 。 不知道为什么需要这么长时间。 可能find()非常慢。 有没有人推荐替代品?

编辑

Internet Explorer的版本

问题可能是你在没有第二个参数的情况下调用setInterval(时间间隔)

让我们来看看你的代码似乎在做什么。

  1. 查询后端,提取构建树视图所需的数据。 这很快完成。
  2. 异步构建树。
  3. 树正在构建时,继续使用find()进行检查以查看它是否已准备就绪。

几个问题。

  1. 与非DOM数据操作相比,所有DOM查询都相当慢。 所以是的,find()不是最快的函数,因为它从您指定的父对象开始搜索整个DOM并返回它找到的对象。
  2. 如果你只使用一个参数运行setInterval:

码:

 var timer_id = setInterval(function() { ...code here... }); 

……我认为它每毫秒执行一次。 我用这段代码测试了这个:

 var k = 1; var i = setInterval(function () { if (k < 100) { k += 1; } else { clearInterval(i); window.alert('Finished!'); } //No second argument }); 

......它几乎立即完成。

所以我猜它变得如此缓慢,因为该程序每秒数百次触发昂贵的DOM搜索。 解决方案是:

  1. 提供在树构建结束时执行任何操作的函数作为异步构建函数的回调。 这样您就无需检查。
  2. 尝试为setInterval提供一个时间间隔,看看它是否通过释放程序来构建树而不是重复检查来解决您的问题:

码:

 var i = setInterval(function () { if ($('#ctl00_PageContent_treeview').find('table').length > 0) { clearInterval(i); StartDialog(); return false; } //Once per second },1000); 

回调可能是更好的做法,但提供时间间隔也可能有效。

尝试使用.one()DOMNodeInserted事件,将事件委托给document

 function StartDialog(el) { console.log(el) } $(document) .one("DOMNodeInserted" , "#ctl00_PageContent_treeview table" , function(e) { StartDialog(this) }); $("#ctl00_PageContent_treeview").append("
")