2009-11-05 47 views
150

Tôi đang gặp phải một thời gian khó khăn để tìm ra DOMElement thực tế từ bộ chọn jquery. Mã mẫu:Cách lấy Phần tử DOM từ Bộ chọn JQuery

<input type="checkbox" id="bob" /> 
    var checkbox = $("#bob").click(function() { //some code }) 

và trong một đoạn mã khác Tôi đang cố gắng xác định giá trị đã chọn của hộp kiểm.

if (checkbox.eq(0).SomeMethodToGetARealDomElement().checked) 
    //do something. 

Và xin vui lòng, tôi không muốn làm:

if (checkbox.eq(0).is(":checked")) 
    //do something 

Điều đó có được là tôi xung quanh hộp kiểm, nhưng đôi khi tôi đã cần sự DOMElement thực.

+4

Một trường hợp trong đó điều này có thể cần thiết: trong Knockout.js, hàm 'applyBindings' mong đợi một nút DOM không phải là bộ chọn jQuery. Câu hỏi này (và câu trả lời của nó) là chính xác những gì cần thiết. –

Trả lời

233

Bạn có thể truy cập vào các phần tử DOM liệu với:

$("table").get(0); 

hoặc đơn giản hơn:

$("table")[0]; 

Không thực sự là rất nhiều bạn cần điều này cho tuy nhiên (theo kinh nghiệm của tôi). Hãy ví dụ hộp kiểm của bạn:

$(":checkbox").click(function() { 
    if ($(this).is(":checked")) { 
    // do stuff 
    } 
}); 

là nhiều hơn "jquery'ish" và (IMHO) súc tích hơn. Nếu bạn muốn đánh số chúng thì sao?

$(":checkbox").each(function(i, elem) { 
    $(elem).data("index", i); 
}); 
$(":checkbox").click(function() { 
    if ($(this).is(":checked") && $(this).data("index") == 0) { 
    // do stuff 
    } 
}); 

Một số tính năng này cũng giúp mặt nạ khác biệt trong trình duyệt. Một số thuộc tính có thể khác nhau. Ví dụ cổ điển là các cuộc gọi AJAX. Để làm điều này đúng trong Javascript thô có khoảng 7 trường hợp dự phòng cho XmlHttpRequest.

+1

Cảm ơn, nhưng phương thức get vẫn trả về một phần tử jquery, không phải là phần tử dom. Nếu không, cuộc gọi thuộc tính .checked sẽ hoạt động. – BillRob

+0

Hãy thử '$ ('a'). Get (0) .nodeType == 1' trong Firebug trên trang này, nó có đánh giá đúng hay không? –

+0

@BillRob nếu get() không trả lại phần tử DOM, có điều gì đó sai. Xem tài liệu tại đây: http://docs.jquery.com/Core/get#index –

1

Nếu bạn cần tương tác trực tiếp với phần tử DOM, tại sao không sử dụng document.getElementById vì nếu bạn đang cố gắng tương tác với một yếu tố cụ thể, bạn có thể biết id, giả sử rằng tên lớp chỉ có một phần tử hoặc một số tùy chọn khác có xu hướng rủi ro.

Nhưng, tôi có xu hướng đồng ý với những người khác, rằng trong hầu hết các trường hợp, bạn nên học cách làm những gì bạn cần bằng cách sử dụng những gì jQuery cung cấp cho bạn, vì nó rất linh hoạt.

UPDATE: Dựa trên một bình luận: Đây là một bài với một lời giải thích tốt đẹp: http://www.mail-archive.com/[email protected]/msg04461.html

$(this).attr("checked") ? $(this).val() : 0 

này sẽ trả về giá trị nếu nó được đánh dấu, hoặc 0 nếu nó không.

$(this).val() chỉ tiếp cận vào vị trí cũ và nhận thuộc tính "giá trị" của phần tử, cho dù có được kiểm tra hay không.

+2

Tôi có thể sử dụng document.getElementById hoặc phương thức MS ajax $ get. Kể từ khi MS xác nhận jquery tôi đang cố gắng để phá vỡ sự phụ thuộc của tôi trên javascript javascript ajax và học jquery. Có vẻ như hoàn toàn phản trực giác rằng jquery sẽ thay đổi hành vi của phương thức checkbox .val(). Như mọi cuộc gọi .val() khác trả về các trường bài biểu mẫu. jQuery đã rất tốt để làm việc với vì vậy nó đã gây nhầm lẫn để thay đổi phương thức val() và hy vọng tìm được giải pháp nhanh chóng. – BillRob

+2

Vì vậy, hãy xem trang này: http://www.mail-archive.com/[email protected]/msg04461.html –

+2

Đó là James lạ lùng rằng phương thức val() thực sự là .attr ("giá trị") . Tôi tự hỏi tại sao họ có hai phương pháp khác nhau cho nó. Với tôi .val() là giá trị của trường post form. – BillRob

7

Chỉnh sửa: có vẻ như tôi đã sai khi giả sử bạn không thể lấy yếu tố. Như những người khác đã đăng ở đây, bạn có thể tải xuống bằng:

$('#element').get(0); 

Tôi đã xác minh điều này thực sự trả lại phần tử DOM đã được đối sánh.

+1

Lặp lại bản thân, nhưng một lần nữa ... không có trong tất cả các trình duyệt. Không có trong IE7 và trước đó. – Slavo

6

Tôi cần lấy phần tử làm chuỗi.

jQuery("#bob").get(0).outerHTML; 

Mà sẽ cung cấp cho bạn một cái gì đó như:

<input type="text" id="bob" value="hello world" /> 

... như là một chuỗi chứ không phải là một phần tử DOM.

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