2012-02-14 26 views
6

Tôi có một loại câu hỏi lý thuyết về những gì xảy ra khi bạn có jQuery tìm kiếm các phần tử/ràng buộc với các phần tử không tồn tại trên một trang.jQuery xử lý các phần tử không tồn tại trên một trang như thế nào?

Ví dụ: tôi có tệp javascript chứa nhiều sự kiện Nhấp chuột, tuy nhiên trên một số trang, các sự kiện nhấp chuột đó không được sử dụng. Thay vì tạo nhiều tệp javascript và có mã trùng lặp, tôi đã giảm thiểu hầu hết mã xuống một tệp.

$('#target').click(function() { 
    alert('Handler for .click() called.'); 
}); 

Về cơ bản tổng hợp đoạn của tôi thành một vài câu đơn giản. Điều gì sẽ xảy ra khi id "target" không tồn tại? Làm thế nào để jquery xử lý một trường hợp như thế này?

Bây giờ, bất cứ khi nào tôi làm việc trên trang web của mình, có vẻ như việc sử dụng bộ nhớ của FireFox phát triển như điên. Bạn không chắc chắn nếu điều này chỉ là FireFox hay không, nhưng nếu tôi không có phần tử trên trang, điều này có gây ra rò rỉ bộ nhớ bằng cách liên kết với các phần tử không tồn tại không?

Chỉ tò mò điều gì xảy ra sau hậu trường.

Cảm ơn!

+0

* "Điều gì sẽ xảy ra khi id" target "không tồn tại?" * Điều tương tự cũng xảy ra khi bạn lặp lại một Array trống. Không có gì. –

Trả lời

5

Nếu không có phần tử nào phù hợp với bộ chọn của bạn, bạn sẽ nhận được một đối tượng jQuery trống (một đối tượng không chứa các phần tử).
Gọi bất kỳ phương thức nào trừ live() trên một đối tượng jQuery trống sẽ không làm gì cả và sẽ không lãng phí tài nguyên.

+0

Điều gì sẽ xảy ra khi bạn có phương thức jQuery đang hoạt động? Tôi có một vài trong số đó cũng cho kiểm tra ajax ... Cảm ơn những kiến ​​thức ban đầu mặc dù :) – user1110302

+0

@ user1110302: Gọi 'live()' sẽ thêm phương pháp chọn và xử lý vào danh sách toàn cầu các sự kiện trực tiếp, trong trường hợp một yếu tố phù hợp sẽ xuất hiện trong tương lai. Đó là toàn bộ điểm của 'live()'. – SLaks

+3

@userrandomnumbers: Đối tượng không phải là "sống", phương pháp 'live' chỉ là một đoạn rất khó hiểu (không được chấp nhận!).'live' gắn các trình xử lý sự kiện ở cấp tài liệu, do đó các trình xử lý sự kiện này luôn được đính kèm, cho dù có bất kỳ phần tử nào phù hợp hay không. Bạn không nên sử dụng 'live' với phiên bản mới nhất của jQuery vì nó gây nhầm lẫn, thích' $ (tài liệu) .on (...) '. –

2

jQuery luôn hoạt động trên danh sách các phần tử. Khi bộ chọn không khớp với bất kỳ thứ gì, bạn sẽ nhận được một danh sách trống và thao tác không làm gì cả.

Việc đính kèm sự kiện vào các phần tử không tồn tại như không thực sự làm bất kỳ điều gì, vì vậy không, đó không phải là bộ nhớ bị rò rỉ.

-1

Cách tôi hiểu, bộ chọn $ ('# target') sẽ không chọn bất kỳ thứ gì và do đó, nhấp chuột sẽ không ràng buộc với bất kỳ yếu tố nào. Nó sẽ không gây ra bất kỳ vấn đề bộ nhớ hoặc bất cứ điều gì.

2

hàm $() sẽ lặp qua các phần tử trong cửa sổ. Nếu tìm thấy #target, sự kiện onclick sẽ được thêm vào.

Nếu nó không tồn tại, sau đó không có gì sẽ xảy ra, bạn sẽ nhận được một đối tượng jQuery trống

0

Kết quả của nguyên tố này không có mặt nên được rằng nó chỉ là không bị ràng buộc vào bất cứ điều gì và do đó nhấp vào cái gì đó không có đó sẽ không có ảnh hưởng.

Tôi cũng muốn chỉ ra rằng nếu phần tử được thêm vào thông qua ajax và bạn đã ràng buộc phần tử '#target' với một hàm nhấp cụ thể, như bạn đã làm trong mã đã đăng, trước khi gọi ajax nó sẽ không chức năng. Trong những trường hợp đó, bạn sẽ sử dụng hàm liên kết '.live' để đảm bảo rằng hàm bị ràng buộc với phần tử. Ngoài ra Firefox là một bộ nhớ hog, nó là khá phổ biến cho việc sử dụng bộ nhớ của nó phát triển nhanh chóng điên.

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