IE'de jQuery'nin .change () öğesini tanımasını sağlamak


131

Bir radyo düğmesi grubu değiştirildiğinde / tıklandığında öğeleri gizlemek ve göstermek için jQuery kullanıyorum. Firefox gibi tarayıcılarda iyi çalışıyor, ancak IE 6 ve 7'de işlem yalnızca kullanıcı sayfada başka bir yere tıkladığında gerçekleşir.

Ayrıntılı olarak, sayfayı yüklediğinizde her şey yolunda görünüyor. Firefox'ta, bir radyo düğmesini tıklarsanız, bir tablo satırı gizlenir ve diğeri hemen gösterilir. Ancak, IE 6 ve 7'de, radyo düğmesini tıklarsınız ve sayfada herhangi bir yeri tıklayana kadar hiçbir şey olmaz. Ancak bundan sonra IE, ilgili öğeleri gizleyerek ve göstererek sayfayı yeniden çizer.

İşte kullandığım jQuery:

$(document).ready(function () {
  $(".hiddenOnLoad").hide();

  $("#viewByOrg").change(function () {
    $(".visibleOnLoad").show();
    $(".hiddenOnLoad").hide();
  });

  $("#viewByProduct").change(function () {
    $(".visibleOnLoad").hide();
    $(".hiddenOnLoad").show();
  });
});

İşte XHTML'nin etkilediği kısım. Sayfanın tamamı XHTML 1.0 Katı olarak doğrulanır.

<tr>
  <td>View by:</td>
  <td>
    <p>
      <input type="radio" name="viewBy" id="viewByOrg" value="organisation"
      checked="checked" />Organisation</p>
    <p>
      <input type="radio" name="viewBy" id="viewByProduct" value="product" />Product</p>
  </td>
</tr>
<tr class="visibleOnLoad">
  <td>Organisation:</td>
  <td>
    <select name="organisation" id="organisation" multiple="multiple" size="10">
      <option value="1">Option 1</option>
      <option value="2">Option 2</option>
    </select>
  </td>
</tr>
<tr class="hiddenOnLoad">
  <td>Product:</td>
  <td>
    <select name="product" id="product" multiple="multiple" size="10">
      <option value="1">Option 1</option>
      <option value="2">Option 2</option>
    </select>
  </td>
</tr>

Bunun neden olduğu ve nasıl düzeltileceği konusunda herhangi bir fikri olan varsa, çok memnun kalacaklardır!

Yanıtlar:


96

.clickBunun yerine kullanmayı deneyin .change.


3
@samjudson, testimde bu doğru değil ve jquery'nin tıklaması, ok tuşlarını kullanarak bir sonraki radyo düğmesini seçtiğimde tetikleniyor. (vista, ie7)
svandragt

1
@Pacifika: IE7'de benim için değil. En azından doğru anlıyor. "tıklama", "değişim" den tamamen farklı bir olaydır ve en azından bazı durumlarda (tümü değilse) uygunsuz bir ikame olduğu durumlar vardır.
Bobby Jack

3
@samjudson: radyo düğmelerindeki tıklama olayları ve onay kutuları, klavye kullanılarak seçildiğinde de tetiklenir. Tüm tarayıcılarda çalışır
Philippe Leybaert

4
Düzeltilmiş durumdayım - durum böyle görünüyor, ancak sezgiye aykırı olabilir!
Bobby Jack

2
Bu, bu özel sorunun en popüler yanıtı gibi görünüyor, ancak tamamen doğru değil! daha önce seçilen seçeneğe tıklandığında çift tutucunun da çağrılmasından clickfarklıdır, changeoysa changedeğildir. Bu yanıt , .dataeski ve yeni değerleri karşılaştırmak için jQuery'nin nasıl kullanılacağına dair bir örnek içerir .
Laoujin

54

Bunun clickyerine olayı kullanmakla ilgili sorun, olayı changeaynı radyo kutusu seçiliyse (yani gerçekten değişmemişse) almanızdır. Yeni değerin eskisinden farklı olup olmadığını kontrol ederseniz, bu filtrelenebilir. Bunu biraz can sıkıcı buluyorum.

Eğer kullanırsanız changeEtkinliği IE'deki diğer herhangi bir öğeye tıkladıktan sonra değişikliği tanıyacağını fark edebilirsiniz. Etkinlikte ararsanız blur(), clickolayın başlamasına neden olur change(yalnızca radyo kutuları gerçekten değişmişse).

İşte bunu nasıl yapıyorum:

// This is the hack for IE
if ($.browser.msie) {
  $("#viewByOrg").click(function() {
    this.blur();
    this.focus();
  });
}

$("#viewByOrg").change(function() {
  // Do stuff here
});

