Mendapatkan jQuery untuk mengenali .change () di IE


131

Saya menggunakan jQuery untuk menyembunyikan dan menampilkan elemen ketika grup tombol radio diubah / diklik. Ini berfungsi dengan baik di browser seperti Firefox, tetapi di IE 6 dan 7, tindakan hanya terjadi ketika pengguna kemudian mengklik di tempat lain di halaman.

Singkatnya, ketika Anda memuat halaman, semuanya terlihat baik-baik saja. Di Firefox, jika Anda mengklik tombol radio, satu baris tabel disembunyikan dan yang lainnya langsung ditampilkan. Namun, di IE 6 dan 7, Anda mengklik tombol radio dan tidak ada yang akan terjadi sampai Anda mengklik suatu tempat di halaman. Baru kemudian IE menggambar ulang halaman, menyembunyikan dan menampilkan elemen yang relevan.

Inilah jQuery yang saya gunakan:

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

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

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

Inilah bagian dari XHTML yang mempengaruhi. Seluruh halaman divalidasi sebagai XHTML 1.0 Strict.

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

Jika ada yang tahu mengapa ini terjadi dan bagaimana cara memperbaikinya, mereka akan sangat dihargai!

Jawaban:


96

Coba gunakan .clicksebagai ganti .change.


3
@ Samjudson, dalam pengujian saya ini tidak benar dan klik jquery memicu ketika saya memilih tombol radio berikutnya menggunakan tombol panah. (vista, ie7)
svandragt

1
@ Pasifika: Bukan untuk saya di IE7. Setidaknya itu benar. "klik" adalah peristiwa yang sama sekali berbeda dari "perubahan" dan setidaknya ada beberapa kasus (jika tidak semua) yang merupakan pengganti yang tidak pantas.
Bobby Jack

3
@samjudson: klik acara di tombol radio dan kotak centang juga aktif ketika memilih mereka menggunakan keyboard. Berfungsi di semua peramban
Philippe Leybaert

4
Saya berdiri dikoreksi - yang tampaknya memang demikian, betapapun kontra-intuitifnya!
Bobby Jack

2
Ini tampaknya menjadi jawaban paling populer untuk pertanyaan khusus ini tetapi itu tidak sepenuhnya benar! clickberbeda dari changedalam eventhandler-nya juga akan dipanggil ketika mengklik opsi yang sudah dipilih sedangkan changetidak. Jawaban ini memiliki contoh cara menggunakan jQuery .datauntuk membandingkan nilai lama dan baru.
Laoujin

54

Masalah dengan menggunakan clickacara bukannyachange Anda mendapatkan acara jika kotak radio yang sama dipilih (yaitu belum benar-benar berubah). Ini dapat disaring jika Anda memeriksa bahwa nilai baru berbeda dari yang lama. Saya menemukan ini agak mengganggu.

Jika Anda menggunakan changeacara tersebut, Anda mungkin memperhatikan bahwa itu akan mengenali perubahan setelah Anda mengklik elemen lain di IE. Jika Anda menelepon blur()di clickacara, itu akan menyebabkan changeacara untuk api (hanya jika kotak radio benar-benar memiliki berubah).

Begini cara saya melakukannya:

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

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

Sekarang Anda dapat menggunakan acara perubahan seperti biasa.

Sunting: Menambahkan panggilan untuk fokus () untuk mencegah masalah aksesibilitas (lihat komentar Bobby di bawah).


2
Itu peretasan yang sangat jahat, karena mencegah pengguna Anda bernavigasi menggunakan keyboard, karena fokusnya menghilang setelah memilih tombol radio.
Philippe Leybaert

5
Ini hebat, tetapi menyebabkan masalah aksesibilitas keyboard. Setelah kejadian blur () menyala, tombol radio tidak lagi terpusat, sehingga bergerak di antara tombol radio dengan keyboard menjadi sangat canggung. Solusi saya saat ini adalah menambahkan panggilan ke "this.focus ();" segera setelah pernyataan blur ().
Bobby Jack

1
Saya pikir ini solusi terburuk yang disajikan, karena masalah aksesibilitas.
Philippe Leybaert

