在一个库被添加/下载并以承诺的方式执行后,是DOM中的元素
Is Element in DOM after a lib is added / downloaded and executed, the promise way
想象一下:您正在向DOM动态插入一个脚本并执行它。这个脚本可能会插入一些DOM节点。没有办法查明这个特定的元素是否被添加到DOM中。请看下面的代码:
功能:
testIfElemIsInDom : function(elem){
return $.Deferred(function(def){
// TEST MAX 20 TIMES IF THE ELEM IS IN THE DOM
var maxTryes=20,
actTryes=0;
// ANOYNMOUS FUNCTION TO CALL IT SELF
(function _find(){
// IS ELEM IN THE DOME AND DID WE REACHED MAX TRYES?
if ($(elem).length===0 && actTryes<=maxTryes){
ysHelper.wait("100").then(function(){
actTryes++;
_find(elem);
});
}else{
// IF THE ELEM IS IN THE DOM AND MAX TRYES ARE NOT REACHED - RESOLVE THE DEFERRER
if (actTryes<maxTryes) {
def.resolve();
}else{
return false;
}
}
}());
});
}
函数调用:
ysHelper.testIfElemIsInDom("div#element").then(function(){
// do stuff
});
你认为有什么方法可以改进这个功能吗?我真的不喜欢20次尝试的事情,但是如果其他人做错了,函数就不能无休止地运行…
ysHelper。wait函数只是一个setTimeout,用promise完成…
用例对我来说是:我添加了一个jquery插件,让它下载,执行和测试如果元素(这是由jquery插件创建的)是在DOM中,然后显示一个div与生成的内容…
有什么方法可以改进这个函数吗?
return false
在异步函数中没有任何意义。相反,你应该拒绝这个承诺。
同样,既然你已经习惯地将超时包装在承诺中,那么就没有理由再使用另一个延迟的超时。你所要做的就是承诺链接,这将导致一个更简洁、更实用、递归的方法:
testIfElemIsInDom: function(sel, maxTries) {
if (typeof maxTries != "number") maxTries = 20;
var elem = $(sel);
if (elem.length)
return $.when(elem);
else if (maxTries <= 0)
return $.Deferred().reject(sel+" was not found");
else
return ysHelper.wait("100").then(function() {
return ysHelper.testIfElemIsInDom(sel, maxTries-1);
});
}
相关文章:
- 我想以异步方式执行常规函数
- 当以编程方式更改输入值时,不会执行更改时事件
- Javascript - 以编程方式执行所有函数输入的方法
- 如何使用cURL或其他方式在点击时执行事件
- Turbolinks:body标记中的javascript代码没有按应有的方式执行
- 如何在CKEDITOR中以编程方式执行undo和redo,并重置它们的堆栈
- Javascript数学不起作用,更好的方式来执行操作
- 如何在Ember中以编程方式执行ArrayController[index]
- 以编程方式打开火狐浏览器并执行 POST 请求?[想法:MozRepl,建议?
- 如何以编程方式在URL上执行javascript
- 在 Mac 上的 Firebug 中继续执行脚本的快捷方式是什么?
- 执行JavaScript代码的不同方式
- Javascript Jquery在外部样式表更改/重新加载承诺方式后执行代码
- 如何以编程方式阻止/执行JavaScript块
- 删除对象时执行元素指令动画的角度方式
- 只在特定页面上执行js的最佳方式
- jquery的执行方式不正确
- 为什么原型链的执行方式不同
- 代码的执行方式
- 在GridView TemplateField TextBox中,回车键的执行方式与选项卡类似