querySelector, yếu tố ký tự đại diện phù hợp?


133

Có cách nào để thực hiện khớp tên phần tử ký tự đại diện bằng cách sử dụng querySelectorhay querySelectorAllkhông? Tôi thấy hỗ trợ cho các ký tự đại diện trong các truy vấn thuộc tính nhưng không phải cho chính các thành phần.

Tài liệu XML mà tôi đang cố phân tích về cơ bản là một danh sách các thuộc tính và tôi cần tìm các phần tử có các chuỗi nhất định trong tên của chúng.

Tôi nhận ra rằng tài liệu XML có thể cần tái cấu trúc nếu tôi cần điều này nhưng điều đó sẽ không xảy ra.

Bất kỳ giải pháp nào ngoại trừ việc quay lại sử dụng XPath rõ ràng không dùng nữa (IE9 đã bỏ nó) đều được chấp nhận.


"Tên" bạn có nghĩa là tên thẻ?
kennytm

1
Câu trả lời của @ JaredMcAerer rất đáng được chấp nhận như một câu trả lời. Xin vui lòng xem xét.
RBT

Câu trả lời:


346

[id^='someId']sẽ phù hợp với tất cả các id bắt đầu bằng someId.

[id$='someId']sẽ phù hợp với tất cả các id kết thúc bằng someId.

[id*='someId']sẽ phù hợp với tất cả các id chứa someId.

Nếu bạn đang tìm kiếm namethuộc tính chỉ cần thay thế idbằng name.

Nếu bạn đang nói về tên thẻ của thành phần tôi không tin có một cách sử dụng querySelector


4
Cảm ơn, tôi có nghĩa là tên thẻ.
Erik Andersson

hmm Tôi không thể làm tài
liệu.querySelector ALL

4
Khoảng thời gian có lẽ làm rối tung document.querySelectorAll("div[id$='foo']")IE8 chỉ có hỗ trợ QSA một phần, tôi nghĩ rằng chúng chỉ hỗ trợ các bộ chọn CSS2.1, vì vậy các bộ chọn này sẽ không hoạt động trong IE8, nhưng IE9 + sẽ hoạt động.
JaredMcAteer

Câu trả lời này đã cứu mạng tôi! Cảm ơn bạn!!
Menas

28

Tôi đã nhầm lẫn / tập trung vào một dòng liên quan đến querySelector () và đã kết thúc tại đây, và có một câu trả lời khả dĩ cho câu hỏi OP bằng cách sử dụng tên thẻ & querySelector (), với các khoản tín dụng cho @JaredMcAteer để trả lời câu hỏi MY, hay còn gọi là RegEx khớp với querySelector () trong vanilla Javascript

Hy vọng những điều sau đây sẽ hữu ích và phù hợp với nhu cầu của OP hoặc của mọi người khác:

// basically, of before:
var youtubeDiv = document.querySelector('iframe[src="http://www.youtube.com/embed/Jk5lTqQzoKA"]')

// after     
var youtubeDiv = document.querySelector('iframe[src^="http://www.youtube.com"]');
// or even, for my needs
var youtubeDiv = document.querySelector('iframe[src*="youtube"]');

Sau đó, chúng ta có thể lấy các thứ src, v.v ...

console.log(youtubeDiv.src);
//> "http://www.youtube.com/embed/Jk5lTqQzoKA"
console.debug(youtubeDiv);
//> (...)

12

Đặt tagName làm thuộc tính rõ ràng:

for(var i=0,els=document.querySelectorAll('*'); i<els.length;
          els[i].setAttribute('tagName',els[i++].tagName) );

Tôi cần điều này cho bản thân mình, cho một Tài liệu XML, với các Thẻ lồng nhau kết thúc bằng _Sequence. Xem câu trả lời của JaredMcAteer để biết thêm chi tiết.

document.querySelectorAll('[tagName$="_Sequence"]')

Tôi không nói nó sẽ đẹp :) PS: Tôi khuyên bạn nên sử dụng tag_nametrên tagName, vì vậy bạn không gặp phải sự can thiệp khi đọc 'máy tính được tạo', ẩn các thuộc tính DOM.


8

Tôi chỉ viết kịch bản ngắn này; dường như làm việc

/**
 * Find all the elements with a tagName that matches.
 * @param {RegExp} regEx  regular expression to match against tagName
 * @returns {Array}       elements in the DOM that match
 */
function getAllTagMatches(regEx) {
  return Array.prototype.slice.call(document.querySelectorAll('*')).filter(function (el) { 
    return el.tagName.match(regEx);
  });
}
getAllTagMatches(/^di/i); // Returns an array of all elements that begin with "di", eg "div"

đối tượng được trả về bởi querySelectorAll không nhất thiết phải hỗ trợ bộ lọc trên tất cả các trình duyệt (vì nó không phải luôn luôn là một mảng javascript thông thường). Đảm bảo kiểm tra xác nhận này trong sản xuất, trước khi tập lệnh được tạo (nếu tập lệnh được tạo động) hoặc sử dụng các câu lệnh điều kiện.
Dmitry

Câu trả lời rất hay ... Đây là trận đấu kết thúc mà tôi thấy có vấn đề. Tôi đang làm việc với các yếu tố và tính năng tùy chỉnh như thế này vẫn là công việc thủ công, thật đáng buồn.
codepleb

-1

Có một cách bằng cách nói những gì không phải là. Chỉ cần làm cho cái gì đó không bao giờ sẽ được. Tham chiếu bộ chọn css tốt: https://www.w3schools.com/cssref/css_selector.asp hiển thị: không chọn bộ chọn như sau:

:not(selector)  :not(p) Selects every element that is not a <p> element

Dưới đây là một ví dụ: một div theo sau bởi một cái gì đó (bất cứ thứ gì trừ thẻ az)

div > :not(z){
 border:1px solid pink;
}
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.