Tôi đã dành một chút thời gian để xem xét điều này.
Đây là lý do tại sao điều đó xảy ra.
Chiến lược của nguyên mẫu là mở rộng các lớp phần tử DOM với các hành vi mới, ví dụ như 'ẩn'. Tương đương với:
HTMLElement.prototype.hide = function(...) {...};
jQuery làm cho một giả định rằng nếu một phần tử có một hàm có cùng tên như một sự kiện, sau đó nó được coi là hành vi mặc định của nguyên tố này khi sự kiện được kích hoạt. Ví dụ, điều này rất hữu ích cho các sự kiện 'tập trung', 'mờ', vv, trong đó có cả một sự kiện theo tên 'tập trung' và một hàm phù hợp trên phần tử .focus()
. Khi bạn gọi số event.preventDefault()
của jQuery, nó không thực sự là chặn hành vi mặc định. Thay vào đó là nghịch đảo - nếu bạn không gọi event.preventDefault()
, thì jQuery sẽ tìm một hàm có cùng tên với sự kiện và sau đó gọi hàm đó nếu nó tồn tại.
Đây là src jQuery điều đó bằng tay gọi là "hành vi mặc định" chức năng: https://github.com/jquery/jquery/blob/d837f119c3729565103005d5d7fa89e1dd8110cb/src/event.js#L338
Do đó, chúng tôi có vấn đề của chúng tôi. Prototype mở rộng nguyên mẫu HTMLElement cơ bản với các hàm mới (cụ thể là 'ẩn'). jQuery coi các hàm này là các hành vi mặc định khi một sự kiện có cùng tên được kích hoạt. JS của Bootstrap kích hoạt một sự kiện có cùng tên ('ẩn'), điều này gây nhầm lẫn cho jQuery gọi hàm Element.hide()
của Prototype.
Tôi sẽ xem xét giải pháp dựa trên thông tin này. Có lẽ cái gì đó dọc theo dòng:
jQuery(window).load(function() {
// Defer this code until after the window 'load' event finishes firing
setTimeout(function() {
window.HTMLElement &&
window.HTMLElement.prototype.hide &&
delete window.HTMLElement.prototype.hide;
}, 0);
});
Hãy thử sử dụng này prototype.js thân thiện bootstrap vì nó cố định các vấn đề của tôi: http://stackoverflow.com/questions/19139063/twitter-bootstrap-3-dropdown-menu-disappears-when-used-with- prototype-js – MWD