【问题标题】:Is there a jQuery equivalent to prototype's defer?是否有与原型的延迟等效的 jQuery?
【发布时间】:2010-09-01 09:49:51
【问题描述】:

有 jQuery 等价于原型的 defer 吗?

我正在寻找可以延迟脚本执行直到页面中的所有脚本都执行完毕的东西。

谢谢!


第二部分: 有什么方法可以查看队列中是否还有其他 setTimeouts 并将执行延迟到它们触发之后​​?我在 cmets 中看到,有时 setTimeout 为 0 或 1 并不重要,因为无法预测哪个会先触发。

再次感谢!

更新回答

我从下面接受的答案中发现了我正在使用的代码中的一个错误。切片调用需要在 0 上工作,而不是 1,因为在 Prototype 核心代码中,它接受一个额外的参数来表示等待的时间量 (0.01)。那么最后的方法就变成了:

Function.prototype.deferFunc = function() {
   var __method = this, args = Array.prototype.slice.call(arguments, 0);
   return window.setTimeout(function() {
      return __method.apply(__method, args);
   }, 0.01);
}

【问题讨论】:

  • 我不确定您指的是哪个defer?我知道的唯一一个不是 Prototype 特有的。
  • 啊,我猜你的意思是这个。 prototypejs.org/api/function/defer
  • 对,我指的是js库原型。

标签: javascript jquery prototypejs


【解决方案1】:

您可以将 vanilla JavaScript 中可用的基本版本用于大多数用途,setTimeout()

setTimeout(function() {
  //do something
}, 0);

jQuery 用于动画的类似排队机制是回调和.delay() 函数(它在下面使用setTimeout())。

【讨论】:

  • +1 用于香草 JS。唯一的区别是 defer() 可以接受变量作为将存储在当前状态的参数,有点像 setTimeout()bind 的组合().
【解决方案2】:

defer 所做的只是执行window.setTimeout 内部的函数,超时时间为 0。

我相信你可以这样实现它:

Function.prototype.defer = function() {
        var __method = this, args = Array.prototype.slice.call(arguments, 1);
        return window.setTimeout(function() {
          return __method.apply(__method, args);
        }, 0);
      }

Demo

【讨论】:

  • 我决定采用这个实现,因为它可以接受带参数的方法。它似乎也最接近原型(库)使用的实现。非常感谢!!!!
  • 顺便说一句,我还想确认您确实需要上面 Andy E 建议的更改!
  • 当我尝试这个时,我得到一个错误,上面写着:Uncaught TypeError: Object [object DOMWindow] has no method 'apply'(这是使用 Strelok 的代码和 Andy 的更改)。有什么建议吗?
【解决方案3】:

您可以轻松实现它:

Function.prototype.defer=function() {
    setTimeout(this, 0);
}

这是一个测试:

var testFunc=function() {
    alert('first');
}
testFunc.defer();
alert('second');//first the browser will run this line, then will execute the above defered one.

【讨论】:

  • 设置定时器为1不会将回调添加到线程队列,直到1ms后,设置定时器为0将立即添加到线程队列。
  • 不正确 Andy E,所有浏览器都有不同的最小超时限制,此外,超时永远不会准确,因为它会等待任何正在执行的脚本,直到有一个开口。
  • @BGerrissen - @Andy 是正确的,例如在 IE 中试试这个:jsfiddle.net/nick_craver/QJdEg 注意setTimeout(func, 1)setTimeout(func, 0) 之后排队,因此将其设置为1 不一样,因为超时 0 仍然可以跳到前面,具体取决于浏览器。
  • Prototype 在内部实际上使用了 10ms,而不是 0。他们的文档有点误导。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 2010-09-22
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多