我将从问题开始。当特定浏览器的某个功能的实现有错误,并且您的 JavaScript 需要知道当前浏览器是否有该有错误的实现,以便它可以使用替代策略时,如何在不进行浏览器类型嗅探的情况下确定该实现是否有错误(这通常被认为是不好的)?
整个情况是这样的。
我正在编写一些想要使用的代码“输入”事件 https://developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/input用于获取用户更改的通知<input type="text">
字段(比“更改”事件更加活跃),但是当不支持该事件时,它使用涉及一堆其他事件的更复杂的方案。
由于“输入”事件仅在某些浏览器中受支持,因此我开始寻找一种对该事件进行特征检测的方法(而不是浏览器用户代理嗅探),因为特征检测通常是一种更稳健的处理方式。因此,我遇到了这篇很棒的文章 http://perfectionkills.com/detecting-event-support-without-browser-sniffing/为了做到这一点,这段代码似乎有效:
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;
})();
然后,我遇到了 IE 的问题(惊讶,惊讶)。虽然 IE 声称支持“输入”事件,并且它通过了上面的功能测试并且在大多数情况下都可以工作,但 IE 的支持却存在很多问题。当用户按下退格键(以及其他缺失的行为)时,它甚至不会触发事件。因此,我不能在 IE 中依赖它。因此,我构建了这个漂亮干净的代码,对“输入”事件进行了功能测试,并在存在时使用非常干净的实现,在不存在时使用这种更丑陋的解决方法,涉及监视其他八个事件。现在,它在 IE 中被破坏了,因为“输入”事件的功能测试通过了,所以代码尝试使用它,但它有很多错误,所以它不起作用。
由于这些 IE 错误出现在用户操作中,我想不出任何方法来设计 javascript 功能测试来识别错误行为。因此,我当前唯一的途径是诉诸浏览器嗅探,并且如果浏览器是 IE,则拒绝依赖“input”标签。
除了浏览器嗅探之外,还有其他选项可以识别“输入”事件中的错误行为吗?如果必须进行浏览器嗅探,是否有一种方法可以通过行为来识别 IE,而不是通过可以自由欺骗且不能保证准确的用户代理字符串?