querySelector、ワイルドカード要素が一致しますか?


133

querySelectoror を使用してワイルドカード要素名の一致を行う方法はありquerySelectorAllますか?属性クエリではワイルドカードがサポートされていますが、要素自体はサポートされていません。

私が解析しようとしているXMLドキュメントは、基本的にプロパティのフラットリストであり、名前に特定の文字列が含まれている要素を見つける必要があります。

XMLドキュメントが必要な場合は、おそらく再構築が必要であることを理解していますが、それは起こりません。

明らかに非推奨となったXPath(IE9で削除された)の使用に戻る以外の解決策は許容されます。


「名前」とは、タグ名を意味しますか?
kennytm 2012年

1
@JaredMcAteerの回答は、回答として受け入れられるだけの価値があります。考えてください。
RBT 2017年

回答:


346

[id^='someId']で始まるすべてのIDに一致しsomeIdます。

[id$='someId']で終わるすべてのIDに一致しsomeIdます。

[id*='someId']を含むすべてのIDに一致しますsomeId

name属性を探している場合は、に置き換えidてくださいname

要素のタグ名について話している場合、私は使用する方法があるとは思いません querySelector


4
おかげで、タグ名を意味しました。
エリックアンダーソン、2012年

私はできませんdocument.querySelectorAll( "div。[id $ = 'foo']")
SuperUberDuper

4
そこでの期間は、おそらくそれをめちゃくちゃにされたdocument.querySelectorAll("div[id$='foo']")IE8は部分的にしかQSAをサポートしている、これらのセレクタはIE8で動作しませんので、私は、彼らが唯一のCSS2.1セレクタをサポートすると思うが、IE9 +が動作します。
JaredMcAteer 2016

この答えは私の命を救った!ありがとうございました!!
Menas

28

私はquerySelector()を含む1行をいじり/熟考していたが、ここで終了し、タグ名とquerySelector()を使用してOP質問に可能な回答があり、MY質問に回答するための@JaredMcAteerへのクレジット、別名RegExのようなバニラJavaScriptのquerySelector()と一致

以下が有用であり、OPのニーズまたは他の全員のニーズに合うことを願っています。

// 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"]');

次に、たとえば、srcのものなどを取得できます。

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

12

tagNameを明示的な属性として設定します。

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

XMLドキュメントの場合、自分でこれを必要としました_Sequence。詳細については、JaredMcAteerの回答を参照してください。

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

私はそれがきれいだとは言いませんでした:) PS:tag_nametagNameよりも使用することをお勧めします。そのため、「コンピュータで生成された」暗黙のDOM属性を読み取るときに干渉に遭遇しません。


8

私はこの短いスクリプトを書いたところです。動作するようです。

/**
 * 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"

querySelectorAllによって返されるオブジェクトは、必ずしもすべてのブラウザーでフィルターをサポートするわけではありません(常に通常のJavaScript配列ではないため)。スクリプトが生成される前に(スクリプトが動的に生成される場合)、または条件ステートメントを使用して、本番環境でこのアサーションを必ず確認してください。
ドミトリー

とてもいい答えです...これは私が私の問題に見つけた終盤戦でした。このようなカスタム要素と機能を使用していますが、残念ながらまだ手作業です。
codepleb

-1

そうでないものを言う方法があります。決してそうではない何かを作ってください。次のように:notセレクターを示す、優れたCSSセレクターリファレンス:https ://www.w3schools.com/cssref/css_selectors.asp :

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

次に例を示します。divの後に何か(azタグ以外のもの)が続きます。

div > :not(z){
 border:1px solid pink;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.