jQuery's .click - truyền tham số cho hàm người dùng


283

Tôi đang cố gắng gọi một hàm với các tham số bằng cách sử dụng .click của jQuery, nhưng tôi không thể làm cho nó hoạt động được.

Đây là cách tôi muốn nó hoạt động:

$('.leadtoscore').click(add_event('shot'));

mà gọi

function add_event(event) {
    blah blah blah }

Nó hoạt động nếu tôi không sử dụng các tham số, như thế này:

$('.leadtoscore').click(add_event);
function add_event() {
    blah blah blah }

Nhưng tôi cần có khả năng truyền tham số cho add_eventhàm của mình .

Làm thế nào tôi có thể làm điều cụ thể này?

Tôi biết tôi có thể sử dụng .click(function() { blah }, nhưng tôi gọi add_eventhàm từ nhiều nơi và muốn làm theo cách này.


điều này được thông qua từ patrickscâu trả lời, mà tôi nghĩ là một giải pháp tuyệt vời: jsfiddle.net/naRRk/1
jAndy

Câu trả lời:


514

Để tìm hiểu kỹ, tôi đã tìm thấy một giải pháp khác là một phần của chức năng được giới thiệu trong phiên bản 1.4.3 của trình xử lý sự kiện nhấp chuột jQuery .

Nó cho phép bạn truyền bản đồ dữ liệu đến đối tượng sự kiện tự động được đưa trở lại hàm xử lý sự kiện bằng jQuery làm tham số đầu tiên. Bản đồ dữ liệu sẽ được trao cho .click()hàm dưới dạng tham số đầu tiên, theo sau là hàm xử lý sự kiện.

Đây là một số mã để minh họa điều tôi muốn nói:

// say your selector and click handler looks something like this...
$("some selector").click({param1: "Hello", param2: "World"}, cool_function);

// in your function, just grab the event object and go crazy...
function cool_function(event){
    alert(event.data.param1);
    alert(event.data.param2);
}

Tôi biết rằng đã muộn trong trò chơi cho câu hỏi này, nhưng các câu trả lời trước đã đưa tôi đến giải pháp này, vì vậy tôi hy vọng nó sẽ giúp được ai đó!


11
Đây chính xác là những gì tôi muốn (sau đó). Tôi đã không làm việc với dự án này kể từ đó, nhưng tôi nghĩ rằng tôi đã sử dụng 1.4.0. Đây chắc chắn là cách tốt nhất có sẵn.
Paul Hoffer

1
Tôi đang tự động tạo đối tượng ở phía máy chủ và liên kết sự kiện nhấp bằng: r.OnClientClick = "imageClicky ({param1: '" + obj.Command + "'}); return false"; Sau đó, về phía máy khách, tôi có: function imageClicky (event) {if (event.param1 == "GOTO PREVIOUS") {... Nếu tôi sử dụng event.data.param1 thì nó nói rằng nó không xác định. Bây giờ tôi đã gõ nó ra đây, tôi có thể thấy sự khác biệt, d'oh!
Gia đình

1
@ Gia đình - Haaha không có vấn đề gì, thật tốt khi được giúp đỡ, thậm chí thông qua các bình luận;)
Chris Kempen

5
@totymedli - Tôi đoán bạn luôn có thể gọi nó ở một nơi khác, đi qua một đối tượng có cùng cấu trúc : var param_obj = {data : {param1: "Hello", param2: "World"}}; cool_function(param_obj);?
Chris Kempen

1
Điều này tốt hơn nhiều so với việc sử dụng các thuộc tính dữ liệu HTML5, cảm ơn bạn! (Và giải quyết JSHint phàn nàn về việc sử dụng 'cái này' trong cuộc gọi lại!)
Matthew Herbst

77

Bạn cần sử dụng một chức năng ẩn danh như thế này:

$('.leadtoscore').click(function() {
  add_event('shot')
});

Bạn có thể gọi nó như bạn có trong ví dụ, chỉ là một tên hàm không có tham số, như thế này:

$('.leadtoscore').click(add_event);

Nhưng add_eventphương thức sẽ không nhận được 'shot'như tham số của nó, mà là bất cứ điều gì clickchuyển qua gọi lại, chính là eventđối tượng ... vì vậy nó không áp dụng được trong trường hợp này , nhưng hoạt động cho nhiều người khác. Nếu bạn cần truyền tham số, hãy sử dụng hàm ẩn danh ... hoặc, có một tùy chọn khác , hãy sử dụng.bind() và truyền dữ liệu, như sau:

$('.leadtoscore').bind('click', { param: 'shot' }, add_event);

Và truy cập nó vào add_event, như thế này:

function add_event(event) {
  //event.data.param == "shot", use as needed
}

Khi bạn nói chỉ, điều đó có nghĩa là gì? Thứ hai, điều đó có nghĩa là tôi sẽ có thể sử dụng $ (cái này) trong hàm add_event của tôi như bình thường trong hàm ẩn danh?
Paul Hoffer

2
@phoffer - Có, "chỉ" có nghĩa là không có thông số, chỉ có tên hàm, nó là tham chiếu đến hàm, không phải là kết quả của việc chạy hàm bạn muốn gán cho clicktrình xử lý. Trong phương pháp ẩn danh và các .bind()ví dụ ở trên mà bạn có thể sử dụng this, nó sẽ đề cập đến .loadtoscorebạn đã nhấp vào (như bạn mong đợi). Trong ví dụ cuối cùng, bên trong add_event(event)tương tự là đúng, sử dụng thishoặc $(this)nó sẽ là những gì bạn muốn.
Nick Craver

1
@phoffer: Bạn sẽ phải vượt qua phần tử một cách rõ ràng để sử dụng nó, ví dụ: function(){ add_event('shot', $(this));}function add_event(event, element){...}. elementsẽ là một phần tử jQuery ở đây (nó hoạt động với bind()mặc dù như Nick đã đề cập).
Felix Kling

@Felix - Anh ấy cũng có thể sử dụng $(this)bên trong chức năng, ví dụ: jsfiddle.net/tSu5t
Nick Craver

35

Nếu bạn gọi nó theo cách bạn đã có nó ...

$('.leadtoscore').click(add_event('shot'));

... bạn sẽ cần phải add_event()trả về một hàm, như ...

function add_event(param) {
    return function() {
                // your code that does something with param
                alert( param );
           };
}

Hàm được trả về và được sử dụng làm đối số cho .click().


@jAndy - Cảm ơn bạn đã đăng ví dụ bao gồm eventtham số. Tôi nên bao gồm nó. : o)
dùng113716

27

Tôi đã thành công khi sử dụng .on () như vậy:

$('.leadtoscore').on('click', {event_type: 'shot'}, add_event);

Sau đó, bên trong add_eventchức năng bạn có quyền truy cập vào 'shot' như thế này:

event.data.event_type

Xem tài liệu .on () để biết thêm thông tin, nơi họ cung cấp ví dụ sau:

function myHandler( event ) {
  alert( event.data.foo );
}
$( "p" ).on( "click", { foo: "bar" }, myHandler );

11

Vâng, đây là một bài viết cũ. Bất kể, ai đó có thể tìm thấy nó hữu ích. Đây là một cách khác để gửi tham số cho xử lý sự kiện.

//click handler
function add_event(event, paramA, paramB)
{
    //do something with your parameters
    alert(paramA ? 'paramA:' + paramA : '' + paramB ? '  paramB:' + paramB : '');
}

//bind handler to click event
$('.leadtoscore').click(add_event);
...
//once you've processed some data and know your parameters, trigger a click event.
//In this case, we will send 'myfirst' and 'mysecond' as parameters
$('.leadtoscore').trigger('click', {'myfirst', 'mysecond'});

//or use variables
var a = 'first',
    b = 'second';

$('.leadtoscore').trigger('click', {a, b});
$('.leadtoscore').trigger('click', {a});

6
      $imgReload.data('self', $self);
            $imgReload.click(function (e) {
                var $p = $(this).data('self');
                $p._reloadTable();
            });

Đặt đối tượng javaScript thành phần tử onclick:

 $imgReload.data('self', $self);

lấy Object từ phần tử "này":

 var $p = $(this).data('self');

Tuyệt vời! Đáng buồn thay, đây là điều duy nhất hoạt động khi tôi cố gắng sử dụng các biến jquery! không biết tại sao : |
cregox

3

Tôi nhận được giải pháp đơn giản:

 <button id="btn1" onclick="sendData(20)">ClickMe</button>

<script>
   var id; // global variable
   function sendData(valueId){
     id = valueId;
   }
   $("#btn1").click(function(){
        alert(id);
     });
</script>

Ý tôi là truyền onclicksự kiện giá trị cho javascript function sendData(), khởi tạo biến và lấy nó bằng phương thức xử lý sự kiện jquery.

Điều này là có thể vì lúc đầu sendData(valueid)được gọi và khởi tạo giá trị. Sau đó, sau khi sự kiện jquery được thực thi và sử dụng giá trị đó.

Đây là giải pháp chuyển tiếp thẳng và giải pháp chi tiết tại đây .


Tôi không thấy một cách để vượt qua các tham số động ở đây, chỉ các giá trị được mã hóa cứng.
dùng1451111

bằng cách này, bạn chỉ truyền giá trịId và mất phần tử và các đối tượng sự kiện.
Zoltán Süle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.