2009-07-17 24 views
9

Bunu yalnızca Internet Explorer'da bozulduğunu söyleyebilirim. Birden çok dinamik < seçkisi > öğelerini oluşturan bir komut dosyası var ve bunlar için bir onchange olayı ekler. Onchange olayı, Firefox'ta hiçbir problem yaşamadan patlar, ancak Internet Explorer'da asla ateş etmez. Geliştirici Araç Çubuğu'nu kullanarak DOM'ın listelenen doğru etkinliğe sahip olduğunu görüyorum, hiçbir zaman tetiklenmiyor.Dinamik olarak eklenen SELECT öğesi, Internet Explorer'da onchange olayı tetiklenmiyor

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

statik uyarı mesajı ince çıkageldi, ancak dinamik bir Internet Explorer'da bir şey yapmaz: Aşağıdaki kodu sorunu aşağı haşlanmış ettik. Bu çalışmayı başka bir yerde gördüğüm için neredeyse olumluyum ama başka örnekler bulamıyorum. Bunu işe almak için bir yol gören/tanıyan var mı?

cevap

11

Değişimi:

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

için:

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

hatta daha kısa:

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

Ya olay/tetikleyici :) –

+0

orijinal konu bağlamak için JQuery kullanmak JQuery kullanır ve standart özellikler sorunun bir parçası olduğu gibi olayları tedavi etmek için çalışıyor. IE sadece dizeleri ayrıştırmak değil, büyük bir acıdır ... –

+0

Evet, bir onchange olayı atamak için jQuery'nin .attr() işlevini kullanmaya çalışırken sorunlar yaşadım. Elem.onchange = function() {blah'ın doğrudan DOM ataması; } benim için güzel çalıştı. – kdawg

1

Ben http://jehiah.cz/a/firing-javascript-events-properly ve sayfayı yeniden gelen çözüm aldı (sunucu tarafı operasyonu ile tetiklenen var Değişim üzerine) sonra IE9, daha sonra çalıştı olay ortaya çıktı. IE'nin önceki sürümü hakkında emin değilim. Dinlen, Chrome ve FF için çalışır.

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); 
    } 
} 
İlgili konular