質問: 選択範囲のリンク url の抽出 多数のリンクを持つウェブページから、マウスで選択した 部分に含まれるリンク先 url をブックマークレットで 取り出したいと思っています。 document.getelementsbytagname( "a" ) でリンクの一覧が取り出せますが、選択範囲外のものも 含まれます。 また、 document.getselection() で選択範囲が取り出せるのですが、そこにはリンク先の url が含まれていません。 選択範囲に含まれるリンク先 url を取り出すには どうすればよいでしょうか。
回答: getselection ということで ie は考慮外とします。 まず、firefox のメッセージに「deprecated method document.getselection() called. please use window.getselection() instead.」と出るように、document.getselection() は歴史的理由でのみ残されています(html5 にも明記)。window.getselection() を使うべきです。 単に uri を集めたいだけなら var df = getselection().getrangeat(0).clonecontents(); で選択範囲の複製木を documentfragment として取得できますので、後は文書順に辿って a 要素を探して行くだけです。firefox 3.5+ なら selectors api が最も手っ取り早いでしょう。 var result = array.map(df.queryselectorall('a'), function (a) { return a.href; }); もちろん firstchild/nextsibling/parentnode を駆使して地道に辿っても構いませんし、treewalker/nodeiterator を使うのも良いでしょう。残念ながら dom3-xpath は documentfragment に適用できません。 ※この方法は部分選択された a 要素を含むことになります。完全選択されたもののみ拾いたければ、selection#containsnode などを用いて選択範囲の両端を調査して下さい。 ※また、この方法は文書木の複製を利用しますので、文書木そのものに変更を加えるような作業はできません。例えば、選択範囲内の a 要素を拾ってスタイルを変更するような場合には、(selection.anchornode, selection.anchoroffset) が示す境界点から、(selection.focusnode, selection.focusoffset) が示す境界点までを文書順に辿って a 要素を探すことになります。場合分けが多くなりますが、効率の良い探し方を研究して下さい。