2010-09-26 27 views
16

Tôi đã sử dụng chức năng live():Sử dụng .Một() với .live() jQuery

$('a.remove_item').live('click',function(e) {}); 

tôi cần phải thay đổi điều này để one() để ngăn chặn nhiều lần nhấp chuột, tuy nhiên khi tôi tiêm một trong những yếu tố sau trang đã tải trình nghe one() không kích hoạt.

Làm cách nào để có được one() hoạt động như live()?

+0

bạn có muốn nhấp chuột trực tiếp chỉ hoạt động một lần không. –

Trả lời

15

Hãy thử điều này:

$('a.remove_item').live('click',function(e) { 
    if($(e.target).data('oneclicked')!='yes') 
    { 
    //Your code 
    } 
    $(e.target).data('oneclicked','yes'); 
}); 

này thực thi mã của bạn, nhưng nó cũng đặt ra một lá cờ 'oneclicked' như có, do đó nó sẽ không kích hoạt một lần nữa. Về cơ bản chỉ cần thiết lập một thiết lập để ngăn chặn nó kích hoạt khi nó được nhấp một lần.

+0

Giải pháp tốt. Tôi nghĩ rằng nó tốt hơn so với JapanPro bởi vì việc sử dụng chức năng dữ liệu là rời rạc hơn là thêm một lớp. – Kranu

+0

điều này dường như hoạt động tốt cảm ơn bạn! – Titan

+0

Sẽ thật tuyệt nếu có một cách để loại bỏ sự kiện mà không ảnh hưởng đến '$ ('a.remove_item')' ' – Blowsie

2

Hãy thử điều này

$('a.remove_item').live('click', function(e) { 
    if(!$(this).hasClass('clicked')) 
    { 
     $(this).addClass('clicked'); 
     alert("dd"); // this is clicked once, do something here 
    } 
});​ 
+0

điều này sẽ hoạt động tương tự như chức năng dữ liệu, tuy nhiên như Kranu nói điều này ít rời rạc hơn. Cảm ơn bạn anyway! – Titan

11

Chỉ cần sử dụng jQuery's .die() method trong xử lý:

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

$('a.remove_item').live('click',function(e) { 
    alert('clicked'); 
    $('a.remove_item').die('click'); // This removes the .live() functionality 
});​ 

EDIT:Hoặc bạn chỉ muốn thay đổi tên lớp từ live() là dựa trên công cụ chọn.

Ví dụ:http://jsfiddle.net/Agzar/1/

$('a.remove_item').live('click',function(e) { 
    alert('i was clicked'); 
    $(this).toggleClass('remove_item remove_item_clicked'); 
});​ 

này thay đổi lớp remove_item-remove_item_clicked mà có thể có phong cách tương tự. Bây giờ live() sẽ không kích hoạt sau lần nhấp đầu tiên.

+0

Tôi đã sử dụng ngày hôm nay. Làm việc như một say mê. – jessegavin

15

Dưới đây là một phiên bản plugin để chạy một handler .live() một lần, tạo ra hoàn toàn ra khỏi sự nhàm chán:

$.fn.liveAndLetDie = function(event, callback) { 
    var sel = this.selector; 
    function unbind() { $(sel).die(event, callback).die(event, unbind); } 
    return this.live(event, callback).live(event, unbind); 
}; 

Nó hoạt động giống như .live() sẽ (trừ khi bạn cần tranh luận dữ liệu sự kiện, trong trường hợp này bạn cần để thêm quá tải). Chỉ cần sử dụng cùng một cách:

$('a.remove_item').liveAndLetDie('click', function(e) { /* do stuff */ }); 

You can test it out here.

+4

+1 cho tên phương thức – Blazemonger

+1

Tôi phải lưu ý, có sự khác biệt giữa câu trả lời này và câu trả lời được đánh dấu là chính xác. Với câu trả lời này, nếu bạn đang áp dụng nó cho một nhóm các phần tử (tức là '$ ('. Class')'), nó sẽ chỉ chạy một lần trên bất kỳ phần tử nào trong bộ chọn (tức là nếu phần tử đầu tiên được nhấp, thứ hai không thể được nhấp) trong khi trong câu trả lời đầu tiên, mỗi phần tử chỉ có thể được nhấp một lần (nghĩa là bạn có thể nhấp vào phần tử đầu tiên một lần, sau đó là phần tử thứ hai một lần, v.v.). Vì vậy, trong trường hợp của tôi, tôi thấy câu trả lời được đánh dấu là chính xác hơn có lợi so với cái này. Không đề xuất bất kỳ chỉnh sửa nào, chỉ cần chỉ ra một sự khác biệt. – think123

+0

@ think123 điểm rất hợp lệ và có thể áp dụng trong trường hợp của tôi – Blowsie

0

Tôi biết đây là một bài cũ, nhưng điều này làm việc cho tôi về một trường hợp tương tự:

$('a.remove_item').live('click', function(e) { 
    e.stopPropagation(); 
    // Your code here 
});​ 
0

tôi sử dụng nó trên $ .ajax chức năng, vì vậy, trên trận chung kết, trong trường hợp của tôi thất bại, tôi sử dụng, 500 để trì hoãn nó và dừng lại để gửi lại nhiều lần.

}).fail(function(response, status){ alert("FAILED: "+JSON.stringify(response, null, 4)); },500);

Tôi hy vọng nó sẽ giúp bạn!

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