2009-07-25 48 views
12

Tôi đang cố gắng thực hiện một hàm bên ngoài khi nhấp vào một phần tử DOM mà không cần gói nó trong một hàm khác.Làm cách nào để thực thi chức năng bên ngoài khi một phần tử được nhấp?

Nói rằng tôi có một chức năng gọi là sayHello(), như sau:

function sayHello(){ 
    alert("hello"); 
}; 

Để thực hiện nó trên nhấp chuột, Tôi hiện đang có để làm điều này:

$("#myelement").click(function(){ 
    sayHello(); 
}); 

Thông báo tôi buộc phải quấn đơn chức năng gọi trong một chức năng khác. Những gì tôi đang cố gắng làm là một cái gì đó như thế này

$("#myelement").click(sayHello()); 

Ngoại trừ việc đơn giản là không hiệu quả. Tôi có thể tránh gói một cuộc gọi chức năng trong một chức năng khác theo bất kỳ cách nào không? Cảm ơn!

.

Thông tin bổ sung: Làm cách nào để đạt được điều tương tự khi tôi cần chuyển tham số cho hàm?

..

thông tin bổ sung: Giống như Chris Brandsma và Jani Hartikainen chỉ ra, ta nên có thể sử dụng chức năng ràng buộc để vượt qua tham số cho hàm mà không cần gói nó trong một chức năng ẩn danh như vậy:

$("#myelement").bind("click", "john", sayHello); 

với sayHello() tại chấp nhận một tham số mới, như vậy:

function sayHello(name){ 
    alert("Hello, "+name); 
} 

Điều này, thật không may, dường như không hoạt động ... Bất kỳ ý tưởng nào? Tài liệu về Sự kiện/liên kết nằm ở here Cảm ơn!

+0

Thịt bò của bạn có chức năng gói là gì? Nó không phải là một hit hiệu suất (tốt, nano giây có thể). Đó là một chút tiết nhưng tôi thấy nó hữu ích để làm điều này và giữ mọi thứ nhất quán. Thứ hai, bạn cần phải thêm một tham số hoặc gọi nhiều hơn một hàm bạn sẽ cần thêm trình bao bọc lại trong ... – DisgruntledGoat

+1

tôi đoán tôi chỉ muốn có nó một cách độc đáo trong một dòng và tôi là OCD như thế ... :) –

Trả lời

19

Để chọn từ câu hỏi bạn có trong đó.

Rõ ràng, bạn cần phải gọi nó theo cách này để làm việc:

$("#myelement").click(sayHello); 

Gọi nó theo cách bạn đã có nó thực sự thực hiện các phương pháp thay vì gửi phương pháp để xử lý nhấp chuột.

Nếu bạn cần phải vượt qua dữ liệu bạn cũng có thể gọi phương thức theo cách này:

$("#myelement").click(function(){ sayHello("tom");}); 

Hoặc bạn có thể truyền dữ liệu thông qua bind() chức năng

function sayHello(event){ alert("Hello, "+event.data); } 

$("#myelement").bind("click", "tom", sayHello); 

Hoặc bạn có thể lấy dữ liệu từ các phần tử đã được nhấp vào

$("#myelement").click(function(){sayHello($(this).attr("hasData");});. 

Hy vọng điều đó sẽ hữu ích.

+0

nó sau từ tài liệu "Sự kiện/ràng buộc" trên trang web jQuery mà $ này ("# ​​myelement"). Bind ("click", "tom", sayHello); thực sự nên làm những gì tôi đang tìm kiếm ... khi thử nó mặc dù, nó dường như không hoạt động. Tôi sẽ đăng một số thông tin bổ sung trong câu hỏi ban đầu trong một giây –

+0

gửi thông tin bổ sung! –

+1

@yuval: đọc tài liệu cẩn thận hơn!Giá trị được chuyển đến 'bind()' trong tham số 'data' được truyền cho trình xử lý của bạn thông qua' event.data' - bạn cần giải thích tham số đầu tiên cho hàm của bạn như một đối tượng 'event' và xem dữ liệu' 'tài sản! – Shog9

8

Bạn đang kêu gọi các sayHello chức năng, bạn có thể vượt qua nó bằng cách tham chiếu bằng cách loại bỏ các dấu ngoặc đơn:

$("#myelement").click(sayHello); 

Edit: Nếu bạn cần phải vượt qua các tham số để các sayHello chức năng, bạn sẽ cần phải quấn nó trong một chức năng khác. Này định nghĩa một hàm mới tham số-ít mà các cuộc gọi chức năng của bạn với các thông số được cung cấp tại tạo thời gian:.

$("#myelement").click(function() { 
    sayHello('name'); 
    // Creates an anonymous function that is called when #myelement is clicked. 
    // The anonymous function invokes the sayHello-function 
}); 
+0

điều này thực sự hoạt động, nhưng tôi phải làm gì trong một tình huống mà tôi có các tham số để truyền cho hàm? ví dụ: $ ("# myelement"). nhấp (sayHello ("john")); ? cảm ơn! –

+1

Trong trường hợp đó bạn buộc phải quấn nó. Ngoài ra, một số thư viện như Prototype cung cấp phương thức bind() hoạt động giống như sayHello.bind (this, param1, param2). Nó thực hiện chính xác giống như gói nó, mặc dù. –

+0

hey jani, nó có vẻ như thế này nên làm việc với chức năng ràng buộc của jQuery quá, nhưng nó không. Vui lòng xem thông tin bổ sung cho câu hỏi. cảm ơn! –

4

$ ("# myElement") nhấp (sayHello());

Điều này thực sự gọi sayHello() trước khi bạn đặt trình xử lý click. Nó đang cố gắng đặt giá trị trả về là sayHello() làm chức năng gọi lại!

Thay vào đó, hãy thử:

$("#myelement").click(sayHello); 

Và liên quan đến chỉnh sửa của bạn, nếu bạn cần phải vượt qua các thông số bạn chỉ có thể sử dụng kỹ thuật đóng cửa bạn đã sử dụng, nhưng nếu bạn đang tìm kiếm cái gì sạch sau đó kiểm tra ra How can I pass a reference to a function, with parameters?

0

Có, thay vì qua sayHello(), chỉ cần chuyển tên hàm.

$("#myelement").click(sayHello); 
1

bạn sẽ truyền thông số nào tại thời điểm nhấp chuột? nếu bạn biết chúng là gì, bạn có thể đặt chúng trước khi người dùng nhấp vào.

bạn không thể vượt qua các thông số nhưng bạn có thể giả mạo điều tham số của các thành viên chỉ đơn giản là thêm vào các đối tượng được bắn sự kiện này, vì vậy ..

myObject.onClick = sayHello; 
myObject.param1 = "foo"; 

sau đó, khi bạn đang gọi điện thoại

này
function sayHello(){ 
    alert(this.param1); 
} 
+0

Không phải là một câu trả lời trực tiếp cho câu hỏi (kể từ khi ông đang sử dụng jQuery), nhưng upvoted vì nó là một mẹo Javascript tuyệt vời dù sao. – DisgruntledGoat

+0

ý tưởng thú vị, nhưng không hoàn toàn những gì tôi đang tìm kiếm ... –

+0

IMHO, điều này là ít sạch hơn một đóng cửa đơn giản ... tốt nhất, bạn có thêm công việc thiết lập các thuộc tính expando trên đối tượng DOM, và tồi tệ nhất bạn có khả năng có thể chạy vào các xung đột đặt tên với các thuộc tính tích hợp! – Shog9

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