这个Prototype的端口是否正确?

时间:2010-02-09 22:30:15

标签: javascript jquery prototypejs

如果用户闲置了一段时间,我们会运行代码。 (doStuff重置倒计时)

原型中的现有代码:

Event.observe(window, 'mousemove', function() { doStuff(); });
Event.observe(window, 'scroll', function() { doStuff(); });
Event.observe(window, 'click', function() { doStuff(); });
Event.observe(window, 'focus', function() { doStuff(); });
Event.observe(window, 'blur', function() { doStuff(); });
Event.observe(window, 'keypress', function() { doStuff(); });

Event.observe(document, 'mousemove', function() { doStuff(); });
Event.observe(document, 'scroll', function() { doStuff(); });
Event.observe(document, 'click', function() { doStuff(); });
Event.observe(document, 'focus', function() { doStuff(); });
Event.observe(document, 'blur', function() { doStuff(); });
Event.observe(document, 'keypress', function() { doStuff(); });

我希望用这个JQuery替换它:

 $(document).ready(function() {
     $(document).bind("mousemove scroll click focus blur keypress", doStuff);
 });

它检查我何时测试它,但是任何人都可以确认我不需要进行文档/窗口检查,或者我没有忽略其他任何东西?感谢。

2 个答案:

答案 0 :(得分:15)

关闭,这是一个完整的端口(添加window),不需要文档就绪测试:

 $([document, window]).bind("mousemove scroll click focus blur keypress", doStuff);

您可以将数组传递给jQuery函数,因此您设置的内容适用于多个项目。在这种情况下,您已经引用了windowdocument。这是你在一次通话中如何做到的。

但是,我不认为需要所有原始的Prototype代码。例如,focusblur不适用于documentclickmousemovekeypress不需要{window 1}}。

这可能更符合您的要求:

$(window).bind("focus blur scroll", doStuff);
$(document).bind("click mousemove keypress scroll", doStuff);

DOM Ready not needed :不需要DOM就绪测试,因为您已经可以立即访问documentwindow。等待DOM准备就绪是不必要的。

答案 1 :(得分:1)

原型代码至少可以说是非最佳的,而不是与Prototype相关的任何原因。

除了放弃window之外,你的重写看起来还不错。如果不挂钩window上的事件在jQuery中有效,它在Prototype中有效。

Prototype中的类似重写做出了类似的假设(但包括window):

$w('mousemove scroll click focus blur keypress').each(function(evtname) {
    document.observe(evtname, doStuff);
    Event.observe(window, evtname, doStuff);
});

......我发现即使这比实际需要的更冗长也不会感到惊讶。