【问题标题】:jQuery eventData undefined when placed in interval/timeout function放置在间隔/超时函数中时的jQuery eventData未定义
【发布时间】:2014-08-02 21:40:16
【问题描述】:

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

我觉得这应该是一个容易解决的问题,但在过去的一个小时里我一直在努力解决这个问题。

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

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

工作得很好,事件被定义了。

但我不希望在其他脚本中的某个函数(在此脚本之前定义)完成所有 SVG 的制作完成之前分配处理程序

所以我所做的是在脚本中定义一个全局变量,该变量会生成 SVG(已加载 SVG),直到它完成所有 SVGS 的生成 - 一个 là:

var isSVGloaded;

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

哪个,不起作用 - 未定义事件。

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

【问题讨论】:

  • 看起来您依赖于某些浏览器中可用的全局事件对象,但您不应该这样做,为什么要以这种方式将它传递给事件处理程序?

标签: jquery events handler setinterval


【解决方案1】:

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

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

正如 cmets 中所述,您可能不应该依赖它,因为它是非标准的并且(恕我直言)超级令人困惑。

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

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

如果您真的想在setInterval 回调中访问ready 事件,诀窍是在ready 回调中获取window.event 的值,将其分配给变量,然后在超时回调中引用该变量:

$(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);
});

但听起来你真正想要的是mousedown 事件。幸运的是,jQuery 让这个超级容易访问:

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);
};

您是否可以通过在load 上执行此代码而不是准备好来避免此setInterval?还是通过引发自定义事件?

【讨论】:

  • 是的!我怎么会如此天真——超出了我的想象。让这成为所有不了解事件处理的新生程序员的一个教训,而耐心的陌生人可以并且将在互联网上帮助他们。谢谢。
  • 别担心!您在那里误入了一些非常令人困惑的浏览器行为。你真的需要event.data吗?如果您没有在 scoreDrag 中使用它,只需省略它并调用 $("#score svg").mousedown(scoreDrag);
  • 我不太确定。省略 event.data 参数对处理程序功能没有影响。但我确实需要知道事件的坐标以及鼠标按下时是否按下了 cmd/ctrl 键。所以看起来不,我不需要访问 event.data。
  • 啊,在我的示例中,eventready 事件,而不是点击事件。点击事件将由jQuery作为第一个参数传递给scoreDrag。根本不需要接触全球event。我将编辑我的答案以明确这一点。
  • 好的。我的大问题是我试图在我的mousedown 处理程序中传递未定义的全局event 对象 - 所以处理程序没有被分配。但现在已经不碍事了,事情就顺利多了。
【解决方案2】:

我确信你的第一个脚本不起作用

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

也许你的意思是这样的:

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

【讨论】:

  • 我认为第一个 工作(它会调用 mousedown([eventData], handler)event.data 碰巧是什么),但它可能没有做 OP 想要的。跨度>
  • 是的,可能是 - 但 event 似乎是 undefined。就像你在回答中写的:window.event 可以在 IE 中定义
  • 是的,听起来像window.event 应该完全避免。我想所有在浏览器中开发的乐趣。
猜你喜欢
  • 2017-06-25
  • 2011-03-24
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多