Tìm một phần tử trong DOM dựa trên giá trị thuộc tính


252

Bạn có thể vui lòng cho tôi biết nếu có bất kỳ API DOM nào tìm kiếm một phần tử với tên thuộc tính và giá trị thuộc tính đã cho không:

Cái gì đó như:

doc.findElementByAttribute("myAttribute", "aValue");

1
Sao y nếu bạn đang tìm kiếm một Jquery Sol: stackoverflow.com/questions/696968/iêu
Rajat

13
Bạn có thể vui lòng cập nhật câu trả lời được chấp nhận cho giải pháp hiện đại, câu trả lời của Wojtek không?
Nick Craver

Câu trả lời:


165

Cập nhật: Trong vài năm qua, cảnh quan đã thay đổi mạnh mẽ. Bây giờ bạn có thể sử dụng một cách đáng tin cậy querySelectorquerySelectorAll, xem câu trả lời của Wojtek để biết cách thực hiện việc này.

Bây giờ không cần phụ thuộc vào jQuery. Nếu bạn đang sử dụng jQuery, thật tuyệt ... nếu bạn không, bạn không cần chỉ dựa vào nó để chọn các thành phần theo thuộc tính nữa.


Không có một cách rất ngắn để làm điều này trong javascript vanilla, nhưng có một số giải pháp có sẵn.

Bạn làm một cái gì đó như thế này, lặp qua các yếu tố và kiểm tra thuộc tính

Nếu một thư viện như jQuery là một tùy chọn, bạn có thể làm điều đó dễ dàng hơn một chút, như thế này:

$("[myAttribute=value]")

Nếu giá trị không phải là định danh CSS hợp lệ (nó có dấu cách hoặc dấu chấm trong đó, v.v.), bạn cần dấu ngoặc kép quanh giá trị (chúng có thể là một hoặc hai):

$("[myAttribute='my value']")

Bạn cũng có thể làm start-with, ends-with, contains, vv ... có một số tùy chọn cho bộ chọn thuộc tính .


6
Trên thực tế API API DOM vanilla hoạt động khá tốt trên các trình duyệt hiện đại
Wojtek Kruszewski

2
@WojtekKruszewski không phải vào năm 2010 :) Tôi đã cập nhật mặc dù, hy vọng người hỏi sẽ chuyển sự chấp nhận cho chúng tôi - chúng tôi muốn có thông tin hiện tại ngoài đó.
Nick Craver

1
Tôi nghĩ rằng jQuery (hoặc tương đương) có lẽ là dễ nhất đặc biệt là tương thích trình duyệt chéo mà không cần phải biết những gì yêu cầu.
Alexis Wilke

1
Tôi tiếp tục nhận được một mảng trống! Tôi đang cố lấy một SVG bằng thuộc tính d và đang thử $ ("[d = path]"); trong đó 'path' là một biến chứa thuộc tính d cụ thể mà tôi cần. Có ai đã thử làm điều này với các đường dẫn svg chưa?
tx291

438

Các trình duyệt hiện đại hỗ trợ bản địa querySelectorAllđể bạn có thể làm:

document.querySelectorAll('[data-foo="value"]');

https://developer.mozilla.org/en-US/docs/Web/API/Document.querySelector ALL

Chi tiết về khả năng tương thích trình duyệt:

Bạn có thể sử dụng jQuery để hỗ trợ các trình duyệt lỗi thời (IE9 trở lên):

$('[data-foo="value"]');

2
để cụ thể hóa định nghĩa "hiện đại": caniuse.com/#search=querySelector
ALL

Có vẻ như giá trị không thể là một con số hoặcSyntaxError: An invalid or illegal string was specified
jeum

3
Công cụ chọn phải là:'[data-foo="value"]'
Yotam Omer

1
Bất kỳ lưu ý về nước hoa? Đây có phải là nhanh hơn sau đó lặp đi lặp lại trên tất cả các nút?
Stepan Yakovenko

1
"Data-foo" là gì ... và 'myAttribution' đã đi đâu trong ví dụ này?
oo_dev

38

Chúng ta có thể sử dụng bộ chọn thuộc tính trong DOM bằng cách sử dụng document.querySelector()document.querySelectorAll()phương thức.

cho bạn:

document.querySelector("selector[myAttribute='aValue']");

và bằng cách sử dụng querySlectorAll():

document.querySelectorAll("selector[myAttribute='aValue']");

Trong querySelector()querySelectorAll()phương thức chúng ta có thể chọn các đối tượng khi chúng ta chọn trong "CSS".

Tìm hiểu thêm về bộ chọn thuộc tính "CSS" trong https://developer.mozilla.org/en-US/docs/Web/CSS/Attribution_selector


Tôi đã phải xóa dấu ngoặc kép bên trong như tài liệu này.querySelector ALL ("selector [myAttribution = aValue]");
Matjaz Hirsman

20
FindByAttributeValue("Attribute-Name", "Attribute-Value");   

ps nếu bạn biết loại phần tử chính xác, bạn thêm tham số thứ 3 (tức là div, a, p ...etc...):

FindByAttributeValue("Attribute-Name", "Attribute-Value", "div");   

nhưng lúc đầu, xác định hàm này:

function FindByAttributeValue(attribute, value, element_type)    {
  element_type = element_type || "*";
  var All = document.getElementsByTagName(element_type);
  for (var i = 0; i < All.length; i++)       {
    if (All[i].getAttribute(attribute) == value) { return All[i]; }
  }
}

ps cập nhật theo ý kiến ​​bình luận.


6
Tại sao ?! Bạn đang lặp tất cả DOM của mình bằng cách thực hiện việc này
Arthur

3
Điều này có vẻ tuyệt vời - nếu bạn chỉ có 5 yếu tố trên trang.
sheriffderek

2
document.querySelectorAll('[data-foo="value"]');như đề xuất của @Wojtek Kruszewski trên awnser được chấp nhận.
Arthur

7

Dưới đây là một ví dụ, Cách tìm kiếm hình ảnh trong tài liệu theo thuộc tính src:

document.querySelectorAll("img[src='https://pbs.twimg.com/profile_images/........jpg']");


0

Sử dụng bộ chọn truy vấn, ví dụ:

document.querySelectorAll(' input[name], [id|=view], [class~=button] ')

input[name]Đầu vào các yếu tố với nametài sản.

[id|=view]Các yếu tố với id bắt đầu bằng view-.

[class~=button]Các yếu tố với buttonlớp.

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.