2010-11-10 56 views
31

Tôi có một chức năng mà tôi muốn có thể cho phép truyền trong đối tượng phần tử javascript DOM thông thường hoặc đối tượng jQuery. Nếu nó chưa phải là một đối tượng jQuery thì tôi sẽ làm cho nó một.Phát hiện đối tượng DOM và đối tượng jQuery

Có ai biết một cách rất đáng tin cậy để phát hiện điều này không.

function functionName(elm){ 
    //Detect if elm is not a jquery object in condition 
    if (elm) elm = $(elm); 

} 

Cách tiếp cận hợp lý là phát hiện một trong các thuộc tính của đối tượng phần tử DOM. Câu hỏi đặt ra là, tài sản nào là đáng tin cậy nhất để phát hiện?

Tôi cũng có thể chỉ làm cho nó trở thành một đối tượng jquery một trong hai cách vì jQuery không có vấn đề với một cái gì đó như: $ ($ imajQueryObjAlready); Tuy nhiên, mục đích của câu hỏi này không chỉ là giải quyết vấn đề, mà là tìm ra cách tốt để phát hiện nếu đối tượng DOM của nó là một đối tượng jQuery.

Trả lời

58

Để kiểm tra cho một phần tử DOM, bạn có thể kiểm tra nodeType tài sản của mình:

if(elm.nodeType) { 
    // Was a DOM node 
} 

hoặc bạn có thể kiểm tra tài sản jQuery:

if(elm.jquery) { 
    // Was a jQuery object 
} 
+3

+1 Hai giải pháp tuyệt vời - Tôi thích giải pháp dễ đọc hơn. – lonesomeday

+2

@lonesomeday - Từ chối trách nhiệm duy nhất tôi đưa ra (hoặc đáng lẽ phải đưa ra) là nó không phải là một phần của API công khai, [hiện tại là] (http: //bugs.jquery.com/ticket/7200), vì vậy jQuery có thể quyết định loại bỏ thuộc tính đó một ngày nào đó. Mặc dù nghi ngờ. – user113716

+4

Đúng. Tất nhiên, ngược lại, jQuery có thể quyết định thêm thuộc tính 'nodeType'! – lonesomeday

8

jQuery làm nó như thế này:

if (selector.nodeType) 

(jQuery 1.4.3, dòng 109)

13

Để kiểm tra cho một đối tượng jQuery, bạn có thể sử dụng instanceof điều hành:

if(elm instanceof jQuery) { 
    ... 
} 

hay:

if(elm instanceof $) { 
    ... 
} 
6

Cách đơn giản nhất là chỉ cần vượt qua nó vào chức năng jQuery một trong hai cách. Nếu nó đã là một đối tượng jQuery, nó sẽ trở lại nó không thay đổi:

function(elem){ 
    elem = $(elem); 
    ... 
} 

Từ mã nguồn jQuery, đây là những gì đang xảy ra:

if (selector.selector !== undefined) { 
    this.selector = selector.selector; 
    this.context = selector.context; 
} 

return jQuery.makeArray(selector, this); 

đâu makeArray được sáp nhập (mặc định) jQuery đối tượng mới với thông qua trong một.

+0

+1 cho sự đơn giản – zzzzBov

+2

Nó không thực sự không thay đổi. Bạn đang nhận được một đối tượng jQuery mới. Có thể có phản ứng phụ. Đây là một bản demo: http://jsfiddle.net/nu7D6/ – user113716

+0

@Patrick - Không, bạn sẽ nhận được đối tượng jQuery gốc nếu nó đã là một đối tượng jQuery. $ (selector) === $ ($ (selector)) luôn trả về giá trị true. –

6

elm instanceof jQuery là cách hết sức rõ ràng nhất, như thử nghiệm elm.nodeType sẽ nhầm {nodeType:1} cho một phần tử DOM, và thử nghiệm elm.jquery sẽ nhầm {jquery:$()} cho một đối tượng jQuery, ngoài không còn dự bị tương lai đảm bảo đối tượng jQuery sẽ không có một tài sản jquery .

0

Cách sang trọng:

function is_jquery_object(x) { 
    return window.jQuery && x instanceof jQuery; 
} 

function is_dom_object(x) { 
    return window.HTMLElement && x instanceof HTMLElement; 
} 

Xây dựng về câu trả lời @ karim79, nếu bạn cần phải chắc chắn nó hoặc là một DOM hoặc đối tượng jQuery, sử dụng các bài kiểm tra. (Bài kiểm tra window giúp chức năng không thành công nếu lớp không được xác định, ví dụ: jQuery không tải được.)

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