排除事件操作的事件侦听
Event listening with event action exclusion
我在一个输入上有一个更改事件,除了单击列表项时,我想触发它。基本上,当字段发生更改时,我会调用一个函数来检查该字段,但该字段上还有一个自动完成脚本,它会在您选择的输入下方添加一个无序列表,当您单击一个项目来填充输入字段时,它会触发更改(本质上是在添加新值之前触发)。这是javascript代码:
document.observe('dom:loaded',function() {
new Ajax.Autocompleter("search_input", "found_input", "someurl.jsp", {
afterUpdateElement: updateSelectedItem,
minChars: 2
});
if ($('search_input') != undefined) {
$('search_input').observe('change', function(e, el) {
if (e.explicitOriginalTarget.up(1) != undefined && e.explicitOriginalTarget.up(1).id != "found_input") {
checkFunction(this.value);
}
});
}
});
我在那里添加了explicitOriginalTarget,因为它在Mozilla浏览器中工作,但这不是一个跨浏览器的解决方案。我还尝试添加一个变量,该变量在单击无序列表项时会被添加,但它在DOM中的search_input字段之后会被触发。
谢谢你的帮助。
编辑:
你可以在这里看到一个小例子:http://jsfiddle.net/DfMYE/5/如果您开始键入"test",您将看到2个选项的下拉列表。当您单击其中一个时,它会触发更改事件和选择事件。如果我们单击选择列表,我想停止更改事件。
这是我公认的黑客解决方案:http://jsfiddle.net/kkFsJ/1/
实际情况是,通过单击自动完成选项,您模糊了输入字段,因此提交了您键入的任何值,并在字段上调度了更改事件。这一切都是在您能够点击自动完成选项上的(这需要鼠标向上)以触发该功能以用您选择的内容替换输入内容之前完成的。这是你问题的根源。
我不完全理解的是,为什么在你做出自动完成选择后,不会调用另一个更改事件(至少在Safari中是这样)。我想知道以编程方式更改输入的值是否不会触发更改事件。我可能应该知道是不是这样,但我需要测试一下。有什么想法吗?
因此,我所做的是将Autocompleter.Local
类划分为子类,并将onClick
回调分配给每个li的mousedown事件。这似乎在表单的模糊事件(因此触发触发更改)之前触发onClick
。然后,我在输入字段上手动触发一个更改事件。
我仍然需要设置一个changing
标志,这样searchHandler
回调就不会因为一个自动完成选择而被多次调用。这发生在Firefox中。我推迟了这个回调的实际工作,让事件稳定下来,然后关闭changing
标志。对不起,这是最恶心的部分。
需要注意的一点是,如果您选择了自动完成选项,则无论是否选择该值,更改事件都将被触发,该值与输入字段中最初的值不同。避免这种情况需要对自动补全器代码进行更多的修改,如果你愿意,我会让你处理的。此外,我只在Mac上的FF和Safari中测试过这一点,所以如果要生产,请进行适当的测试和调整。
希望这能奏效,或者至少能给你一些想法。如果你或其他人对这个问题有不同的看法(除了重写自动补全功能),我很乐意听到。
- toogleClass函数来切换元素类并在事件期间执行某些操作
- 禁用先前单击按钮时的单击事件操作
- reactJs redux:如何对用户事件调度操作并将操作与化简器和存储链接
- 如何在执行某个操作后自动触发回车键事件
- 在悬停事件中创建一次性操作
- 将单击事件附加到按钮或链接上的类,该按钮或链接会触发 AJAX 帖子,然后延迟并继续原始操作
- MVC 下拉列表更改事件未正确调用控制器中的操作
- 如何在Javascript事件上触发rails控制器操作
- 如何使用 JavaScript 操作 html 按钮元素的“onclick”事件
- 如何删除绑定到单击事件的任何jQuery操作
- 如何在jquery可丢弃事件中执行某些操作
- html+jquery(绑定onclick事件以执行onclick之前的操作)
- 如何使用body onload事件操作HTML音频标记和JavaScript函数
- 排除事件操作的事件侦听
- 如何停止jquery中的默认选择事件操作
- 将类似的点击事件操作转换为函数
- 在标准事件操作完成后采取操作
- 在Node.js后端记录事件/操作,以便稍后进行分析
- Javascript事件操作
- addEventListener覆盖其他事件操作