2013-04-09 34 views
29

Tôi có kịch bản sau đây mà không làm việcjQuery .Trên() phương pháp - thông qua lập luận để xử lý chức năng sự kiện

<script type="text/javascript" > 

    function ADS(e){ alert(e); } 

    $(document).ready(function(){ 
      $(document).on("dblclick","#an_tnam tr", ADS('hello')); 
      $(document).on("dblclick","#kv_tnam tr", ADS('world')); 
      // .... 
}); 

</script> 

làm thế nào tôi có thể vượt qua đối số cho ADS chức năng xử lý sự kiện?

+0

Tốt nhất chắc chắn sẽ được, trong trường hợp này, để chạy nó như là một chức năng mang tính chất giống như một vài có mô tả ở đây. $ ('. El'). On ('click', function() { gọi lại ('đối số') }); –

Trả lời

44

Chức năng .on() mong muốn tham chiếu chức năng được chuyển; những gì bạn đang làm là gọi hàm và chuyển giá trị trả về của nó. Nếu bạn cần phải vượt qua một tham số, bạn sẽ cần phải bao bọc các cuộc gọi trong một chức năng vô danh.

$(document).on('dblclick', '#an_tnam tr', function(event) { 
    ADS('hello'); 
}); 

jQuery luôn chuyển đối tượng sự kiện chuẩn hóa làm đối số đầu tiên cho hàm được thực hiện.

+4

Tất nhiên, nếu hàm 'ADS()' thực sự trả về một đối tượng hàm, mọi thứ sẽ ổn. – Blazemonger

+0

Xin lỗi nhưng đã phải downvote vì câu trả lời này không trả lời được câu hỏi thực, chỉ giải quyết một vấn đề khác. –

+0

@ViniciusTavares Không cần phải xin lỗi về việc downvoting, mặc dù tôi thích nó nếu bạn thực sự giải thích * tại sao * bạn nghĩ vậy. –

3
function ADS(e){ alert(e); } 

$(document).ready(function(){ 
      $(document).on("dblclick","#an_tnam tr", function (e) { ADS('hello') }); 

}); 

sẽ thực hiện thủ thuật.

3
function ADS(e) { 
    return function() { 
     alert(e); 
    }; 
} 

Giống như là khi bạn đang làm

$(document).on("dblclick","#an_tnam tr", ADS('hello')); 

, nó là chức năng quay trở lại được gán như xử lý sự kiện (và đối số chuỗi của bạn được thông qua khi bạn đang giao xử lý, không phải khi nó được gọi là).

5

Khi Anthony Grist chỉ ra, phương pháp .on() đang mong đợi tham chiếu hàm tại phần đó; bạn đang đánh giá một hàm không trả về gì (null).

Tuy nhiên, một tính năng thú vị của JavaScript là mọi thứ đều là đối tượng, kể cả chức năng. Với một sự thay đổi nhỏ, bạn có thể thay đổi ADS() để trả lại một đối tượng chức năng ẩn danh thay vì:

function ADS(e){ 
    return function(){ alert(e); }; 
} 

http://jsfiddle.net/cSbWb/

84

Bạn có thể truyền dữ liệu thêm một sự kiện xử lý chức năng và có thể được truy cập bằng event.data trong xử lý.

$(document).on('dblclick', '#an_tnam tr', { extra : 'random string' }, function(event) 
{ 
    var data = event.data; 

    // Prints 'random string' to the console 
    console.log(data.extra); 
} 

Bạn cũng có thể gửi dữ liệu thêm cho bất kỳ trường hợp bạn muốn khi kích hoạt sự kiện từ một nguồn bên ngoài bằng cách sử dụng .trigger() phương pháp

$('#an_tnam tr').trigger('click', [{ extra : 'random string' }]); 

Sự khác biệt với dữ liệu qua phương pháp kích hoạt là nó hy vọng người xử lý để lấy thêm đối số về độ dài của mảng được truyền vào. Ở trên sẽ mong xử lý có một đối số thừa để chứa đối tượng được truyền vào.

$('#an_tnam tr').on('click', function(event, obj) 
{ 
    // Prints 'random string' to the console 
    console.log(obj.extra); 
} 
+12

Theo như tôi có thể thấy, đây là chỉ câu trả lời thực sự trả lời câu hỏi được hỏi. –

+0

'console.log (data.extra);' <- Bạn không có nghĩa là, trong ví dụ đầu tiên? Và trong 'console.log thứ hai (obj.extra);' có thể hữu ích. –

+0

@ BobStein-VisiBone Tôi đã thêm vào đó để giúp làm rõ. –

2

Trên thực tế, có một cách đơn giản, rất gọn gàng để đạt được điều này, không có lộn xộn thêm và không có chức năng mang tính chất sử dụng JS bind():

$(document).on('dblclick', ADS.bind(null, 'hello')); 

tham số đầu tiên là giá trị mà bạn muốn " này" để có chức năng gọi lại bên trong.

biết thêm trong Developer Network Mozilla: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

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