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!

Philip Morton
sumber

Jawaban:

96

Coba gunakan .clicksebagai ganti .change.

Paolo Bergantino
sumber
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).

Mark A. Nicolosi
sumber
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 
}); 
Kevin
sumber
"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.


sumber
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();
                    });     
});
Dermaga Luigi
sumber
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
    });
});
dovidweisz
sumber
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!

luar biasa
sumber
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();
    });
}
paul
sumber
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();
    });     
});
Chris Zwiryk
sumber
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');
  });
Jeoff Wilks
sumber
1

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

Baz1nga
sumber
1

Jika Anda mengubah versi jQuery Anda ke 1.5.1, Anda tidak perlu menyesuaikan kode Anda. Kemudian IE9 akan mendengarkan dengan sempurna untuk:

$(SELECTOR).change(function() {
    // Shizzle
});

http://code.jquery.com/jquery-1.5.1.min.js

Bas Matthee
sumber
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
})
nostop
sumber
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
});
Ken Egozi
sumber
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')});
RainChen
sumber
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)

Jongosi
sumber
0

Coba yang berikut ini:

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

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

Terima kasih

muhammadanish
sumber
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;
       });
}
kiev
sumber
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 () {

});
Dayanand Rupanavar
sumber