11
Tetapi masalah aksesibilitas dapat diatasi dengan panggilan untuk fokus (). Setidaknya sama baiknya dengan menggunakan klik () untuk semuanya.
Bobby Jack

Terima kasih Bobby, saya akan menambahkan itu ke jawabannya.
Mark A. Nicolosi

33

Sudahkah Anda mencoba acara pertukaran properti IE? Saya tidak tahu apakah itu membuat perbedaan tetapi mungkin patut dicoba. IE tidak memicu peristiwa perubahan ketika nilai diperbarui melalui kode JS tapi mungkin pertukaran properti akan bekerja dalam hal ini.

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

"klik" tampaknya tidak berfungsi, tetapi "perubahan properti" berhasil. Terima kasih!
James Kingsbery

Saya mencoba ini di IE8 tidak berfungsi. Itu tidak masuk dalam fungsi.
ARUN

14

Ini juga harus bekerja:

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

Terima kasih Pier. Ini sangat membantu.


Paling tidak, ini adalah jawaban yang jauh lebih baik daripada jawaban yang saat ini diterima / terpilih tertinggi. Ini 'hanya' merusak aksesibilitas keyboard di bawah IE, daripada untuk semua browser yang bagus juga.
Bobby Jack

... meskipun, bukankah ini hanya salinan jawaban Pier?
Bobby Jack

Setuju, ini adalah versi Pier's yang sedikit lebih mudah dibaca tetapi dengan kedua penyeleksi terikat dalam satu panggilan.
Tristan Warner-Smith

Ganti clickdengan click keyup keypressuntuk menambahkan dukungan keyboard.
aloisdg pindah ke codidact.com

6

Di IE Anda harus menggunakan acara klik, di browser lain onchange. Fungsi Anda bisa menjadi

$(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();
                    });     
});

Ganti clickdengan click keyup keypressuntuk menambahkan dukungan keyboard.
aloisdg pindah ke codidact.com

6

tambahkan plugin ini

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

kemudian

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

4

Saya memiliki masalah yang sama dengan teks input.

Aku berubah:

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

untuk

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

dan semuanya bekerja dengan baik untuk saya!


2

Ini adalah cara sederhana untuk memberi tahu IE agar memecat acara perubahan ketika elemen diklik:

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

Anda bisa memperluas ini ke sesuatu yang lebih umum untuk bekerja dengan lebih banyak elemen bentuk:

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

1

Saya cukup yakin ini adalah masalah yang diketahui dengan IE. Menambahkan pawang untuk onclickacara tersebut akan memperbaiki masalah:

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

Di IE, paksa radio dan kotak centang untuk memicu acara "perubahan":

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

1

pada jquery 1.6 ini tidak lagi menjadi masalah .. meskipun tidak pasti kapan diperbaiki .. Syukurlah untuk itu



1

trik dengan klik berfungsi ... tetapi jika Anda ingin mendapatkan kondisi radio atau kotak centang yang benar, Anda dapat menggunakan ini:

(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

saya menggunakan klik bukannya perubahan membuat perilaku yaitu berbeda. Saya lebih suka meniru perubahan perilaku acara menggunakan timer (setTimout).

sesuatu seperti (peringatan - kode notepad):

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 ... agak berat tangan, bukan?
orip

0

coba ini, ini bekerja untuk saya

$("#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

Ini dapat membantu seseorang: Alih-alih memulai dengan id formulir, targetkan id pilih dan kirimkan formulir pada perubahan, seperti ini:

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

dan jQuery:

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

(Jelas, tombol kirim opsional, jika javascript dinonaktifkan)


0

Coba yang berikut ini:

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

0

Hindari menggunakan .focus () atau .select () sebelum .change () fungsi jquery untuk IE, maka itu berfungsi dengan baik, saya menggunakannya di situs saya.

Terima kasih


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

Silakan coba masing - masing alih-alih ganti / klik , yang berfungsi dengan baik bahkan pertama kali di IE dan juga peramban lainnya

Tidak Bekerja pertama kali

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

});

Bekerja dengan baik bahkan untuk pertama kalinya

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

});
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.