我将从问题开始。当特定的浏览器具有某个功能的错误实现,并且您的JavaScript需要知道当前浏览器是否具有该错误的实现,以便可以使用其他策略时,如何在不进行浏览器类型嗅探的情况下确定该实现是否存在错误(通常认为是不好的)?

这是整个情况。

我正在编写一些代码,这些代码想使用"input" event来获取用户对<input type="text">字段所做的更改的通知(比“change”事件更有效地工作),但是当不支持该事件时,它将使用更加复杂的代码涉及许多其他事件的计划。

由于“输入”事件仅在某些浏览器中受支持,因此我一直在寻找一种对该事件进行特征检测的方法(而不是浏览器用户代理嗅探),因为特征检测通常是一种更可靠的处理方法。因此,我碰巧遇到了this great article,此代码似乎有效:

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声称支持“input”事件,并且它通过了上面的功能测试并且在大多数情况下都有效,但是IE的支持却像 hell 般。当用户按下Backspace键(以及其他丢失的行为)时,它甚至不会触发事件。因此,我不能在IE中依赖它。因此,我构建了一个很好的干净代码,对“input”事件进行了功能测试,并使用了非常干净的实现(存在时),而当不存在时,则使用了涉及监视八个其他事件的较丑陋的解决方法。现在,它已在IE中崩溃,因为针对“输入”事件的功能测试通过了,因此代码尝试使用它,但是它像 hell 般充满了虫子,因此无法正常工作。

由于这些IE错误会在用户操作中显示,因此我想不出任何方法来设计JavaScript功能测试来识别错误行为。这样,我当前的唯一途径是诉诸于浏览器嗅探,如果浏览器是IE,则拒绝依赖“input”标签。

除了浏览器嗅探之外,这里是否还有其他选项可用于识别“输入”事件中的错误行为?如果必须进行浏览器嗅探,是否有一种方法可以通过行为来识别IE,而不是可以自由地欺骗并且不能保证准确的用户代理字符串?

最佳答案

杰米·佩特(Jamie-pate)建议这样的事情:

   var broken = false,
        ta = angular.element('<textarea>').on('input', function(evt) {
            broken = true;
        });
    ta.attr('placeholder', 'IESUCKS');

因此,您可以在代码中检查“是否支持输入事件并且未中断”。

参见https://github.com/angular/angular.js/issues/2614?source=c

07-24 09:37
查看更多