2010-08-04 34 views
12

có lẽ tôi là hoàn toàn mất tích một cái gì đó về ngay cả xử lý trong jQuery, nhưng đây là vấn đề của tôi.jquery tạm thời unbinding sự kiện

Giả sử có một số sự kiện ràng buộc, như

$(element).bind("mousemove", somefunc); 

Bây giờ, tôi muốn giới thiệu một MouseMove mới ràng buộc mà không ghi đè lên trước đó, nhưng tạm thời loại trừ (unbind) nó. Nói cách khác, khi tôi liên kết chức năng của mình, tôi phải chắc chắn rằng không có chức năng nào khác sẽ thực hiện cho sự kiện đó, cho đến khi tôi khôi phục chúng.

Tôi đang tìm một cái gì đó như:

$(element).bind("mousemove", somefunc); 
// Somefunc is used regularly 
var savedBinding = $(element).getCurrentBinding("mousemove"); 
$(element).unbind("mousemove").bind("mousemove", myfunc); 
// Use myfunc instead 
$(element).unbind("mousemove", myfunc).bind("mousemove", savedBindings); 

Tất nhiên, somefunc không phải là dưới sự kiểm soát của tôi, hay đây sẽ là vô ích :)

là sự hiểu biết của tôi rằng có thể để ràng buộc nhiều các hàm cho cùng một sự kiện và việc thực hiện các hàm đó không thể được xác định trước. Tôi biết dừng việc truyền sự kiện và tuyên truyền sự kiện ngay lập tức, nhưng tôi nghĩ rằng chúng vô dụng trong trường hợp của tôi, vì lệnh thực thi không thể xác định được (nhưng có lẽ tôi nhận được sai).

Tôi có thể làm như thế nào? Cảm ơn trước ~ Aki

EDIT: Tôi cần làm nổi bật điều này: Tôi cần rằng trình xử lý được cài đặt trước đó (somefunc) không được thực hiện. Tôi KHÔNG xác định rằng trình xử lý đó có thể có hoặc không có, nhưng được cài đặt bởi người dùng bên thứ ba.

EDIT2: Ok, điều này là không khả thi ngay bây giờ, tôi nghĩ rằng tôi đang cần eventListenerList, mà không được thực hiện trong hầu hết các trình duyệt được nêu ra. http://www.w3.org/TR/2002/WD-DOM-Level-3-Events-20020208/changes.html

Trả lời

7

Một cách khác có thể sử dụng các sự kiện tùy chỉnh, một cái gì đó dọc theo những dòng:

var flag = 0; 
$(element).bind("mousemove", function() { 
    if(flag) { 
     $(this).trigger("supermousemove"); 
    } else { 
     $(this).trigger("magicmousemove"); 
    } 
}).bind("supermousemove", function() { 
    // do something super 
}).bind("magicmousemove", function() { 
    // do something magical 
}); 

$("#foo").click(function() { 
    flag = flag == 1 ? 0 : 1; // simple switch 
}); 

cao gây phiền nhiễu bản demo ở đây: http://jsfiddle.net/SkFvW/

+0

Chà! Tôi đã không tink đó :) Điều này hoàn toàn có thể làm việc! Cảm ơn! – AkiRoss

+0

Rất tiếc, xin lỗi, tôi đã sai: giải pháp đó không hoạt động, vì tôi cần tắt trình xử lý mousemove trước đó đã được liên kết. – AkiRoss

+0

@AkiRoss - Tại sao bạn cần tắt trình xử lý trước đó? Bằng cách lật công tắc, bạn sẽ có được hiệu ứng tương tự. – JasCav

0

Tốt nếu sự kiện là ràng buộc để nhiều yếu tố:

$('.foo').click(function() { 
    if (! $(this).hasClass('flag')) { 
     do something 
    } 
}); 

(thêm cờ 'lớp' để sắp xếp không liên kết, thêm nó vào 'ràng buộc')

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