27

我有兴趣使用 JavaScript hashchange 事件来监控 URL 片段标识符的变化。我知道真正简单的历史和为此的 jQuery 插件。但是,我得出的结论是,在我的特定项目中,增加另一个 JS 文件的开销并不值得。

我想做的是走“渐进式增强”路线。也就是说,我想测试访问者的浏览器是否支持 hashchange 事件,并编写我的代码以使用它(如果它可用),作为增强而不是核心功能。IE 8、Firefox 3.6 和 Chrome 4.1.249 都支持它,这约占我网站流量的 20%。

那么,呃……有什么方法可以测试浏览器是否支持特定事件?

4

4 回答 4

33

好吧,最好的方法不是通过浏览器嗅探,Juriy Zaytsev ( @kangax ) 提出了一个非常有用的方法来检测事件支持:

var isEventSupported = (function(){
  var TAGNAMES = {
    'select':'input','change':'input',
    'submit':'form','reset':'form',
    'error':'img','load':'img','abort':'img'
  }
  function isEventSupported(eventName) {
    var el = document.createElement(TAGNAMES[eventName] || 'div');
    eventName = 'on' + eventName;
    var isSupported = (eventName in el);
    if (!isSupported) {
      el.setAttribute(eventName, 'return;');
      isSupported = typeof el[eventName] == 'function';
    }
    el = null;
    return isSupported;
  }
  return isEventSupported;
})();

用法:

if (isEventSupported('hashchange')) {
  //...
}

这种技术现在在一些库中使用,比如jQuery

在这里阅读更多:

于 2010-05-20T20:10:08.950 回答
24

Mozilla 文档建议如下:

if ("onhashchange" in window) {
    alert("The browser supports the hashchange event!");
}

这也适用于 IE8 和 Chrome 5 beta(我没有测试 Chrome 4.1),并且在 Opera 和 Safari 中正确失败。

于 2010-05-20T20:17:59.410 回答
0

这是对CMS 提供的答案的修改,它不包含另一个函数,我认为它会起作用:

function event_exists(eventName){
    if(typeof(eventName)!='string' || eventName.length==0)return false;
    var TAGNAMES = {
        'select':'input','change':'input',
        'submit':'form','reset':'form',
        'error':'img','load':'img','abort':'img'
    }
    var el = document.createElement(TAGNAMES[eventName] || 'div');
    eventName = 'on' + eventName;
    var isSupported = (eventName in el);
    if (!isSupported) {
        el.setAttribute(eventName,'return;');
        isSupported = (typeof(el[eventName])=='function');
    }
    el = null;
    return isSupported;
}
于 2014-09-30T15:34:03.410 回答
0

我认为最简单的解决方案是只typeof检查事件类。

例如:在 Chrome 和Internet Explorer 中typeof(InputEvent)返回。"function""undefined"

于 2021-11-08T22:22:20.627 回答