Динамически добавленный элемент SELECT не запускает событие onchange в Internet Explorer - PullRequest
9 голосов
/ 17 июля 2009

Насколько я могу судить, это только сломано в Internet Explorer. У меня есть скрипт, который создает несколько динамических

<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>

Статическое предупреждающее сообщение появляется нормально, но динамическое ничего не делает в Internet Explorer. Я почти уверен, что видел эту работу в другом месте, но я не могу найти другие примеры. Кто-нибудь видит / знает способ заставить это работать?

Ответы [ 2 ]

11 голосов
/ 17 июля 2009

Изменение:

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

до:

se.setAttribute("onchange", function(){alert('Dynamic')});

или даже короче:

se.onchange = function(){alert('Dynamic')};
1 голос
/ 15 декабря 2011

Я взял решение из http://jehiah.cz/a/firing-javascript-events-properly и перезагрузил страницу (там происходит операция на стороне сервера, запускаемая при изменении) после запуска события 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...