2012-06-23 71 views
9

JSFiddle

tôi đã thiết lập một select với 3 option s (1 trống) trong fiddle. Khi tôi chuyển đổi từ foo sang bar theo cách thủ công, trình phát nghe change sẽ hoạt động bình thường.jQuery Chosen không bắn onchange sự kiện khi giá trị được thay đổi thông qua JS

Bây giờ nếu tôi thiết lập lại select qua JS với code posted in some answers here, sự kiện change không cháy cho các tùy chọn trống mới được lựa chọn, hơn nữa, nếu tôi chọn tùy chọn được chọn trước khi nhấn vào nút reset sự kiện onchange thắng' t cháy hoặc.

tôi chắc chắn rằng các select 'giá trị s được thay đổi với chức năng ở trên, có thể được nhìn thấy trong fiddle này, nhưng select' s onchange sự kiện chỉ đơn giản là không cháy.

Tôi cũng đã thử onchange, onclick, oninput sự kiện không có kết quả. Ngay bây giờ tôi đang tự hỏi nếu tôi nên sử dụng một MutationObserver hoặc loại bỏ các yếu tố được chọn rendered từ DOM và tạo ra một, nhưng tôi có lẽ overthinking nó. Bất kỳ trợ giúp được đánh giá cao.

Ngoài ra:

Câu trả lời này đã giúp tôi rất nhiều: jQuery Chosen reset

Câu trả lời này không giúp: how to fire onchange event in chosen prototype javascript select box?

Mã để tham khảo trong tương lai nếu jsfiddle.net bị gỡ xuống:

HTML

<div id="wrapper"> 
    <select id="chosen"> 
     <option value="!!EMPTY VALUE!!"></option> 
     <option value="foo">foo</option> 
     <option value="bar">bar</option> 
    </select> 
</div> 
<br> 
<button id="reset">Reset</button> 

JS

$(function() { 
    $('#chosen').chosen(); 

    $('#wrapper').on('change', '#chosen', function() { 
     console.log('onchange: ' + this.value); 
    }); 

    $('#reset').click(function() { 
     $("#chosen").val('').trigger("liszt:updated"); //doesn't work 
     //$("#chosen").prop('selectedIndex', 0).trigger("liszt:updated"); //doesn't work either 
     console.log('reset: ' + $('option:selected').val()); 
    }); 
}); 
+0

** ASP.Net Webforms **: Tôi đã xem qua câu hỏi này khi ứng dụng của tôi dường như gặp sự cố này nhưng hóa ra lại là lỗi Javascript do Trình xác thực ASP WebForm gây ra. Hãy xem [vé jQuery-UI] này (http://bugs.jqueryui.com/ticket/4071#comment:9) – sparebytes

Trả lời

9

Bạn cần phải kích hoạt sự thay đổi sau khi bạn thay đổi giá trị với $(selector).trigger("change")

$('#reset').click(function() { 
     $("#chosen").val('').trigger("change"); //doesn't work 
     //$("#chosen").prop('selectedIndex', 0).trigger("liszt:updated"); 
     console.log('reset: ' + $('option:selected').val()); 
    }); 
+1

*** Mặt cực kỳ khó chịu. Ôi trời, cảm ơn người đàn ông! –

+0

9 phút cho đến khi tôi có thể chấp nhận. =] –

+0

Bạn được chào đón!:] –

4

Sao chép câu trả lời ra khỏi ý kiến ​​của Fabrício mờ mà làm việc cho tôi để những người khác don 't thấy bài đăng này và bỏ lỡ một giải pháp lúc đầu như tôi đã làm.

$('#chosen_chzn').remove(); 
$('#chosen').val('').change().removeClass('chzn-done').chosen(); 

See this on his Fiddle

tôi ban đầu đã cố gắng để tiếp tục sử dụng .trigger('liszt:updated') cuộc gọi thay vì .change() nhưng điều đó không làm việc. Không thấy lý do đằng sau .removeClass('chzn-done'), nhưng điều này cũng rất cần thiết hoặc hộp chọn của bạn sẽ biến mất.

+3

Thực ra, tôi nghĩ tôi đã tìm thấy một giải pháp "tốt hơn" khác. Không quá chắc chắn. Tôi nghĩ rằng tôi chỉ cần nâng cấp lên [Chọn 2] (http://ivaynberg.github.com/select2/) mà cháy sự kiện 'thay đổi' chỉ bằng cách gọi' .change() 'trên đầu vào ban đầu. –

+1

+1 mặc dù đối với những người bị mắc kẹt với Chosen, tôi không hoàn toàn nhớ lý do đằng sau việc loại bỏ lớp 'chzn-done' nhưng tôi hoàn toàn chắc chắn đó là vì' chzn-done' áp dụng 'display: none' cho 'select' các phần tử mà bạn đã gọi là' .chosen() 'trên, và gọi' .chosen() 'trên các phần tử với lớp đó sẽ không hoạt động. –

+1

Tôi tin rằng nếu bạn không loại bỏ chzn-done sau đó gọi được chọn() không có gì - nó tin rằng nó đã thiết lập chính nó lên. Sắp xếp của một bảo vệ người nghèo Mans. – Andy

Các vấn đề liên quan