与えられた:
<tr>
<td><a href="http://foo.com">Keyword 1</a></td>
<td><a href="http://bar.com">Keyword 2</a></td>
<td><a href="http://wombat.com">Keyword 3</a></td>
</tr>
<tr>
<td><a href="http://blah.com">Keyword 4</a></td>
<td><a href="http://woof.com">Keyword 5</a></td>
<td><a href="http://miaow.com">Keyword 6</a></td>
</tr>
テーブルセル内の各URIを一致させる必要があります。キーワードはドキュメント全体で一貫しています。ドキュメント全体のリンクを問題なく照合できます。
var links_in_document = document.evaluate(
"//a[starts-with(text(),'Keyword')]",
document,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null);
ただし、TRノードを参照する簡単な方法はありますが、行内のリンクを取得するための適切なXPathを見つけることができないようです。以下のスニペットは、最初のTDの最初のリンクを提供しているようですが、残りは提供していません。ヘルプ?
var links_in_row = document.evaluate(
".//a[starts-with(text(),'Keyword')]",
row,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null);
(ここで、「行」はコンテキストノードです)。
編集:おそらく私は明確ではありませんでした、私はドキュメントレベルからのリンクをうまく見つけることができます。XPathのコンテキストとしてTRノードを使用して、単一行のリンクを分離しようとしています。
編集:興味のために、解決策。私が取り組んでいた壊れたマークアップにはid属性がなかったので、いくつか追加して続行することができました。スニペット:
var exhibit_link;
for( var i = 0; i < all_exhibit_links.snapshotLength; i++ ) {
exhibit_link = all_exhibit_links.snapshotItem( i );
// The rows have no unique ID, so we need to give them one.
// This will give the XPath something to 'latch onto'.
exhibit_link.parentNode.parentNode.id = 'ex_link_row_' + i.toString();
exhibit_link.addEventListener( "click",
function( event ) {
var row_id = event.target.parentNode.parentNode.id;
// Find only those links that are within rows with the corresponding id
var row_links = document.evaluate(
"id('" + row_id + "')/td/a[starts-with(text(),'Exhibit')]",
document,
null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null);
// Open each link in a new tab
for( var j = 0; j < row_links.snapshotLength; j++ ) {
row_link = row_links.snapshotItem( j );
GM_openInTab( row_link.href );
}
// Suppress the original function of the link
event.stopPropagation();
event.preventDefault();
},
true );
}