2010-05-22 28 views
5

Tôi có một trang với một danh sách chọn (ASP.NET MVC Page)Html Select List: tại sao onchange lại được gọi hai lần?

Các chọn danh sách và onchange kiện quy định như thế này:

<%=Html.DropDownList("CompanyID", Model.CompanySelectList, "(select company)", new { @class = "data-entry-field", @onchange = "companySelectListChanged()" })%> 

Chức năng companySelectListChanged là nhận được gọi là hai lần?

Tôi đang sử dụng mã tiện lợi trong số this question để nhận người gọi.

cả lần so với người gọi là sự kiện onchange, tuy nhiên nếu tôi nhìn vào những người gọi người gọi sử dụng:

arguments.callee.caller.caller 

cuộc gọi đầu tiên trả về một số mã hệ thống như người gọi (tôi đoán) và trở về cuộc gọi thứ hai không xác định .

Tôi đang kiểm tra không xác định để chỉ phản ứng một lần để trao đổi, nhưng điều này dường như không lý tưởng, whcy sẽ onchange được gọi là hai lần?

UPDATE:

ok, tìm ra thủ phạm! ... ngoài tôi :-) nhưng vấn đề gọi công tySelectListChanged chức năng hai lần vẫn đứng.

Sự kiện trao đổi được đặt trực tiếp trên lựa chọn như đã đề cập. Điều này gọi hàm companySelectListChanged.

.. chú ý lớp 'data-entry-field', bây giờ trong tệp javascript được liên kết riêng biệt, sự kiện thay đổi trên tất cả các trường có lớp này được liên kết với chức năng thay đổi màu của nút lưu. Điều này có nghĩa là có hai sự kiện trên onchange, nhưng công tySelectListChanged được gọi hai lần?

Các thêm ràng buộc được thiết lập như sau:.

$ ('dữ liệu nhập cảnh trường ') bind (' bấm phím thay đổi KeyUp', function (e) {highLightSaveButtons();});

Giả sử có thể có 2 sự kiện thay đổi trong danh sách lựa chọn, giả định rằng cài đặt bấm phím & có thể làm hỏng sự kiện?

Bất kỳ ý tưởng nào?

KHÁC UPDATE:

Các yếu tố lựa chọn có vẻ tốt đẹp và tất cả các công trình nếu tôi loại bỏ các thêm 'thay đổi' ràng buộc. khi liên kết 'thay đổi' được thêm vào, sự kiện đó sẽ kích hoạt một lần và 'onchange' có dây được kích hoạt hai lần.

Nếu cả hai sự kiện bị ràng buộc thông qua jQuery, tất cả các công trình đều ok, có vẻ như không thể trộn lẫn các sự kiện thay đổi liên kết onchange và jquery có dây cứng? Tôi đoán điều này trả lời câu hỏi của tôi nhưng có vẻ như một vấn đề với IE và ràng buộc các sự kiện này với jquery.

+0

Bạn có thể tách sự cố thành một ứng dụng đơn giản mà bạn có thể đăng toàn bộ mã của bộ điều khiển và chế độ xem không? –

+0

Bạn có mã nào khác sử dụng cách tiếp cận khác để gắn trình xử lý sự kiện vào phần tử không? Những gì bạn mô tả các âm thanh như hàm được đăng ký như một trình xử lý sự kiện * hai lần * - một lần trong cài đặt trực tiếp của thuộc tính 'onclick' và một lần qua một số cơ chế khác (ví dụ,' attachEvent() 'hoặc thông qua một khung như Prototype hoặc jQuery). – Pointy

+0

Sự kiện onchange bị ràng buộc trực tiếp vào danh sách chọn như đã đề cập, hàm companySelectListChanged() gọi hai hàm khác tạo các bài viết jquery ajax. không có mã nào khác ràng buộc sự kiện onchange. –

Trả lời

3

Tôi đồng ý với đánh giá của bạn. Tôi đã cập nhật ví dụ nhỏ của mình tại http://gutfullofbeer.net/onchange.html để bao gồm trình xử lý jQuery ngoài trình xử lý DOM 0 (bộ xử lý có thuộc tính "onchange"). Nó dường như là một lỗi jQuery, hoặc ít nhất là một thất bại của jQuery để đối phó với sự kỳ lạ của IE.

Tôi đã đăng nhập Vé jQuery 6593.

+0

Cảm ơn sự giúp đỡ của bạn. –

+0

Không vấn đề gì - cảm ơn bạn đã khám phá ra một lỗi mới thú vị! – Pointy

2

Tôi cũng gặp sự cố này khi sử dụng IE8 và thực hiện một số thay đổi để khắc phục sự cố này.

Thay vì chỉ định sự kiện onchange trên danh sách thả xuống, tôi đã sử dụng sự kiện jquery.change().

Markup:

@Html.DropDownList("drpList", myList, new { @class = "myClass", id = "drpList" }) 

Script:

$(function() { 
    $('#drpList').change(function() { 
    .... your functionality 
    }); 
}); 

này làm việc cho tôi .. Hy vọng sự giúp đỡ này.

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