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()
非常慢。 有没有人推荐替代品?
编辑
问题可能是你在没有第二个参数的情况下调用setInterval(时间间隔)
让我们来看看你的代码似乎在做什么。
- 查询后端,提取构建树视图所需的数据。 这很快完成。
- 异步构建树。
- 树正在构建时,继续使用find()进行检查以查看它是否已准备就绪。
几个问题。
- 与非DOM数据操作相比,所有DOM查询都相当慢。 所以是的,find()不是最快的函数,因为它从您指定的父对象开始搜索整个DOM并返回它找到的对象。
- 如果你只使用一个参数运行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搜索。 解决方案是:
- 提供在树构建结束时执行任何操作的函数作为异步构建函数的回调。 这样您就无需检查。
- 尝试为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("
")