【问题标题】:How to check if an event handler exist using jQuery or JS?如何使用 jQuery 或 JS 检查事件处理程序是否存在?
【发布时间】:2010-10-09 22:05:08
【问题描述】:

我想在绑定一个函数之前检查一个事件是否可用。 问题是 Google Chrome 支持 Video 元素中的事件“loadedmetadata”,而 FireFox 不支持。

我做了以下

$('video').bind('loadedmetadata', videoloaded);
videoloaded();

它在 Firefox 中运行良好,但是当我在 Chrome 中尝试时,该函数执行了两次(这是合乎逻辑的)。我想检查loadedmetadata 事件处理程序是否存在,以便在每个浏览器中只运行一次该函数。

如果这种可能性不存在,有什么聪明的办法可以解决这个问题吗?

【问题讨论】:

    标签: javascript jquery events browser


    【解决方案1】:

    如果此对象包含您的事件,请检查$video.data("events"),因为您使用的是.bind,此元素的所有事件都将存储在此对象中。

    var $video = $("#video");
    var $ve = $video.data("events");
    
    // checking if a `loadedmetadata` object exists in `data("events")`
    if ($ve != null && typeof($ve.loadedmetadata) !== undefined)
    {
        // has loadedmetadata event
    }
    

    完整的工作example on jsFiddle

    【讨论】:

    • @Bruno - 我现在比刚开始时更加困惑:(
    • @Peter:假设他一直使用 jQuery 来绑定事件,这意味着所有的事件处理程序都存储在element.data("events") 上。它是一个包含多个对象的对象,其中包含有关事件的信息。例如一个元素上的事件xelement.data("events") 将返回:({x:[{handler:(function () {}), data:(void 0), namespace:"", type:"x", guid:31}]})
    • 谢谢 Bruon,我得再研究一下。
    • 它不起作用,至少在 FireFox 中是这样,因为即使事件不存在(浏览器未实现)它也会被绑定并添加到该事件对象中。所以它会给出错误的结果。不过,我已经找到了一种方法,使用 readyState 属性。感谢您的意见。
    • @Omar: loadmetadata 不是标准事件 w3schools.com/tags/ref_eventattributes.asp 。我虽然你正在绑定一个自定义事件:api.jquery.com/bind
    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2013-03-05
    相关资源
    最近更新 更多