Artık değişiklik olayını normal şekilde kullanabilirsiniz.

Düzenleme: Erişilebilirlik sorunlarını önlemek için odaklanmak için bir çağrı eklendi () (aşağıdaki Bobby'nin yorumuna bakın).


2
Bu çok kötü bir hack çünkü kullanıcılarınızın klavyeyi kullanarak gezinmesini engelliyor, çünkü bir radyo düğmesi seçildikten sonra odak kayboluyor.
Philippe Leybaert

5
Bu harika, ancak klavye erişilebilirlik sorunlarına neden oluyor. Blur () olayı tetiklendiğinde, radyo düğmesi artık odaklanmaz, bu nedenle klavye ile radyo düğmeleri arasında hareket etmek son derece garip hale gelir. Şu anki çözümüm "this.focus ();" a bir çağrı eklemek. blur () ifadesinden hemen sonra.
Bobby Jack

1
Erişilebilirlik sorunları nedeniyle sunulan en kötü çözüm olduğunu düşünüyorum.
Philippe Leybaert

11
Ancak erişilebilirlik sorunu bir odak çağrısı () ile çözülebilir. En azından her şey için click () kullanmak kadar iyidir.
Bobby Jack

Teşekkürler Bobby, bunu cevaba ekleyeceğim.
Mark A. Nicolosi

33

IE'nin onpropertychange olayını denediniz mi? Fark eder mi bilmiyorum ama muhtemelen denemeye değer. Değerler JS kodu aracılığıyla güncellendiğinde IE, değişiklik olayını tetiklemez, ancak bu örnekte belki de onpropertychange çalışabilir.

$("#viewByOrg").bind($.browser.msie? 'propertychange': 'change', function(e) {
  e.preventDefault(); // Your code here 
}); 

"tıklama" işe yaramadı, ancak "mülk değişimi" işe yaradı. Teşekkürler!
James Kingsbery

Bunu IE8'de denedim, çalışmıyor. İşlevin içine girmiyor.
ARUN

14

Bu da işe yaramalı:

$(document).ready(function(){
   $(".hiddenOnLoad").hide();
   $("#viewByOrg, #viewByProduct").bind(($.browser.msie ? "click" : "change"), function () {
                        $(".visibleOnLoad").show();
                        $(".hiddenOnLoad").hide();
                    });
});

Teşekkürler Pier. Bu çok yardımcı oldu.


Bu, en azından, mevcut kabul edilen / en yüksek oyu alan cevaptan çok daha iyi bir cevaptır. Tüm iyi tarayıcılar için değil, yalnızca IE altında klavye erişilebilirliğini bozar.
Bobby Jack

... Yine de, bu sadece Pier'in cevabının bir kopyası değil mi?
Bobby Jack

Kabul edildi, bu Pier'in biraz daha az okunabilir bir versiyonu, ancak her iki seçicinin de bir çağrıya bağlı olması.
Tristan Warner-Smith

değiştirmek clickclick keyup keypressKlavye desteği eklemek için ile .
aloisdg codidact.com'a taşınıyor

6

IE'de, diğer tarayıcılarda değişim sırasında tıklama olayını kullanmanız gerekir. İşleviniz olabilir

$(document).ready(function(){
   $(".hiddenOnLoad").hide();
   var evt = $.browser.msie ? "click" : "change";
   $("#viewByOrg").bind(evt, function () {
                        $(".visibleOnLoad").show();
                        $(".hiddenOnLoad").hide();
                    });

   $("#viewByProduct").bind(evt, function () {
                        $(".visibleOnLoad").hide();
                        $(".hiddenOnLoad").show();
                    });     
});

Klavye desteği eklemek için clickile değiştirin click keyup keypress.
aloisdg codidact.com'a taşınıyor

6

bu eklentiyi ekle

jQuery.fn.radioChange = function(newFn){
    this.bind(jQuery.browser.msie? "click" : "change", newFn);
}

sonra

$(function(){
    $("radioBtnSelector").radioChange(function(){
        //do stuff
    });
});

4

Giriş metni ile aynı sorunu yaşadım.

Ben değiştim:

$("#myinput").change(function() { "alert('I changed')" });

için

$("#myinput").attr("onChange", "alert('I changed')");

ve her şey benim için iyi çalışıyor!


2

Bu, IE'ye, öğe tıklandığında değişiklik olayını başlatmasını söylemenin basit bir yoludur:

if($.browser.msie) {
    $("#viewByOrg").click(function() {
        $(this).change();
    });
}

Daha fazla form öğesiyle çalışmak için bunu daha genel bir şeye genişletebilirsiniz:

if($.browser.msie) {
    $("input, select").click(function() {
        $(this).change();
    });
    $("input, textarea").keyup(function() {
        $(this).change();
    });
}

1

Bunun IE ile ilgili bilinen bir sorun olduğundan oldukça eminim. onclickOlay için bir işleyici eklemek sorunu çözmelidir:

$(document).ready(function(){

    $(".hiddenOnLoad").hide();

    $("#viewByOrg").change(function () {
        $(".visibleOnLoad").show();
        $(".hiddenOnLoad").hide();
    });

    $("#viewByOrg").click(function () {
        $(".visibleOnLoad").show();
        $(".hiddenOnLoad").hide();
    });

    $("#viewByProduct").change(function () {
        $(".visibleOnLoad").hide();
        $(".hiddenOnLoad").show();
    });     

    $("#viewByProduct").click(function () {
        $(".visibleOnLoad").hide();
        $(".hiddenOnLoad").show();
    });     
});

1

IE'de, telsizi ve onay kutularını bir "değişiklik" olayını tetiklemeye zorlayın:

if($.browser.msie && $.browser.version < 8)
  $('input[type=radio],[type=checkbox]').live('click', function(){
    $(this).trigger('change');
  });

1

jquery 1.6'dan itibaren bu artık bir sorun değil .. ne zaman düzeltildiğinden emin değilim .. Tanrıya şükür yine de



1

tıklama hilesi işe yarıyor ... ancak doğru radyo durumunu veya onay kutusunu almak istiyorsanız, bunu kullanabilirsiniz:

(function($) {
    $('input[type=checkbox], input[type=radio]').live('click', function() {
       var $this = $(this);
       setTimeout(function() {
          $this.trigger('changeIE'); 
       }, 10) 
    });
})(jQuery);

$(selector).bind($.browser.msie && $.browser.version <= 8 ? 'changeIE' : 'change', function() {
  // do whatever you want
})

0

imo, değişiklik yerine tıklama kullanmak ie davranışını farklı kılar. Bir zamanlayıcı (setTimout) kullanarak değişiklik olayı davranışını taklit etmeyi tercih ederim.

(uyarı - not defteri kodu) gibi bir şey:

if ($.browser.msie) {
  var interval = 50;
  var changeHack = 'change-hac';
  var select = $("#viewByOrg");
  select.data(changeHack) = select.val();
  var checkVal=function() {
    var oldVal = select.data(changeHack);
    var newVal = select.val();
    if (oldVal !== newVal) {
      select.data(changeHack, newVal);
      select.trigger('change')
    }
    setTimeout(changeHack, interval);
  }
  setTimeout(changeHack, interval);
}

$("#viewByOrg").change(function() {
  // Do stuff here
});

whoah ... eli biraz ağır, değil mi?
orip

0

bunu dene, benim için çalışıyor

$("#viewByOrg")
        .attr('onChange', $.browser.msie ? "$(this).data('onChange').apply(this)" : "")
        .change( function(){if(!$.browser.msie)$(this).data('onChange').apply(this)} )
        .data('onChange',function(){alert('put your codes here')});

0

Bu, birine yardımcı olabilir: Formun kimliğiyle başlamak yerine, seçim kimliğini hedefleyin ve aşağıdaki gibi formu değiştirin:

<form id='filterIt' action='' method='post'>
  <select id='val' name='val'>
    <option value='1'>One</option>
    <option value='2'>Two</option>
    <option value='6'>Six</option>
  </select>
  <input type="submit" value="go" />
</form>

ve jQuery:

$('#val').change(function(){
  $('#filterIt').submit();
});

(Açıkçası, javascript devre dışı bırakılırsa gönder düğmesi isteğe bağlıdır)


0

Takip etmeyi dene:

.bind($.browser.msie ? 'click' : 'change', function(event) {

0

Kullanmaktan kaçının .focus () veya .Select () önce .change () fonksiyonu jquery IE için, o zaman im benim ortamında kullanın, cezası çalışır.

Teşekkürler


0
//global
var prev_value = ""; 

$(document).ready(function () {

 if (jQuery.browser.msie && $.browser.version < 8)
      $('input:not(:submit):not(:button):not(:hidden), select, textarea').bind("focus", function () { 
         prev_value = $(this).val();

       }).bind("blur", function () { 
         if($(this).val() != prev_value)
         has_changes = true;
       });
}

0

Lütfen , IE'de ve diğer tarayıcılarda ilk kez iyi çalışan değiştirme / tıklama yerine her birini kullanmayı deneyin.

İlk seferde çalışmamak

$("#checkboxid").**change**(function () {

});

İlk seferinde bile iyi çalışıyor

$("#checkboxid").**each**(function () {

});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.