2012-01-13 6 views
2

リンクがクリックされた場合、Firefoxの拡張機能で検出したいと考えています。これまでのところ、このために私はevent.targetがURLに簡単ですいくつかのリンクのためにウィンドウFirefoxのリンクをクリックして検出する

window.addEventListener("click", function(event) { handleWindowClick(event); }, false); 

    ... 

    handleWindowClick : function(event) { 
    if ("event.target is a link") { 
     // do something 
    } 
    }; 

にclickイベントリスナーを追加します。ただし、一部のリンクでは、たとえばevent.targetというHTMLSpanElementを取得します。私はリンクのクリックを捕まえようとしているのでしょうか、それとも別の方法がありますか?このように動作する場合、event.targerがリンクである場合、どのようにして正常にテストできるのでしょうか?

答えて

1

クリックイベントリスナーをアンカー(<a>)に配置してみませんか?

var hrefs = document.getElementsByTagName('a'); 

for (i = 0; i < hrefs.length; i++) { 
    hrefs[i].addEventListener(...) 
    ... 
} 

またはjQuery中:

$('a').click(function() { 
    ... 
}); 
+0

ご返信ありがとうございます。私はすでにこの解決策を見てきました。それはちょうど私が実際にリンクの間で異なっている必要はないので、ちょうど「過度の」のように少し見える。私はちょうどそれがリンクであるかどうかテストしたいと思う。しかし、おそらく私はこのアプローチで解決するでしょう。 – Christian

+0

@Christian、多くのプログラマーは、最も重要なことを最適化するのに多くの時間を費やしています。 :-) – TMS

+0

当面はこのソリューションを使用します。私が念頭に置いた結果を得るのは唯一のものです。 @トーマス:あなたはおそらく正しいです!ページに非常に多数のリンクがある場合、パフォーマンスの観点からはどういう意味が分かりません。それはちょうど_looks_私に不必要:)。 – Christian

2

あなたが任意のクリックを登録し、メインウィンドウにイベントリスナーを追加しています。問題が発生しているURLは、<span>タグで囲んでください。あなたが必要なのはevent delegation

+0

リンクありがとう!はい、このようなものがあると思いました。しかし、私は多かれ少なかれ、HTML構造を正しく理解しなければならないように見えますか?私がHTMLSpanElementをevent.targetとして取得するリンクは、次のようになります: 'Text'。しかし、SPANとDIVを持つ任意の構成要素があればどうなりますか?そして私は再帰的に行くことはできないと思う。ある時点で私はリンクを見つけるかもしれないからだ。 – Christian

1

これをチェックして、私はこれがあなたが探しているのではないかと期待しています。

window.addEventListener("click", function(event) { 
    handleWindowClick(event); 
}, false); 

function handleWindowClick(event){ 
    var origEl = event.target || event.srcElement; 
    if(origEl.tagName === 'A') 
     alert("anchor link is clicked"); 
    else if(origEl.parentNode.tagName === 'A') 
     alert("clicked inside anchor"); 
    else if(origEl.tagName === 'SPAN') 
     alert("span is clicked"); 
} 

フィドル:http://jsfiddle.net/5zXkN/3/

+0

あなたの投稿をありがとう!もちろん、それは動作するはずです。問題は、 'Link Text'のようなリンクと '普通のテキスト'のような通常のテキストのための私の必要性のために失敗するということです。両方のクリックは「スパンがクリックされた」結果となるが、一方はリンクであり、他方はリンクではない。 – Christian

+0

origEl.tagName == spanの場合はループします。 parentNodesは、uがボディに到達するまで、またはこのスパンを確認するための共通のタグがアンカーにないときに、アンカータグであるかどうかを確認します。 –

+0

ええ、絶対にあなたは親ノードをチェックすることができます。私はコードとサンプルも更新しました。それがあなたの目的を解決するかどうかを確認してください。 –

0

私は "A" - タグ内の任意の構造をサポートするためにdku.rajkumarの答えを拡張しました。私は単に "A"を見つけるか、私がルートにいる(この場合、リンクはクリックされていない)まで、ツリーを上っていくだけです。それはトリックを行うようだ。あなたの助けに感謝します!

window.addEventListener("click", function(event) { handleWindowClick(event); }, false); 
... 

isLink : function(element) { 
    if(element.tagName === 'A') 
    return true; 
    else 
    if (element.parentNode) 
     return this.isLink(element.parentNode) 
    else 
     return false; 
}, 

handleWindowClick : function(event) { 
    var element = event.target || event.srcElement; 
    var isLink = this.isLink(element); 
    if (isLink) 
    dump("A link has been clicked.\n"); 
}, 
関連する問題