Vì vậy, bạn có thể thực hiện điều gì đó giống như bạn muốn trong một số trường hợp nhất định. Cụ thể, nếu
- Bạn có thể tải riêng của bạn JavaScript trước bản gốc
- Bạn biết yếu tố nào bạn đang lắng nghe người khác để ném các sự kiện trên
có hiệu quả, những gì bạn làm là thay thế bản gốc phương thức addEventListener trên phần tử target với một phần tử tùy chỉnh chặn cuộc gọi, thực hiện một số xử lý đặc biệt, và sau đó cho phép nó tiếp tục bình thường. 'Xử lý đặc biệt' này là một hàm mới kết thúc cuộc gọi lại ban đầu và đánh dấu các đối số sự kiện với một số trạng thái để cho bạn biết người khác đã trao đổi sự kiện này. Đây là một bằng chứng của khái niệm (với một jsFiddle)
Target HTML:
<div id='asdf'>asdf</div>
JavaScript:
var target = document.getElementById('asdf');
var original = target.addEventListener;
var updated = function(){
// Grab the original callback, so we can use it in our wrapper
var originalFunc = arguments[1];
// Create new function for the callback, that lets us set a state letting us know it has been handled by someone
// Finish the callback by executing the original callback
var newFunc = function(e){
console.log('haha, intercepted you');
e.intercepted = true;
originalFunc.call(this, e);
};
// Set the new function in place in the original arguments 'array'
arguments[1] = newFunc;
// Perform the standard addEventListener logic with our new wrapper function
original.apply(this, arguments);
};
// Set the addEventListener on our target to our modified version
target.addEventListener = updated;
// Standard event handling
target.addEventListener('click', function(e){
console.log('original click');
console.log('intercepted?', e.intercepted);
})
Các sự kiện nhấp mà bạn không kiểm soát bị ràng buộc như thế nào? –
Tôi thực sự không thể biết, vì đây là một phần của thư viện có thể được sử dụng với các loại trang khác nhau. Có thể là addEventListener hoặc onXXX. – Grodriguez
Vâng, 'addEventListener' làm cho nó khó hơn. Đối với các kiểu [event], bạn có thể có nó để handler của bạn liên kết với tài liệu bắt đầu với 'e.target', và kiểm tra nó và tổ tiên của nó để xem cái nào có handler, sau đó bọc nó với một hàm gọi 'stopPropagation'. Nhưng 'addEventListener' sẽ không cho phép bạn làm điều đó. –