2012-08-03 42 views
10

tôi thêm vào sự kiện handler để elmentChờ cho sự kiện nhấp chuột để hoàn thành

$(".elem").click(function(){ 
     $.post("page.php".function(){ 
     //code1 
     }) 
}) 

Và cò bấm kiện

$(".elem").click(); 
//code2 

Làm thế nào tôi chắc chắn rằng code2 thực thi sau khi code1 thực hiện

+0

Vui lòng xác định ý nghĩa của bạn bằng "mã 1 thực hiện". Mã của bạn có phương thức ajax. Vì vậy, bạn có nghĩa là khi cuộc gọi ajax executes hoặc ajax executes và hoàn thành là tốt? – Rahatur

Trả lời

12

(Bỏ qua WebWorkers) JavaScript chạy trên một chuỗi duy nhất, vì vậy bạn có thể chắc chắn rằng mã 2 sẽ luôn thực thi sau mã1.

Trừ code1 bạn làm điều gì đó không đồng bộ như một cuộc gọi Ajax hoặc một setTimeout(), trong trường hợp này xử lý nhấp chuột của bẫy sẽ hoàn thành, sau đó code2 sẽ thực hiện, sau đó (cuối cùng) gọi lại từ cuộc gọi Ajax (hoặc setTimeout(), hoặc bất cứ điều gì) sẽ chạy.

EDIT: Đối với câu hỏi được cập nhật, mã 2 sẽ luôn thực thi trước mã1, vì như tôi đã nói ở trên, một cuộc gọi lại async Ajax sẽ xảy ra sau (ngay cả khi phản hồi Ajax rất nhanh, nó sẽ không gọi lại cho đến khi JS hiện tại kết thúc).

"Làm thế nào tôi chắc chắn rằng code2 thực thi sau khi code1 thực hiện"

Sử dụng .click() không có params là một phím tắt để .trigger("click"), nhưng nếu bạn thực sự gọi .trigger() rõ ràng bạn có thể cung cấp các thông số bổ sung mà sẽ được chuyển đến trình xử lý, cho phép bạn thực hiện việc này:

$(".elem").click(function(e, callback) { 
    $.post("page.php".function(){ 
     //code1 

     if (typeof callback === "function") 
     callback(); 
    }); 
}); 

$(".elem").trigger("click", function() { 
    // code 2 here 
}); 

Tức là, trong thử nghiệm xử lý nhấp chuột cho dù một hàm đã được chuyển trong tham số callback và nếu có thì hàm đó vẫn được gọi. Điều này có nghĩa là khi sự kiện xảy ra "tự nhiên" sẽ không có gọi lại, nhưng khi bạn kích hoạt nó theo chương trình và truyền một hàm thì hàm đó sẽ được thực hiện. (Lưu ý rằng tham số mà bạn vượt qua với .trigger() không phải là một chức năng, nó có thể là bất kỳ loại dữ liệu nào và bạn có thể chuyển nhiều thông số, nhưng với mục đích này, chúng tôi muốn có một chức năng.)

Demo: http://jsfiddle.net/nnnnnn/ZbRJ7/1/

+2

Tôi không nghĩ đó là sự thật. Chúng sẽ không thực thi cùng một lúc, nhưng tôi không tin rằng API DOM cung cấp bất kỳ sự bảo đảm nào về thứ tự xử lý sự kiện sẽ được gọi. Ngay cả khi chúng xảy ra cháy theo thứ tự đúng trên một phiên bản của một trình duyệt, điều đó không đảm bảo điều gì sẽ xảy ra trong các trường hợp khác. –

+0

vâng tôi có cuộc gọi ajax trong đó [câu hỏi đã chỉnh sửa] –

+0

Mọi người, chỉ có một trình xử lý sự kiện trong câu hỏi của OP. code2 chỉ kích hoạt nó. – JJJ

2

bạn có thể thử bằng văn bản theo cách này:

$(".elem").live("click", function(){ 
    //code1 
}) 

Và, kích hoạt của bạn sẽ luôn luôn thực hiện như bị sa thải.

2

Bọc code2 trong phương pháp và thêm nó như là một callback bên code1 vì vậy nó sẽ luôn luôn được gọi sau khi code1 thực hiện

code2 = function(){/*code2*/}; 
$(".elem").click(function(){ 
    //code1 
    code2(); 
}) 
+0

đó không phải là giải pháp, tôi muốn thực thi sự kiện nhấp chuột ở một số nơi khác mà không cần code2 –

+1

Bạn chưa bao giờ đề cập rằng nó nên được sử dụng lại. Ở trên trông giống như một giải pháp tốt cho tôi. –

+0

Bạn không bao giờ nói bất cứ điều gì về điều đó Vì vậy, tôi giả định. Tôi có lẽ nên downvote câu hỏi cho không rõ ràng, Nhưng tôi sẽ không làm điều đó vì bạn là người mới. @ JonasGeiregat: Cảm ơn. – Gautam

-1

javascript thực hiện là từng dòng. Vì vậy, bất cứ điều gì đi lên, sẽ được thực hiện đầu tiên. Vì vậy, thêm mã nhấp chuột trước khi phương thức khác sẽ hoạt động.

Thêm nếu có bất kỳ cuộc gọi không đồng bộ nào, hãy lấy cờ chỉ được đặt khi bạn nhận được phản hồi.

var clicks = false; $ ('# elem').nhấp vào (function() { // thực hiện một số quy trình không đồng bộ được nhấp = true; });

while (! Nhấp) {// không làm gì cả}

// chức năng khác được gọi là

Hoặc tùy chọn thứ hai sẽ được, nếu sử dụng phương pháp bài, thiết lập async = true trong bất động sản.

+2

khi (! Được nhấp) {} sẽ làm cho trình duyệt không phản hồi .. –

+0

và tôi nghĩ tùy chọn thứ hai sẽ thực hiện tương tự cho đến khi yêu cầu bài đăng hoàn tất –

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