Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何识别“中的错误行为”;输入“;没有浏览器检测的事件?_Javascript_Events_Input_Browser Feature Detection - Fatal编程技术网

Javascript 如何识别“中的错误行为”;输入“;没有浏览器检测的事件?

Javascript 如何识别“中的错误行为”;输入“;没有浏览器检测的事件?,javascript,events,input,browser-feature-detection,Javascript,Events,Input,Browser Feature Detection,我将从这个问题开始。当一个特定的浏览器有一个功能的错误实现,并且您的javascript需要知道当前浏览器是否有该错误实现,以便它可以使用另一种策略时,您如何在不进行浏览器类型嗅探(通常认为是不好的)的情况下判断该实现是否有错误 整个情况是这样的 我正在编写一些代码,希望使用获取用户对字段的更改通知(比“更改”事件更活跃),但如果不支持该事件,它将使用涉及一系列其他事件的更复杂的方案 由于“输入”事件仅在某些浏览器中受支持,因此我一直在寻找一种方法来对事件进行功能检测(而不是浏览器用户代理嗅探)

我将从这个问题开始。当一个特定的浏览器有一个功能的错误实现,并且您的javascript需要知道当前浏览器是否有该错误实现,以便它可以使用另一种策略时,您如何在不进行浏览器类型嗅探(通常认为是不好的)的情况下判断该实现是否有错误

整个情况是这样的

我正在编写一些代码,希望使用获取用户对
字段的更改通知(比“更改”事件更活跃),但如果不支持该事件,它将使用涉及一系列其他事件的更复杂的方案

由于“输入”事件仅在某些浏览器中受支持,因此我一直在寻找一种方法来对事件进行功能检测(而不是浏览器用户代理嗅探),因为功能检测通常是一种更健壮的方法。因此,我正好做到了这一点,这段代码似乎很有效:

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中依赖它。因此,我构建了这个漂亮的干净代码,它对“input”事件进行了功能测试,并使用它非常干净的实现(当存在时)和(当不存在时)使用了更丑陋的工作,包括监视其他八个事件。现在,它在IE中被破坏了,因为“input”事件的特性测试通过了,所以代码试图使用它,但它的错误非常严重,因此无法工作

由于这些IE bug出现在用户操作上,我想不出任何方法来设计javascript特性测试来识别这些bug行为。因此,我目前唯一的途径是求助于浏览器嗅探,如果浏览器是IE,则拒绝依赖“输入”标记


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

如果您对跨浏览器“输入更改”事件感兴趣,下面是我的实现:

function onInputChange(domInput, callback) {
    if (domInput.addEventListener) {
        domInput.addEventListener('input', callback, false); // Firefox, etc.
    } else if (domInput.attachEvent) {
        domInput.attachEvent('onpropertychange', callback); // IE
    }
}

用法示例:

var leInput = document.getElementById('myInput');
var leCallback = function () {
    // awesome stuff here
};

onInputChange(leInput, leCallback);

适用于所有浏览器,支持键盘输入和复制/粘贴


然而,还有一个例外,那就是被诅咒的IE9,在我编写上述代码时它并不存在。微软会考虑修复他们的bug吗?p> jamie pate建议如下:

   var broken = false,
        ta = angular.element('<textarea>').on('input', function(evt) {
            broken = true;
        });
    ta.attr('placeholder', 'IESUCKS');
var breaked=false,
ta=角度元素(“”).on('input',函数(evt){
破碎=真实;
});
ta.attr('placeholder','IESUCKS');
因此,您可以在代码中检查“支持输入事件且未“损坏”


请参见

IE的一个优点(也许是唯一的?)是,您可以将IE特定的代码放在哪里来解决您的问题。不幸的是,IE中似乎没有一个好的替代品,所以即使你能检测到它,你也无能为力。Web开发人员很长一段时间都没有oninput,因此,如果您更新您的问题以说明您正在尝试做什么,可以提出替代方案。@RobG-我正在尝试实现一些动态行为,无论输入字段如何更改,都会做出响应。Web开发人员一直没有可靠的
输入
事件,只是接受了一个不完善的实现,在拖放或通过上下文菜单更改字段时不会触发该实现。我正在努力做得比以前更好。你能不能不使用
键下键
?我遗漏了什么吗?@Eric-
keydown
遗漏了用户更改输入字段的一系列方法,例如拖放、右键单击剪切/复制/粘贴。事实上,为了涵盖所有形式的用户更改,除了
keydown
之外,我还监视了6个其他事件。Thx,这与我所寻找的不完全相同,并且存在我在IE9中提出的具体问题,IE9支持
addEventListener()
输入
事件,但是,
输入
事件行为是非常糟糕的。