1

1つのonmousedownイベントですべての外部リンクを書き換えるにはどうすればよいですか?

Facebookがリンクシムで何をするのかちょっと好きです

リンクシムに関する元のFacebookの記事を確認してください:http : //on.fb.me/zYAq0N

要件:

  • mainsite.comのすべてのサブドメインで機能するはずです。

  • example.comをmainsite.com/link.cgi?u=http://example.comにリダイレクトする必要があります

  • mainsite.comに属していないリンクのみをリダイレクトする必要があります。

用途:

これは、プライベートWebアプリのユーザーのセキュリティを確保し、リファラーを保護するためです。

FBの記事で指摘されているように、優れたUIを実現するには、その場で実行するのが最善です。

そのため、ユーザーがリンクにカーソルを合わせると正しいリンクが表示されますが、ユーザーがそれをクリックすると、jsはそれをmy.site.com/link.cgi=http://link.comにリダイレクトします。

前もって感謝します

解決済み:https : //gist.github.com/2342509

4

2 に答える 2

5

個々のリンクの場合:

function $(id){ return document.getElementById(id); }
$(link).onclick = function(){ this.href = "http://otherlink.com"; }

<a href="http://example.com" id="link">My Sheisty Link</a>

したがって、すべての外部リンクを取得するには:

window.onload = function(){
var links = document.getElementsByTagName("a");
for(a in links){
  var thisLink = links[a].href.split("/")[2];
  if(thisLink !=== window.location.hostname){
    links[a].href = "http://mainsite.com/link.cgi?u=" + links[a]; }
  // Or you could set onclick like the example above
  // May need to accommodate "www"
}}

編集:この答え
を 見つけて、より良いアイデアを得ました。

document.onclick = function (e) {
 e = e ||  window.event;
 var element = e.target || e.srcElement;

if (element.tagName == 'A') {
 var link = element.href.split("/")[2];
  if(link !=== window.location.hostname){
    links[a].href = "http://mainsite.com/link.cgi?u=" + links[a]; }
    return false; // prevent default action and stop event propagation
  }else{ return true; }
}};
于 2012-04-08T14:31:48.200 に答える
1

jQueryを使用する場合、以下が機能します

$('a:link').mousedown(function() { 
  this.href = 'http://my.site.com/link.cgi=' + this.href; 
});

さもないと

var anchors = document.getElementsByTagName('a');
for(var i = 0; i < anchors.length; i++) {
  var a = anchors[i];
  if(a.href) {
    a.addEventListener('mousedown', function(e) {
      this.href = 'http://my.site.com/link.cgi=' + this.href;
    }, false);
  }
}
于 2012-04-08T14:40:30.247 に答える