2013-03-11 42 views
6

Điều gì sẽ là sự thay thế thích hợp cho jQuery.live(). Tôi biết jQuery.on() làm điều tương tự nhưng trong trường hợp của jQuery.on() chúng ta phải xác định cha mẹ để làm cho nó hoạt động.Thay thế cho jQuery.live

Giả sử tôi có 500 trực tiếp trên trang của mình và bây giờ tôi muốn thay đổi tất cả 500 trực tiếp thành bật và thực hiện nó bằng cách chọn phụ huynh của từng phần tử sẽ không khả thi và sẽ mất nhiều thời gian hơn.

Giả sử tôi có $(".item").live("click",function(){ alert("test"); });

và nếu tôi thay thế nó bằng jQuery.on() sau đó nó phải được $("body").on("click",".item",function(){ alert("test"); });

nhưng tôi tự hỏi, nếu có một số cách tắt hoặc bất cứ điều gì khác để đạt được điều này như

này
$(".item").on("click",function(){ alert("test"); }); 

để tôi có thể thay thế tất cả sau vài giây.

+0

Giải pháp nhanh chóng và dơ bẩn sẽ là plugin 3 dòng để duy trì chức năng 'trực tiếp 'dựa trên' bật'. –

+0

@ dystroy - Đó là những gì tôi nghĩ quá –

+0

Không có thứ gì đó để tôi không phải sử dụng bất kỳ plugin nào? –

Trả lời

4

.live() đã chết, sống lâu .live(): https://github.com/jquery/jquery/commit/eed78cc321ed7e2b37fb34e32fbb528b24f61d6e

Mặc dù nghiêm túc, cho một phần lót mà bạn tìm kiếm, bạn chỉ có thể thêm nó trở lại:

jQuery.fn.live = function(types, data, fn) { jQuery(this.context).on(types, this.selector, data, fn); return this; } 

Thêm vào đó phía trên cùng của bạn JS để tạo hiệu quả một shim cho phép bạn sử dụng .live() như bạn muốn và không quan tâm về phiên bản jQuery bạn đang sử dụng. Tuy nhiên, thực sự, giống như những người khác đang nói, bạn chỉ cần làm một tìm-replaceall bằng cách sử dụng trình soạn thảo văn bản của sự lựa chọn của bạn, hoặc một tiện ích dòng lệnh như sed. Trong giải pháp shim tôi cung cấp cho bạn, bạn đang gọi một hàm để gọi một hàm khác, hàm này giới thiệu rất nhiều chi phí và có thể sử dụng một lượng tài nguyên không cần thiết. .on() hiệu quả hơn nhiều, đặc biệt nếu bạn gọi nó trực tiếp.


Cập nhật: Các giải pháp trên dựa vào .context sở hữu nội jQuery, mà has been deprecated kể từ jQuery 1.10 và có thể biến mất trong bất kỳ phiên bản sau này. Một phiên bản thay thế sẽ đáp ứng nhu cầu của bạn hầu hết thời gian sẽ chỉ đơn giản là thay thế this.context bằng document. Đây có những hạn chế được nêu trong .context property's API:

Giá trị tài sản này thường bằng tài liệu, vì đây là bối cảnh mặc định cho các đối tượng jQuery nếu không được cung cấp. Các bối cảnh có thể khác nhau nếu, ví dụ, các đối tượng đã được tạo ra bởi tìm kiếm trong một tài liệu hoặc XML.

Vì vậy, có thể không thành công. Dù sao, bây giờ bạn chắc chắn không có lý do gì để không sử dụng trực tiếp .on(). Hãy kiểm tra my tips on upgrading to the most recent version of jQuery.

3

Bạn có thể xác định một plugin nhỏ cung cấp cho bạn chức năng live cũ bằng cách gọi on nhưng điều này sẽ chỉ cho phép bạn có mã kém hơn. Bạn cần để cấu trúc lại mã của bạn để sử dụng on đúng cách.

Giải pháp giúp bạn quản lý thay đổi ban đầu dễ dàng hơn một chút là sử dụng regex để thực hiện thay thế. Hầu hết các trình chỉnh sửa văn bản đều có thể cho phép bạn làm điều đó.

Đối với trường hợp sử dụng bạn đưa ra, bạn có thể sử dụng này (ví dụ trong JavaScript, điều chỉnh cho biên tập viên của bạn):

var output = input.replace(
     /\$\(\"([^\"]+)\"\)\.live\(\"([^\"]+)\"/g, 
     '$(document.body).on("$2", "$1"' 
); 

Input:

$(".item").live("click",function(){ alert("test"); }); 
$(".item2").live("change",function(){ console.log("test"); }); 

Output:

$(document.body).on("click", ".item",function(){ alert("test"); }); 
$(document.body).on("change", ".item2",function(){ window.top.console.log("test"); }); 

Sau chuyển đổi ban đầu này, bạn sẽ phải tìm kiếm các phần tử cha mẹ tốt hơn so với document.body.

+0

Đối với điều này tôi phải làm điều đó cho mỗi và mọi yếu tố.Tôi đang tìm kiếm một giải pháp một dòng đơn giản. –

+0

Không: trình chỉnh sửa của bạn có thể áp dụng regex cho toàn bộ tệp, giống như mã js nhỏ của tôi có thể được áp dụng cho toàn bộ tệp. –

2

Tương tự như @ phá hủy của trả lời - một cái gì đó khác để thử - sau khi sao lưu tập tin của bạn

Tôi không có Komodo nhưng khéo léo tạo ra những điều sau đây cho Notepad ++:

Tìm

\$\("(.+)"\).live\("(.+)", 

Thay thế bằng

$(document).on('\2', '\1', 

Cú pháp Regex thay đổi, do đó bạn có thể phải làm việc với nó.

Bạn cũng có thể cần phải điều chỉnh hoặc chạy một số biến thể của regex, ví dụ để phục vụ cho dấu ngoặc kép đơn hoặc kép, hoặc khoảng trắng.