2010-02-01 16 views
24

Các jQuery .data() documentation nói như sau:Lưu trữ một chức năng với các dữ liệu jQuery() phương pháp

The .data() method allows us to attach data of any type to DOM element 

tôi giả "bất kỳ loại" đề cập đến chức năng là tốt. Giả sử tôi có div với id foo như vậy:

<div id="foo">Foo!</div> 

Và tôi muốn lưu trữ một hàm trong đó gọi là say có tham số. Theo tài liệu tôi muốn lưu trữ các chức năng theo cách này:

$("#foo").data("say", function(message){ 
    alert("Foo says "+message); 
}); 

Câu hỏi của tôi là, làm thế nào để gọi hàm với một tham số khi tôi muốn làm như vậy.

$("#foo").data("say"); phải trả về hàm, nhưng làm cách nào để chuyển một tham số cho hàm?

Cảm ơn!

Trả lời

25
var myFunction = $("#foo").data("say"); 
myFunction(someParameter); 
+0

thú vị! tôi sẽ thử. cảm ơn! –

+11

'$ (" # foo "). Dữ liệu (" say ") (" hello ");' có vẻ hoạt động tốt. – Kobi

41

Một lựa chọn tốt hơn để lưu trữ các chức năng trong data đang sử dụng các sự kiện tùy chỉnh. Điều này có thể được thực hiện dễ dàng với ontrigger:

$('#foo').on('say', function(e, arg){ 
    alert('Foo says ' + arg); 
}); 

$('#foo').trigger('say', 'hello'); 

Ví dụ: http://jsfiddle.net/tW66j/

Lưu ý: trên các phiên bản trước đó của jQuery (cho đến 1.7), .bind được sử dụng thay cho .on.

+0

+1 - đây là lời khuyên tuyệt vời, nhưng Darin đã trả lời chính xác câu hỏi của tôi. Cảm ơn bạn rất nhiều. –

+0

đôi khi nó hữu ích. xem xét trường hợp bạn muốn có cách thống nhất để tìm nạp dữ liệu được liên kết ngữ nghĩa với nút DOM, nhưng việc triển khai tìm nạp dữ liệu thay đổi tùy thuộc vào loại nút. – bjornl

+0

Dĩ nhiên, chúng ta có thể lưu trữ một XPath hoặc đích đối tượng nút đích DOM để tìm nạp nhưng một hàm gọi lại có khả năng mở rộng hơn và không yêu cầu sao chép đối tượng nút DOM – bjornl

4

Đây là cách thanh lịch hơn để gọi phương thức.

// store the method with data 
$('#foo').data('bar',function(){console.log("Givin it the business!")}); 

// Simple execution (this will not keep the method in scope) 
$('#foo').data('bar')(); 

// scoped method execution with call([scope,arguments[]]), takes arguments with comma separation 
$('#foo').data('bar').call($('#foo').first()[0],'arguemnts','for','method'); 

// scoped method execution with apply(scope[,argument[]]), takes an array of arguments 
$('#foo').data('bar').apply($('#foo').first()[0],['arguemnts','for','method']); 

Áp dụng Phương pháp: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply

Gọi Phương pháp: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call

+1

Tính năng lưu trữ và gọi điện cao cấp sử dụng .data. Tuy nhiên, tôi đã thử điều này và khi bạn gọi một hàm được lưu trữ theo cách này '$ ('# foo'). Data ('bar')();' nó mất bối cảnh của nó. $ (this) bây giờ đề cập đến DOMWindow, không phải là $ (# foo). Tuy nhiên, giải pháp của Kobi vẫn giữ được ngữ cảnh của hàm cho $ (this). – noir

+0

vâng, đó không phải là cách giữ nó trong phạm vi, bạn sẽ cần phải sử dụng cuộc gọi hoặc áp dụng phương pháp để giữ cho việc thực hiện trong phạm vi. –

+0

phiên bản jquery nào được yêu cầu cho thuộc tính data() – Mou

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