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廃止等で動かないページもあります。