Bắt jQuery nhận ra .change () trong IE


131

Tôi đang sử dụng jQuery để ẩn và hiển thị các thành phần khi nhóm nút radio bị thay đổi / nhấp. Nó hoạt động tốt trong các trình duyệt như Firefox, nhưng trong IE 6 và 7, hành động chỉ xảy ra khi người dùng sau đó nhấp vào một nơi khác trên trang.

Để giải thích, khi bạn tải trang, mọi thứ đều ổn. Trong Firefox, nếu bạn nhấp vào nút radio, một hàng trong bảng sẽ bị ẩn và một hàng khác được hiển thị ngay lập tức. Tuy nhiên, trong IE 6 và 7, bạn nhấp vào nút radio và sẽ không có gì xảy ra cho đến khi bạn nhấp vào đâu đó trên trang. Chỉ sau đó IE mới vẽ lại trang, ẩn và hiển thị các yếu tố liên quan.

Đây là jQuery tôi đang sử dụng:

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

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

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

Đây là một phần của XHTML mà nó ảnh hưởng. Toàn bộ trang xác nhận là 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>

Nếu bất cứ ai có bất kỳ ý tưởng tại sao điều này xảy ra và làm thế nào để khắc phục nó, họ sẽ được đánh giá rất cao!

Câu trả lời:


96

Hãy thử sử dụng .clickthay vì .change.


