Javascript 如何识别“中的错误行为”;输入“;没有浏览器检测的事件?
我将从这个问题开始。当一个特定的浏览器有一个功能的错误实现,并且您的javascript需要知道当前浏览器是否有该错误实现,以便它可以使用另一种策略时,您如何在不进行浏览器类型嗅探(通常认为是不好的)的情况下判断该实现是否有错误 整个情况是这样的 我正在编写一些代码,希望使用获取用户对Javascript 如何识别“中的错误行为”;输入“;没有浏览器检测的事件?,javascript,events,input,browser-feature-detection,Javascript,Events,Input,Browser Feature Detection,我将从这个问题开始。当一个特定的浏览器有一个功能的错误实现,并且您的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()
和输入
事件,但是,输入
事件行为是非常糟糕的。