JavaScriptでXPath 特定の文字列を含む要素を取得
jQueryやquerySelectorでは:containsが未実装
jQueryでは一応できるがpure JavaScriptで挑戦
さらに取得したNodeから要素を探す
XPathならば親子要素の移動検索が楽
Seleniumや拡張機能などの操作自動化に活用できる。
aaaaaaa
|
|
bbbbbbb
bcbcbcb
|
|
bbbbbbb
ccccccc
|
|
eeeeeee
bcbcbcb
|
|
bbbbbbb
bcbcbcb
|
view source
JavaScript
// XPath に変数を用いる際はクォーテーションの外に書くこと
window.addEventListener('load', function(event) {
var xpathText = 'bbbbbb';
var xpathResult = document.evaluate(
'//span[contains(text(), "'+ xpathText +'")]',
document,
null,
XPathResult.FIRST_ORDERED_NODE_TYPE,
null
);
console.log(xpathResult);
xpathResult.singleNodeValue.style.color = "#faa";
thElement = xpathResult.singleNodeValue.parentNode.parentNode.parentNode;
console.log(thElement);
targetInputs = thElement.querySelectorAll('input');
console.log(targetInputs);
targetInputs.forEach(function(item){
item.checked = true;
});
// XPath で特定の小要素を持つ親要素の中の別の孫要素を探す
// xpathResultには forEach が効かないのでiteratorかforを使う。
var xpathText1 = 'bbbbbb';
var xpathText2 = 'bcbcbc';
var xpathResult = document.evaluate(
'//tr[.//span[contains(text(), "' + xpathText1 + '")]]' +
'//span [contains(text(), "' +xpathText2 + '")]',
document,
null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null
);
for(var i=0;i<xpathResult.snapshotLength;i++){
target = xpathResult.snapshotItem(i);
target.style.color = "#00f";
console.log(target);
}
});
CSS
td{
border:1px solid #000;
padding:8px;
}
HTML
ページのソースを表示 : Ctrl+U , DevTools : F12
view-source:https://hi0a.com/demo/-js/js-xpath-contains/
ABOUT
hi0a.com 「ひまアプリ」は無料で遊べるミニゲームや便利ツールを公開しています。
プログラミング言語の動作デモやWEBデザイン、ソースコード、フロントエンド等の開発者のための技術を公開しています。
必要な機能の関数をコピペ利用したり勉強に活用できます。
プログラムの動作サンプル結果は画面上部に出力表示されています。
環境:最新のブラウザ GoogleChrome / Windows / Android / iPhone 等の端末で動作確認しています。
画像素材や音素材は半分自作でフリー素材配布サイトも利用しています。LINK参照。
動く便利なものが好きなだけで技術自体に興味はないのでコードは汚いです。
途中放置や実験状態、仕様変更、API廃止等で動かないページもあります。