Selectbox:捕获由外部JavaScript触发的onchange事件?

Selectbox:捕获由外部JavaScript触发的onchange事件?,javascript,onchange,drop-down-menu,Javascript,Onchange,Drop Down Menu,请仔细阅读标题-这不是常见的改变 网页上存在一个选择框。selectbox及其selectedIndex可以通过javascript,externaljs以编程方式更改 我希望在索引更改时收到通知(交叉浏览器解决方案)。这可能吗 或HTML: 等待您的见解:-) 更新: 这并没有回答我最初的问题,但通过这一点,我成功地实现了我最初想要的(不是文章的一部分): Javascript更改事件需要用户启动浏览器事件。当JavaScript本身触发更改时,它们不起作用 如果真的想这样做,应该编写一

请仔细阅读标题-这不是常见的改变

网页上存在一个选择框。selectbox及其selectedIndex可以通过javascript,externaljs以编程方式更改

我希望在索引更改时收到通知(交叉浏览器解决方案)。这可能吗



或HTML:

等待您的见解:-)

更新:

这并没有回答我最初的问题,但通过这一点,我成功地实现了我最初想要的(不是文章的一部分):


Javascript更改事件需要用户启动浏览器事件。当JavaScript本身触发更改时,它们不起作用

如果真的想这样做,应该编写一个函数,使用
setInterval
定期轮询
的值,并进行比较

var selectold =  select.selectedIndex;
setInterval(function(){
    if(selectold != select.selectedIndex)
       {
           console.log("there was a change");
           selectold = select.selectedIndex;

       }
},500);

编辑

如果您控制更新selectedIndex的代码,则可以向其中注入回调,从而提供类似事件的行为

/* code that I do not wish/'cannot' change: */
function startSelectScroll(indexChangeCallback) {
    var select = document.getElementById("mySelect");

    var index = 0;
    var myInterval = setInterval( function() { // Change index every 500ms

        index++;
        select.selectedIndex = index % 3;

        indexChangeCallback.call(select);
    }, 500 );

    setTimeout( function() { // Remove automatic change after 3000ms
        clearInterval( myInterval );
        alert(callCount);
    }, 3000 );
}
/* end unmodifiable code */

startSelectScroll(function() {
    callCount++;
});

var callCount = 0;

如果你不能控制它,无论你使用什么框架,都应该以同样的方式支持回调

function alertMe(theSelect) {
    var mySelectList = document.getElementById(theSelect);  
    var result = mySelectList.options[mySelectList.selectedIndex].value;
    alert(result); // Alerts selected option
}
html:


正文
B文本
C文本

这将给出所选选项的值字段。您还可以通过在末尾将“.value”替换为“.text”来获得文本字段。

我意识到我间接触发了选择框的更改。这使我能够在那之后做一次检查。。不仅和听众一样好,而且它会起作用,不会那么脏:-)


至少我得到了证实,没有这样的事件可以听。谢谢你。

不,你不能。然而,你为什么要这样做?如果你需要知道其他代码(尤其是你不能编辑的代码)“在你不知情的情况下”会做什么,我想你的应用程序设计有点缺陷。原因很明显:因为我想干扰/操纵外部JS执行的默认处理。我承认外部JS并非完美无缺——它是微软的。但我相信这些细节并没有那么重要。触发器“我不知道”,即未收到通知并不意味着有缺陷-只是它的设计目的不是为了启用干扰。是的,如果该脚本的设计目的不是为了允许干扰,您应该寻找另一种解决方案:-)明显的注释是明显的。“不允许干扰”也不意味着“无法干扰”。。i、 e.寻找“a”方式,如果可能的话-无论是否有意这样做。谢谢你的建议。至于缺乏优雅,我不会用这个。别怪你:D。这是一种非常不优雅的方式。但是
setInterval
不会影响用户体验。哈哈,至少这是一个“a”的方式-你回答了我的问题。。据我所知,它只是作为一个指令(没有倒计时等),所以不太需要CPU。我感谢你的努力,但我不希望/“不能”更改的/*代码://应该/不能由我更改。这是如何解决问题的?你的回答没有帮助,对不起。正如我试图明确指出的那样,(索引的)更改是由JavaScript执行的,而不是通过鼠标操作等。没有引发任何事件,并且不会执行“alertMe”。糟糕,当另一个javascript代码触发元素上的事件时,我想捕获它的唯一方法是将interval设置为@DarkXphenomenon提到的值。当jQuery发布“listen()”时,我希望他们也会考虑这个问题。
var selectold =  select.selectedIndex;
setInterval(function(){
    if(selectold != select.selectedIndex)
       {
           console.log("there was a change");
           selectold = select.selectedIndex;

       }
},500);
/* code that I do not wish/'cannot' change: */
function startSelectScroll(indexChangeCallback) {
    var select = document.getElementById("mySelect");

    var index = 0;
    var myInterval = setInterval( function() { // Change index every 500ms

        index++;
        select.selectedIndex = index % 3;

        indexChangeCallback.call(select);
    }, 500 );

    setTimeout( function() { // Remove automatic change after 3000ms
        clearInterval( myInterval );
        alert(callCount);
    }, 3000 );
}
/* end unmodifiable code */

startSelectScroll(function() {
    callCount++;
});

var callCount = 0;
function alertMe(theSelect) {
    var mySelectList = document.getElementById(theSelect);  
    var result = mySelectList.options[mySelectList.selectedIndex].value;
    alert(result); // Alerts selected option
}
<select id="mySelect" onchange="javascript:alertMe("mySelect")">
    <option value="A"> A text </option>
    <option value="B"> B text </option>
    <option value="C"> C text </option>
<select>