【问题标题】:Passing event object to debounced function in IE8将事件对象传递给 IE8 中的去抖动函数
【发布时间】:2014-09-08 14:39:54
【问题描述】:

我想消除导致 AJAX 调用的行表上的 keyup 事件。我已经使用了所有的去抖动插件,包括 Ben Alman 的 jQuery 插件,Underscore.js 的插件,jQuery delayed() 插件,以及 Filatov Dmitry 的插件,它扩展了 jQuery(如 Ben Alman 的)。

我的代码如下所示:

function onKeyUp(evt) {
    doSomethingWith(evt, true);
}

$('#mytable').on('keyup', $.debounce(500, onKeyUp));

问题在于,虽然它在 Firefox 和 IE9 上运行良好,但在 IE8 上却无法运行。具体来说,当我调用 evt.preventDefault() 进入 jQuery 1.11.1 代码并在 e.returnValue = false; 的第 4967 行中断时,IE8 会引发“未找到成员”错误(因为 IE8 中显然不存在 preventDefault())。使用 IE 开发人员工具调试器检查事件变量后,似乎该变量包含所有事件成员方法和属性,但其中大部分都标记为“未找到成员”。 我已经尝试过这个解决方案https://stackoverflow.com/a/3533725/134120,但它不起作用。 谷歌搜索“找不到 IE 成员”会返回很多结果,但解决方案不多。

那么,有什么想法吗?

【问题讨论】:

  • 嗯,在事件结束后很长时间阻止默认是没有意义的。如果您想取消活动,则需要以不同的方式处理。
  • 它在 Firefox 和 IE9 中按预期工作,我成功使用 preventDefault() 来防止使用箭头键向下或向上滚动,这是默认行为。
  • 为什么还要一个插件,这个自己做很容易-> jsfiddle.net/njeqmb0b
  • @AsGoodAsItGets:但是为了防止所有滚动事件你不会debounce处理程序?
  • 所有的去抖插件基本上都使用超时,所以即使你通过它也无法阻止事件,因为它在超时触发时已经发生,请参阅我上面发布的小提琴。你必须防止默认的before你去抖动,你可以检查e.which只防止箭头键。

标签: javascript jquery internet-explorer-8 dom-events


【解决方案1】:

我需要首先阻止默认处理程序(即不滚动),然后解除我的事件处理程序的抖动。

然后使用这个:

var onKeyUp = $.debounce(500, doSomethingWith);

$('#mytable').on('keyup', function(evt) {
    evt.preventDefault(); // do always
    onKeyUp(evt, true); // possibly bounced call to doSomethingWith
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    相关资源
    最近更新 更多