3
@samjudson, trong thử nghiệm của tôi, điều này không chính xác và nhấp chuột của jquery sẽ kích hoạt khi tôi chọn nút radio tiếp theo bằng các phím mũi tên. (vista,
eg7

1
@Pacifika: Không dành cho tôi trong IE7. Ít nhất là nó đúng. "Nhấp chuột" là một sự kiện hoàn toàn khác với "thay đổi" và có ít nhất một số trường hợp (nếu không phải tất cả) trong đó đó là một sự thay thế không phù hợp.
Bobby Jack

3
@samjudson: nhấp vào các sự kiện trên các nút radio và hộp kiểm cũng kích hoạt khi chọn chúng bằng bàn phím. Hoạt động trên tất cả các trình duyệt
Philippe Leybaert

4
Tôi đứng chính xác - điều đó dường như là trường hợp, tuy nhiên nó có thể phản tác dụng!
Bobby Jack

2
Đây dường như là câu trả lời phổ biến nhất cho câu hỏi đặc biệt này nhưng nó không hoàn toàn chính xác! clickkhác với changetrong đó eventhandler của nó cũng sẽ được gọi khi nhấp vào tùy chọn đã chọn trong khi changekhông. Câu trả lời này có một ví dụ về cách sử dụng jQuery .datađể so sánh các giá trị cũ và mới.
Laoujin

54

Vấn đề với việc sử dụng clicksự kiện thay vìchange bạn nhận được sự kiện nếu hộp radio tương tự được chọn (nghĩa là chưa thực sự thay đổi). Điều này có thể được lọc ra nếu bạn kiểm tra xem giá trị mới có khác với giá trị cũ không. Tôi thấy điều này hơi khó chịu.

Nếu bạn sử dụng changesự kiện, bạn có thể nhận thấy rằng nó sẽ nhận ra sự thay đổi sau khi bạn nhấp vào bất kỳ yếu tố nào khác trong IE. Nếu bạn gọi blur()trong clicksự kiện, nó sẽ khiến changesự kiện phát sinh (chỉ khi các hộp radio thực sự có sự thay đổi).

Đây là cách tôi đang làm:

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

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

Bây giờ bạn có thể sử dụng sự kiện thay đổi như bình thường.

Chỉnh sửa: Đã thêm một cuộc gọi để tập trung () để ngăn các sự cố về khả năng truy cập (xem bình luận của Bobby bên dưới).


2
Đó là một hack rất ác, bởi vì nó ngăn người dùng của bạn điều hướng bằng bàn phím, vì tiêu điểm biến mất sau khi chọn nút radio.
Philippe Leybaert

5
Điều này là tuyệt vời, nhưng nó gây ra vấn đề tiếp cận bàn phím. Khi sự kiện Blur () đã kích hoạt, nút radio không còn tập trung nữa, do đó việc di chuyển giữa các nút radio bằng bàn phím trở nên vô cùng khó xử. Giải pháp hiện tại của tôi là thêm một cuộc gọi đến "this.f Focus ();" ngay sau câu lệnh Blur ().
Bobby Jack

1
Tôi nghĩ đó là giải pháp tồi tệ nhất được trình bày, vì các vấn đề tiếp cận.
Philippe Leybaert

11
Nhưng vấn đề tiếp cận có thể được giải quyết bằng một cuộc gọi để tập trung (). Ít nhất là tốt như sử dụng click () cho mọi thứ.
Bobby Jack

Cảm ơn Bobby, tôi sẽ thêm nó vào câu trả lời.
Đánh dấu A. Nicolosi

33

Bạn đã thử sự kiện onpropertychange của IE chưa? Tôi không biết nếu nó làm cho một sự khác biệt nhưng nó có thể đáng thử. IE không kích hoạt sự kiện thay đổi khi các giá trị được cập nhật thông qua mã JS nhưng có lẽ onpropertychange sẽ hoạt động trong trường hợp này.

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

"Nhấp chuột" dường như không hoạt động, nhưng "trao đổi tài sản" đã làm. Cảm ơn!
James Kingsbery

Tôi đã thử điều này trong IE8 nó không hoạt động. Nó không đến bên trong chức năng.
ARUN

14

Điều này cũng nên làm việc:

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

Cảm ơn bến tàu. Điều này rất hữu ích.


Đây là, ít nhất, một câu trả lời tốt hơn nhiều so với câu trả lời được chấp nhận / bình chọn cao nhất hiện nay. Nó 'chỉ' phá vỡ khả năng truy cập bàn phím trong IE, thay vì cho tất cả các trình duyệt tốt.
Bobby Jack

... mặc dù, đây không phải là một bản sao câu trả lời của Pier sao?
Bobby Jack

Đồng ý, đây là phiên bản hơi khó đọc của Pier nhưng với cả hai bộ chọn bị ràng buộc trong một cuộc gọi.
Tristan Warner-Smith

Thay thế clickbằng click keyup keypressđể thêm hỗ trợ bàn phím.
aloisdg chuyển đến codidact.com

6

Trong IE, bạn phải sử dụng sự kiện nhấp chuột, trong các trình duyệt khác. Chức năng của bạn có thể trở thành

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

Thay thế clickbằng click keyup keypressđể thêm hỗ trợ bàn phím.
aloisdg chuyển đến codidact.com

6

thêm plugin này

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

sau đó

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

4

Tôi đã có cùng một vấn đề với văn bản đầu vào.

Tôi đã thay đổi:

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

đến

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

và mọi thứ đang làm việc tốt cho tôi!


2

Đây là một cách đơn giản để yêu cầu IE kích hoạt sự kiện thay đổi khi phần tử được nhấp:

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

Bạn có thể mở rộng điều này thành một cái gì đó chung chung hơn để làm việc với nhiều yếu tố hình thức hơn:

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

1

Tôi khá chắc chắn đây là một vấn đề được biết đến với IE. Thêm một trình xử lý cho onclicksự kiện sẽ khắc phục vấn đề:

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

Trong IE, buộc radio và các hộp kiểm kích hoạt sự kiện "thay đổi":

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

1

kể từ jquery 1.6, điều này không còn là vấn đề nữa .. không chắc là nó đã được sửa chữa khi nào .. Cảm ơn chúa vì điều đó



1

Thủ thuật với nhấp chuột hoạt động ... nhưng nếu bạn muốn có trạng thái radio hoặc hộp kiểm chính xác, bạn có thể sử dụng:

(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 sử dụng nhấp thay vì thay đổi làm cho hành vi tức là khác nhau. Tôi muốn mô phỏng hành vi sự kiện thay đổi bằng cách sử dụng bộ đếm thời gian (setTimout).

một cái gì đó như (cảnh báo - mã 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 ... hơi nặng tay phải không?
orip

0

Hãy thử nó, nó hoạt động với tôi

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

Điều này có thể giúp ai đó: Thay vì bắt đầu với id của biểu mẫu, hãy nhắm mục tiêu id chọn và gửi biểu mẫu khi thay đổi, như sau:

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

và jQuery:

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

(Rõ ràng, nút gửi là tùy chọn, trong trường hợp javascript bị tắt)


0

Hãy thử như sau:

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

0

Tránh sử dụng .f Focus () hoặc .select () trước hàm .change () của jquery cho IE, sau đó nó hoạt động tốt, tôi đang sử dụng nó trong trang web của tôi.

Cảm ơn


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

Vui lòng thử sử dụng từng thay vì thay đổi / nhấp chuột , hoạt động tốt ngay cả lần đầu tiên trong IE cũng như các trình duyệt khác

Không làm việc lần đầu

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

});

Làm việc tốt ngay cả lần đầu tiên

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

});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.