Javascript JS/Prototype-检测已折叠的选择元素或实际选择的选项

Javascript JS/Prototype-检测已折叠的选择元素或实际选择的选项,javascript,prototypejs,dom-events,Javascript,Prototypejs,Dom Events,每当select元素更改其值时,我都可以执行功能设置。它不是使用普通的onchange事件,而是每300ms执行一次,并且仅在检测到更改的值时调用处理程序。我正在使用prototype的Form.Element.Observer,如果这对您有意义的话 现在,在Firefox中,当用户将鼠标悬停在选项上时,会启动定时值检查函数,因为浏览器显示值已更改,所以会调用处理程序。我想做的是能够检测用户何时实际选择了选项,而不是简单地将鼠标悬停在上面。我意识到在原型文档中,他们明确地注意到了这个bug(或特

每当select元素更改其值时,我都可以执行功能设置。它不是使用普通的onchange事件,而是每300ms执行一次,并且仅在检测到更改的值时调用处理程序。我正在使用prototype的
Form.Element.Observer
,如果这对您有意义的话

现在,在Firefox中,当用户将鼠标悬停在
选项上时,会启动定时值检查函数,因为浏览器显示值已更改,所以会调用处理程序。我想做的是能够检测用户何时实际选择了选项,而不是简单地将鼠标悬停在上面。我意识到在原型文档中,他们明确地注意到了这个bug(或特性,取决于您如何看待它),但我希望能够规范行为

在某种程度上,这有点类似于我以前在StackOverflow()上看到的一个问题,但我希望那里的人能够告诉我如何仅对特定的select元素以及它何时关闭而不是展开


要更好地理解我的意思,请签出、弄乱select元素并签出控制台日志。

下面是一个示例,演示如何通过您提到的不同阶段控制
select
元素的更改:

(用户、dom加载和js更新)

此代码利用了提供跨浏览器触发/模拟事件的方法


代码()


查看(尤其是第68-89行)。无法确定SELECT元素的当前状态-只能通过一组鼠标、键盘和UI事件的事件观察器或多或少地可靠地跟踪它。

onchange
事件到底出了什么问题,您的用例是什么?
onchange
只有在用户更改值时才会触发。有很多次我让js更改值,我也需要检测这些值。典型的用例是条件表单元素。用户选择该值(或在表单提交或ajax回调中,该值由服务器提供)并启用/禁用某些内容。然后,当这些值从服务器返回时,您可以触发
onchange
,您是否可以控制该值?如果是这样的话,我可以帮助您做到这一点。字段可以更改的唯一其他方法是通过javascript更新。如果您知道一个解决方案可以处理这三种更新情况(用户、dom加载和js更新),而不涉及观察者或大量代码维护,那么我很愿意实现它。我过去曾使用event.simulate进行过其他操作。我不知道为什么我没有想到它。谢谢这似乎是解决我面临的问题的最合理的办法。唯一的问题是,每当我更改select元素的值时,我还必须调用
simulate
方法。理想情况下,我只想更改元素的值,它就会知道如何调用它的
onchange
方法。我想这就是我一开始陷入困境的原因。好吧。
document.observe('dom:loaded', function() {
    var select = $('box_1'),
        button_1 = $('change_via_ajax'), 
        button_2 = $('change_via_script'), 
        results = $('results');

    // create observer on our select
    select.observe('change', function(e) {
        var d = new Date()
            t = d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds();
        results.insert(new Element('div')
               .update(t + ' - Change was fired, value is now [' + this.value + ']'));
    });

    button_1.observe('click', function() {
        new Ajax.Request('/echo/json/', {
            onComplete: function(j) {
                select.options[Math.round(Math.random() * 2)].selected = true;
                select.simulate('change');
            }
        });
    });

    button_2.observe('click', function() {
        select.options[0].selected = true;
        select.simulate('change');
    });
});​