Với mã jQuery như:
$("#myid").click(myfunction);
function myfunction(arg1, arg2) {/* something */}
Làm cách nào để chuyển các đối số tới myfunction
khi sử dụng jQuery?
Với mã jQuery như:
$("#myid").click(myfunction);
function myfunction(arg1, arg2) {/* something */}
Làm cách nào để chuyển các đối số tới myfunction
khi sử dụng jQuery?
Câu trả lời:
Cách đơn giản nhất là làm như vậy (giả sử bạn không muốn bất kỳ thông tin sự kiện nào được truyền vào hàm) ...
$("#myid").click(function() {
myfunction(arg1, arg2);
});
jsFiddle .
Điều này tạo ra một hàm ẩn danh, được gọi khi click
sự kiện được kích hoạt. Điều này sẽ lần lượt gọi myfunction()
với các đối số bạn cung cấp.
Nếu bạn muốn giữ nguyên ThisBinding
(giá trị của this
thời điểm hàm được gọi, đặt thành phần tử đã kích hoạt sự kiện), thì hãy gọi hàm với call()
.
$("#myid").click(function() {
myfunction.call(this, arg1, arg2);
});
jsFiddle .
Bạn không thể chuyển trực tiếp tham chiếu theo cách ví dụ của bạn trạng thái hoặc đối số duy nhất của nó sẽ là đối tượng jQueryevent
.
Nếu bạn làm muốn vượt qua các tài liệu tham khảo, bạn phải tận dụng jQuery proxy()
chức năng (mà là một trình duyệt wrapper chéo cho Function.prototype.bind()
). Điều này cho phép bạn vượt qua đối số, mà đang bị ràng buộc trước khi các event
cuộc tranh cãi.
$("#myid").click($.proxy(myfunction, null, arg1, arg2));
jsFiddle .
Trong ví dụ này, myfunction()
sẽ được thực hiện với nó ThisBinding
còn nguyên vẹn ( null
không phải là một đối tượng, do đó bình thường this
giá trị của phần tử đã kích hoạt sự kiện này được sử dụng), cùng với các đối số (theo thứ tự) arg1
, arg2
và cuối cùng là jQuery event
đối tượng mà bạn có thể bỏ qua nếu nó không bắt buộc (thậm chí không đặt tên nó trong các đối số của hàm).
Bạn cũng có thể sử dụng sử dụng event
đối tượng jQuery data
để truyền dữ liệu, nhưng điều này sẽ yêu cầu sửa đổi myfunction()
để truy cập nó thông qua event.data.arg1
(không phải là đối số hàm như câu hỏi của bạn đề cập) hoặc ít nhất là giới thiệu một hàm proxy thủ công như ví dụ trước đây hoặc một hàm được tạo bằng cách sử dụng ví dụ sau.
myfunction(this, arg1, arg2)
từ trình xử lý ẩn danh. Sau đó, chức năng của bạn có thể làmmyfunction(el, arg1, arg2) { alert($(el).val()); }
myfunction.call(this, arg1, arg2)
.
$("#myid").on('click', {arg1: 'hello', arg2: 'bye'}, myfunction);
function myfunction(e) {
var arg1 = e.data.arg1;
var arg2 = e.data.arg2;
alert(arg1);
alert(arg2);
}
//call method directly:
myfunction({
arg1: 'hello agian',
arg2: 'bye again'
});
Cũng cho phép bạn liên kết và hủy liên kết các trình xử lý sự kiện cụ thể bằng cách sử dụng các phương pháp bật và tắt.
Thí dụ:
$("#myid").off('click', myfunction);
Thao tác này sẽ hủy liên kết trình xử lý chức năng khỏi #myid
trong khi bạn chắc chắn nên sử dụng câu trả lời của Alex, phương thức "ràng buộc" của thư viện nguyên mẫu đã được chuẩn hóa trong Ecmascript 5 và sẽ sớm được triển khai trên các trình duyệt nguyên bản. Nó hoạt động như thế này:
jQuery("#myid").click(myfunction.bind(this, arg1, arg2));
this
được đặt thành ngữ cảnh khác nếu bạn sử dụng phương thức này, ví dụ: nhập bind()
nó vào this
trong ngữ cảnh đó (toàn cục) có thể dẫn đến việc xử lý nhấp chuột đó có window
đối tượng this
trái ngược với tham chiếu đến #myid
phần tử?
people reading my answers are smart enough to figure these details out themselves
, không phải về Ecmascript.
Chủ đề cũ, nhưng dành cho mục đích tìm kiếm; thử:
$(selector).on('mouseover',...);
... và xem thông số "data": http://api.jquery.com/on/
ví dụ:
function greet( event ) {
alert( "Hello " + event.data.name );
}
$( "button" ).on( "click", {name: "Karl"}, greet );
$( "button" ).on( "click", {name: "Addy"}, greet );