Cách nhận Phần tử DOM từ Bộ chọn JQuery


179

Tôi đang có một thời gian khó khăn vô cùng để tìm ra để có được DOMEuity thực sự từ một bộ chọn jquery. Mã mẫu:

<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ố xác định giá trị đã chọn của hộp kiểm.

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

Và làm ơn, tôi không muốn làm:

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

Điều đó đưa tôi đến với hộp kiểm, nhưng những lần khác tôi cần DOMEuity thực sự.


4
Một trường hợp trong đó có thể cần thiết: trong Knockout.js, hàm applyBindingsmong đợ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.
Muhammad Alkarouri

Câu trả lời:


264

Bạn có thể truy cập phần tử DOM thô với:

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

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

$("table")[0];

Tuy nhiên, thực sự không có nhiều thứ bạn cần điều này (theo kinh nghiệm của tôi). Lấy ví dụ về hộp kiểm của bạn:

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

là "jquery'ish" và (imho) ngắn gọn 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 che giấu sự khác biệt trong trình duyệt. Một số thuộc tính có thể khác nhau. Ví dụ kinh đ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 phần tử dom. Nếu không, cuộc gọi thuộc tính .checked sẽ làm việc.
BillRob

Hãy thử $('a').get(0).nodeType==1trong Fireorms trên trang này, nó đánh giá là đúng hay thất bại?
meder omuraliev

@BillRob nếu get () không trả về phần tử DOM, có gì đó không đúng. Xem các tài liệu ở đây: docs.jquery.com/Core/get#index
Sixten Otto

$('<input type=checkbox>').appendTo('body').get(0).checked
meder omuraliev

5
Điểm quan trọng của việc sử dụng jQuery là gì nếu bạn định sử dụng các thuộc tính DOM một cách rõ ràng? Không nên tốt hơn khi có mã nhất quán chống lỗi cho TypeErrors có thể? Một vài năm trước, tôi đã từng là một ECMAScripter ưu tú và tránh các khuôn khổ nhưng càng tìm hiểu về sự không nhất quán, cuối cùng tôi đã dựa vào nhiều hơn. Công cụ trình duyệt chỉ ngày càng nhanh hơn, trừ khi tốc độ đáng chú ý, bạn không nên thực sự lo lắng về điều này. Toàn bộ quan điểm của việc sử dụng một khung là để có mã nhất quán khả thi giải quyết được nhiều vấn đề, không làm công cụ nhanh nhất có thể.
meder omuraliev

7

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

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

Tôi đã xác minh điều này thực sự trả về phần tử DOM đã khớp.


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

6

Tôi cần phải lấy phần tử dưới dạng một chuỗi.

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

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

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

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


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 từ đó, nếu bạn đang cố gắng tương tác với một phần tử cụ thể, bạn có thể sẽ biết id, vì giả sử rằng tên lớp chỉ nằm trên một phần tử hoặc một số tùy chọn khác có xu hướng gặp 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 mang lại cho bạn, vì nó rất linh hoạt.

CẬP NHẬT: Dựa trên một nhận xét: Đây là một bài viết với lời giải thích hay: http://www.mail-archive.com/jquery-en@googlegroups.com/msg04461.html

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

Điều này sẽ trả về giá trị nếu nó được chọn hoặc 0 nếu không.

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


2
Tôi có thể sử dụng document.getEuityById hoặc phương thức MS ajax $ get. Kể từ khi MS chứng thực jquery, tôi đang cố gắng phá vỡ sự phụ thuộc của mình vào ms ajax javascript và tìm hiểu jquery. Dường 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 hộp kiểm .val (). Như mọi lệnh gọi .val () khác trả về các trường bài mẫu. jQuery rất tốt để làm việc với nó nên thật khó hiểu khi thay đổi phương thức val () và hy vọng tìm được cách giải quyết nhanh chóng.
BillRob


2
James kỳ quặc rằng phương thức val () thực sự là .attr ("value"). Tôi tự hỏi tại sao họ có hai phương pháp khác nhau cho nó. Đối với tôi .val () là giá trị của trường mẫu bài.
BillRob

2
@BillRob - jQuery chỉ đơn giản hóa và tiêu chuẩn hóa, làm thế nào để có được giá trị, thay vì bạn phải đi đến phần tử thực tế và tự làm điều đó.
James Black

Đôi khi bạn cần một bộ chọn phức tạp với ID và kịch bản cha-con và bạn có thể lấy nó thông qua jQuery với một dòng mã, nhưng sẽ mất một ngày để sử dụng document.getEuityById. Tôi đồng ý rằng việc trộn các thư viện là một ý tưởng tồi, nhưng đôi khi nó chỉ xảy ra và nhiệm vụ lấy một phần tử DOM từ một đối tượng jquery chỉ là khó, đặc biệt là với .get (0) không có khả năng tương thích trình duyệt.
Slavo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.