gpt4 book ai didi

javascript - 范围 slider 输入事件未在 IE 10 中触发

转载 作者:搜寻专家 更新时间:2023-11-01 05:31:04 25 4
gpt4 key购买 nike

我有一个范围 slider ,我想监听它的 changeinput 事件。这在大多数浏览器中工作正常,但在 IE 10 中,没有 input 事件触发和 changeinput 应该的那样一遍又一遍地触发.这是代码:

html:

<input id="slider" type="range" />

js:

window.addEventListener('load', function() {

var input = document.getElementById('slider');

input.addEventListener('input', function(e) {
console.log('input');
});

input.addEventListener('change', function(e) {
console.log('change');
});

});

它在 codepen 上:http://codepen.io/ZevanRosser/pen/YPQVzJ

我想知道是否有解决此问题的方法 - polyfill 或一些简单的技巧。

最佳答案

所以我在几天前想通了这个问题,并决定发布我的解决方案。基本上,诀窍是检查您是否在 IE 中(使用您选择的嗅探方法)。然后劫持 range 输入的 change 事件并改为触发 input 。然后,在 mouseup 上触发 change。到目前为止,这似乎很有效:

(这是一支笔 http://codepen.io/ZevanRosser/pen/pvWzej )

window.addEventListener('load', function() {

var input = document.getElementById('slider');

input.addEventListener('input', function(e) {
console.log('input');
});

input.addEventListener('change', function(e) {
console.log('change');
});

var fixInputAndChangeEvents = function() {
var currentSlider;
var fireChange = function(e) {
var changeEvent = document.createEvent('Event');
changeEvent.initEvent('change', true, true);

changeEvent.forceChange = true;
currentSlider.dispatchEvent(changeEvent);
};

document.addEventListener('change', function(e) {
var inputEvent;
if (!e.forceChange && e.target.getAttribute('type') === 'range') {
e.stopPropagation();
inputEvent = document.createEvent('Event');
inputEvent.initEvent('input', true, true);

e.target.dispatchEvent(inputEvent);

currentSlider = e.target;
document.removeEventListener('mouseup', fireChange);
document.addEventListener('mouseup', fireChange);
}

}, true); // make sure we're in the capture phase
};

var isIE = function() {
var userAgent = navigator.userAgent;
return userAgent.indexOf('MSIE') !== -1 ||
userAgent.indexOf('Trident') !== -1;
};

if (isIE()) {
fixInputAndChangeEvents();
}

});

在我正在从事的项目中使用的实际版本中,我更改了一些内容。

  1. 该项目使用 lodash,因此应另一位开发人员的要求,我将 fireChange 事件部分化并将当前 range 输入作为第一个参数传递,而不是仅使用currentSlider 变量。这基本上是为了避免碰撞——很确定碰撞是不可能的,因为您一次只能滑动一个 slider ,但我们认为安全总比后悔好。

  2. 该项目已经有 IE 嗅探,所以我使用的是已经存在的东西,而不是你在这里看到的东西。

以某种方式弄清楚此事件行为是否存在而不是嗅探 IE 会很好,但我无法完全弄清楚如何确定是否存在事件缺陷。

无论如何,希望对遇到此问题的其他人有所帮助。我认为仍有一些改进空间,但目前已经足够好了。

关于javascript - 范围 slider 输入事件未在 IE 10 中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28118849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com