Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Internet Explorer中动态添加的SELECT元素不会触发onchange事件_Javascript_Html_Internet Explorer - Fatal编程技术网

Javascript 在Internet Explorer中动态添加的SELECT元素不会触发onchange事件

Javascript 在Internet Explorer中动态添加的SELECT元素不会触发onchange事件,javascript,html,internet-explorer,Javascript,Html,Internet Explorer,据我所知,这只不过是在Internet Explorer中损坏的。我有一个脚本,可以创建多个动态元素,并为它们添加一个onchange事件。onchange事件在Firefox中触发没有问题,但在internetexplorer中它从不触发。使用开发者工具栏,我看到DOM列出了正确的事件,但它永远不会触发。我将问题归结为以下代码: <html> <head> <script language="javascript">

据我所知,这只不过是在Internet Explorer中损坏的。我有一个脚本,可以创建多个动态元素,并为它们添加一个onchange事件。onchange事件在Firefox中触发没有问题,但在internetexplorer中它从不触发。使用开发者工具栏,我看到DOM列出了正确的事件,但它永远不会触发。我将问题归结为以下代码:

<html>
    <head>
        <script language="javascript">
            function addSelect() {
                var se = document.createElement('select');
                se.setAttribute("onchange", "alert('Dynamic')");
                se.options[0] = new Option("1", "1");
                se.options[1] = new Option("2", "2");
                se.options[2] = new Option("3", "3");
                se.options[3] = new Option("4", "4");
                var plh = document.getElementById("ph");
                plh.appendChild(se);
            }
        </script>
    </head>
    <body onload="addSelect()">
        <select name="something" onchange="alert('Static')">
            <optgroup label="set1">
            <option value="1">1</option>
            <option value="2">2</option>
            </optgroup>
            <optgroup label="set2">
            <option value="3">3</option>
            <option value="4">4</option>
            </optgroup>
        </select>
        <div id="ph">
        </div>
    </body>
</html>

函数addSelect(){
var se=document.createElement('select');
se.setAttribute(“onchange”、“alert('Dynamic')”);
se.期权[0]=新期权(“1”、“1”);
se.期权[1]=新期权(“2”、“2”);
se.期权[2]=新期权(“3”、“3”);
se.期权[3]=新期权(“4”、“4”);
var plh=document.getElementById(“ph”);
附肢儿童(se);
}
1.
2.
3.
4.
静态警报消息显示良好,但动态警报消息在Internet Explorer中不起任何作用。我几乎可以肯定的是,我在其他地方看到过这项工作,但我似乎找不到其他例子。有没有人看到/知道如何让它工作?

更改:

se.setAttribute("onchange", "alert('Dynamic')");
致:

甚至更短:

se.onchange = function(){alert('Dynamic')};
在触发事件IE9之后,我从中获取解决方案并重新加载页面(有一个通过更改触发的服务器端操作),该事件随后起作用。我不确定IE的早期版本。它适用于Chrome和FF

    function fireEvent(element,event){
    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        element.fireEvent('on'+event,evt);
        javascript:location.reload(true);
    }
    else{
    // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
    }
}

或者使用JQuery绑定事件/触发器:)原始问题使用JQuery,并且尝试将事件作为标准属性处理是问题的一部分。为什么IE不只是解析字符串是一大难题……是的,我在尝试使用jQuery的.attr()函数分配onchange事件时遇到了问题。elem.onchange=function(){blah;}的直接DOM赋值对我来说很好。我知道这很旧,但是你的
se.setAttribute(“onchange”,function(){alert('Dynamic')})解决方案不正确,但最后一个是正确的。使用
.setAttribute()
时,值将转换为字符串,该字符串将成为所创建函数的主体。因此,在调用函数体时,函数体将最终导致语法错误,因为它将被解释为没有名称的函数声明。So
se.setAttribute(“onchange”、“alert('Dynamic')”)
是使用
.setAttribute()
的正确方法,尽管它在IE中可能有缺陷。
    function fireEvent(element,event){
    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        element.fireEvent('on'+event,evt);
        javascript:location.reload(true);
    }
    else{
    // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
    }
}