Javascript 事件监听与事件动作排除

Javascript 事件监听与事件动作排除,javascript,prototypejs,Javascript,Prototypejs,我对输入有一个更改事件,我希望在单击列表项时触发该事件。基本上,我调用一个函数来检查该字段的更改情况,但是在该字段上还有一个自动完成脚本,它在您选择的输入下方添加了一个无序列表,当您单击某个项填充输入字段时,该列表会触发更改(基本上在添加新值之前触发)。以下是javascript代码: document.observe('dom:loaded',function() { new Ajax.Autocompleter("search_input", "found_input", "som

我对输入有一个更改事件,我希望在单击列表项时触发该事件。基本上,我调用一个函数来检查该字段的更改情况,但是在该字段上还有一个自动完成脚本,它在您选择的输入下方添加了一个无序列表,当您单击某个项填充输入字段时,该列表会触发更改(基本上在添加新值之前触发)。以下是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中搜索输入字段之后会触发

谢谢你的帮助

编辑:

您可以在这里看到一个小示例:
如果您开始键入“test”,您将看到下拉列表中有2个选项。当您单击其中一个时,它将触发更改事件和选择事件。如果单击选择列表,我想停止更改事件

这是我公认的黑客解决方案:

所发生的情况是,通过单击“自动完成”选项,您正在模糊输入字段,因此提交您键入的任何值,并在字段上调度更改事件。这是在您能够单击自动完成选项(需要鼠标)以触发该功能以用您选择的内容替换输入内容之前的全部内容。这是你问题的根源

我不完全理解的是,为什么在进行自动完成选择之后,另一个更改事件没有被调用(至少在Safari中是这样)。我想知道以编程方式更改输入值是否不会触发更改事件。我应该知道是不是这样,但我需要测试一下。有什么想法吗

所以-我所做的是将
Autocompleter.Local
类子类化,并将
onClick
回调分配给每个li的mousedown事件。这似乎会在窗体的模糊事件之前触发
onClick
(因此触发更改)。然后,我在输入字段上手动触发一个更改事件

我仍然必须设置一个
changing
标志,以便
searchHandler
回调不会因为一次自动完成选择而多次被调用。这发生在Firefox上。我推迟此回调的实际工作,让事件稳定下来,然后关闭
changing
标志。这是最恶心的部分,对不起

需要注意的一点是,如果选择了“自动完成”选项,则无论选择的值是否与输入字段中最初的值不同,都会触发更改事件。要避免这种情况,需要对自动完成程序代码进行更多的修补,如果您愿意,我会让您处理这些代码。此外,我只在Mac上的FF和Safari中测试过这一点,所以如果这将用于生产,请进行适当的测试和调整


希望这能奏效,或者至少能给你一些想法。如果您或其他任何人对此问题有不同的看法(除了重新编写自动完成功能外),我很想听听。

有没有机会看到这一点,或者有没有机会做点什么?刚刚发布了链接。谢谢。我在代码中所做的所有更改都是添加了全局变量更改,为found_input div添加了mousedown观察器,该观察器在updateSelectedItem中将更改var设置为true,并将更改var设置为false。这似乎奏效了。谢谢