放置在interval / timeout函数中时,jQuery eventData未定义

时间:2014-08-02 21:40:16

标签: jquery events handler setinterval

编辑:请参阅评论,了解我不知道如何在基本级别使用事件(以及答案)

我觉得这应该是一个简单的解决办法,但过去一小时我一直在扯掉它。

我有一个看起来像这样的函数:

$(document).ready(function() {
    $("#score svg").mousedown(event.data, scoreDrag);
});

完美无缺,事件已定义。

但是我不希望在不同的脚本(在此之前定义)中的某个函数完成#score

中的所有SVG之前分配处理程序

所以我所做的是在脚本中定义一个全局变量,使得SVG(SVGloaded)在完成所有SVGS之前不成立 - 一个là:

var isSVGloaded;

$(document).ready(function() {
    isSVGloaded = window.setInterval(function() {
        if (SVGloaded) {
            $("#score svg").mousedown(event.data, scoreDrag);
            window.clearInterval(isSVGloaded);
        }
    }, 100);
});

其中,不起作用 - 事件未定义。

我在实际脚本中的模块全局函数中有上面的代码,但我认为这与它没有任何关系。

2 个答案:

答案 0 :(得分:1)

当你在第一个例子中使用event时,你可能指的是window.event,它在某些浏览器中分配给最后一个被引发的事件:

http://www.quirksmode.org/js/events_access.html

正如评论中所提到的,你可能不应该依赖它,因为它是非标准的,(恕我直言)超级混乱。

无论如何,在您的第一种情况下,window.event将是jQuery响应的ready事件,而不是您可能想要处理的click事件(http://jsfiddle.net/XLhL9/1/

如果你处于setInterval回调状态,那么看起来根本没有定义window.event,大概是因为浏览器当前没有处理事件。您可以在http://jsfiddle.net/ujR5p/中看到这一点。

如果确实希望访问ready回调中的setInterval事件,那么诀窍就是在{{1}内获取window.event的值回调,将其分配给变量,然后在超时回调中引用该变量:

ready

但听起来你真正想要的是$(document).ready(function() { // event is defined here, so assign it to a variable var theEvent = event; isSVGloaded = window.setInterval(function() { if (SVGloaded) { // event is no longer defined, but theEvent still is: $("#score svg").mousedown(theEvent.data, scoreDrag); window.clearInterval(isSVGloaded); } }, 100); }); 事件。幸运的是,jQuery让这个超级容易访问:

mousedown

您是否可以通过在load上执行此代码而不是准备好来避免此var scoreDrag = function (eventObject) { // jQuery will pass the `mousedown` event in as `eventObject` // see http://api.jquery.com/mousedown/#mousedown-handler alert('X: ' + eventObject.pageX + ' Y: ' + eventObject.pageY); }; ?或者通过提出自定义事件?

答案 1 :(得分:0)

'确定您的第一个脚本不起作用

$(document).ready(function() {
    $("#score svg").mousedown(event.data, scoreDrag);
});

也许你的意思是这样的:

$(document).ready(function() {
    $("#score svg").mousedown(
          function(event){
              alert('Mouse down');
          }
    );
});