2009-07-17 8 views
9

O ile wiem, jest to tylko uszkodzone w Internet Explorerze. Mam skrypt, który tworzy wiele dynamicznych elementów select i dodaje do nich zdarzenie onchange. Zdarzenie onchange jest uruchamiane w Firefoksie bez żadnego problemu, ale w przeglądarce Internet Explorer nigdy się nie uruchamia. Korzystając z paska narzędzi dla programistów, widzę, że DOM zawiera poprawne wydarzenie, po prostu nigdy się nie uruchamia. Mam problem sprowadza się do następującego kodu:Dynamicznie dodany element SELECT nie uruchamia zdarzenia onchange w Internet Explorerze

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

Statyczny wiadomość alert pojawia się w porządku, ale dynamiczny nic nie robi w programie Internet Explorer. Jestem niemal pewien, że widziałem tę pracę gdzie indziej, ale nie mogę znaleźć innych przykładów. Czy ktokolwiek widzi/zna sposób, aby to zadziałało?

Odpowiedz

11

Zmiana:

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

do:

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

lub nawet krócej:

se.onchange = function(){alert('Dynamic')}; 
+0

Albo użyć jQuery powiązać zdarzenie/spust :) –

+0

pierwotną emisję wykorzystuje jQuery i stara się traktować jako standardowe atrybuty zdarzenia był częścią problemu. Dlaczego IE nie tylko parsuje ciągi znaków to poważny problem ... –

+0

Tak, miałem problemy, gdy próbowałem użyć funkcji .attr() jQuery, aby przypisać zdarzenie onchange. Bezpośrednie przypisanie DOM elem.onchange = function() {blah; } miło działało. – kdawg

1

Wziąłem rozwiązanie z http://jehiah.cz/a/firing-javascript-events-properly i przeładowania strony (jest operacja po stronie serwera wyzwalane przez na zmianę) po wystrzeleniu zdarzenia IE9, które następnie zadziałało. Nie jestem pewien co do wcześniejszej wersji IE. Reszta działa na Chrome i 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); 
    } 
} 
Powiązane problemy