检测对给定JavaScript事件的支持?

时间:2010-05-20 20:04:15

标签: javascript javascript-events progressive-enhancement

我有兴趣使用JavaScript hashchange事件来监视URL片段标识符的更改。我知道Really Simple History和jQuery插件。但是,我得出的结论是,在我的特定项目中,另一个JS文件的额外开销并不值得。

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

那么,呃......有没有办法测试浏览器是否支持特定事件?

感谢。

3 个答案:

答案 0 :(得分:27)

嗯,最好的方法不是通过浏览器嗅探,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

在这里阅读更多内容:

答案 1 :(得分:15)

Mozilla documentation表明以下内容:

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

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

答案 2 :(得分:0)

以下是对answer provided by 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;
}