2

ユーザーがリンクを右クリックすると、おいしいブックマークを作成するサファリ拡張機能(主に学習目的)を構築しようとしています。WWDCのSafari拡張機能の作成ビデオを見ましたが、すべて正常に機能しています。

ユーザーがリンク(または単にテキスト)をクリックしたかどうかを確認する方法がわからないことを除いて、クリックした場合は、URLとタイトルを取得します。私がこれまでに得たものはこれです:

document.addEventListener("contextmenu", handleContextMenu, false);
function handleContextMenu(event){
    safari.self.tab.setContextMenuEventUserInfo(event,getSelection().toString());
}

しかし、これは明らかに私に選択の文字列を与えるだけです。これで、Safariリファレンスライブラリによると、オブジェクトgetSelection()が返されます。しかし、そこにさえ、選択したリンクのハンドルを私に与えるメソッドを見つけることができません。DOMSelection

お気づきかもしれませんが、私はこのjavascriptとDOM全体にかなり慣れていないので、これが明らかな質問である場合は失礼します:)

チャオ、スヴェン

4

2 に答える 2

3

右クリックするだけで、選択範囲がアンカー リンク内に設定されます。これは、そのテキスト ノードが選択されることを意味しますが、リンク ノード自体は選択されません。したがって、選択範囲内でリンクを見つけようとしても無駄です。

DOMSelectionを使用して、最後に選択されたテキスト ノードを取得し、要素focusNodeにたどり着くまでその祖先を確認できます。<a>それはあなたが望むことについて行うべきです。

var link = null;
var currentElement = event.getSelection().focusNode;
while (currentElement != null)
{
    if (currentElement.nodeType == Node.ELEMENT_NODE && currentElement.nodeName.toLowerCase() == 'a')
    {
        link = currentElement;
        break;
    }
    currentElement = currentElement.parentNode;
}
// link is now an <a> element if the user selected a link's contents
于 2010-06-20T15:47:01.457 に答える
0

event.targetzneakの答えはうまくいかなかったので、選択の代わりに作業しました:

var link = evt.target;
// get parent node in case of text nodes (old safari versions)
if(link.nodeType == Node.TEXT_NODE) {
    link = link.parentNode;
}
    // if for some reason, it's not an element node, abort
if(link.nodeType != Node.ELEMENT_NODE) {
    return;
}

// try to get a link element in the parent chain 
while(link != null && 
        currentElement.nodeType == Node.ELEMENT_NODE && 
        link.nodeName.toLowerCase() != "a") {
    link = link.parentNode;
}
if(link) {
   // do stuff
}
于 2013-05-30T21:39:27.927 に答える