1

以下は、Joomla のプラグインのコードです。それ自体で動作し、その目的は、ページ上の外部リンクを検出し、_blank を使用してそれらを新しいブラウザー ウィンドウに強制することです。

私は約1時間試しましたが(JavaScriptはよくわかりません)、onclick機能を機能させる方法がわかりません。

最終的な結果として、2 番目のコード セクションに示されている確認ダイアログの機能をこのスクリプトに追加したいと考えています。

外部リンクをクリックすると、確認ダイアログが表示され、「はい」と表示された場合は、外部 URL にアクセスして新しいウィンドウで開くことができます。それ以外の場合はキャンセルされ、何もしません。

とのリンクを作成すると

onclick="return ExitNotice(this.href);"
その中では完全に機能しますが、私のWebサイトには複数の人が入力を送信しているため、確認ボックスをグローバルにしたいと思います.

this.blankwin = function(){
  var hostname = window.location.hostname;
  hostname = hostname.replace("www.","").toLowerCase();
  var a = document.getElementsByTagName("a");   
  this.check = function(obj){
    var href = obj.href.toLowerCase();
    return (href.indexOf("http://")!=-1 && href.indexOf(hostname)==-1) ? true : false;              
  };
  this.set = function(obj){
    obj.target = "_blank";
    obj.className = "blank";
  };    
  for (var i=0;i<a.length;i++){
    if(check(a[i])) set(a[i]);
  };        
};

this.addEvent = function(obj,type,fn){
  if(obj.attachEvent){
    obj['e'+type+fn] = fn;
    obj[type+fn] = function(){obj['e'+type+fn](window.event );}
    obj.attachEvent('on'+type, obj[type+fn]);
  } else {
    obj.addEventListener(type,fn,false);
  };
};
addEvent(window,"load",blankwin);

第二部

/* ----------
  OnClick External Link Notice
---------- */
function ExitNotice(link,site,ltext) {
  if(confirm("-----------------------------------------------------------------------\n\n" + 
    "You're leaving the HelpingTeens.org website. HelpingTeens.org\ndoes not " + 
    "control this site and its privacy policies may differ\nfrom our own. " + 
    "Thank you for using our site.\n\nYou will now access the following link:\n"  + 
    "\n" + link + "\n\nPress \'OK\' to proceed, or  press \'Cancel\' to remain here." + 
    "\n\n-----------------------------------------------------------------------")) 
  {
  return true;
} 
history.go(0);
return false;
}

A) この問題を解決するのを手伝ってくれる人はいますか? または B) より良い解決策はありますか?

4

3 に答える 3

1

すべてが今、私が望むように機能します。ご協力ありがとうございました。SO を使用するのはこれが初めてなので、正しくクレジットされていることを願っています。コメント ボックスにコードを表示する方法が (または、可能であったとしても) わからないので、自分の質問に答えて、他の人が利益を得られるように最終的なコードを示すことにしました。

繰り返しますが、希望どおりに動作させるために変更する必要がある構文を示してくれました。

ありがとう!

最終コード

    this.set = function(obj){
            var href = obj.href;
            //obj.href = "javascript:void(0)";
            obj.onclick = function() { return ExitNotice(href)};
            obj.target = "_blank";
            obj.className = obj.className + " blank";
    };
于 2009-06-29T20:07:27.217 に答える
0

それで、私はあなたが求めていると思うことを要約し、それからそれがどのように解決できると思うかをあなたに話します。私があなたの質問を誤解した可能性があります。

すべてのタグを通過し、ターゲット属性を「_blank」に設定し、classNameを「blank」に設定するコードがあります。代わりに、JavaScriptを使用して確認ダイアログを表示するようにリンクを書き直して、ユーザーが[はい]をクリックした場合の場所。

この場合、リンクが次のように記述されているかのようにリンクを作成する必要があると思います。

<a href="javascript:void(0)" onclick="if (ExitNotice('http://www.whatever.com')) window.location.assign('http://www.whatever.com')">

javascript:void(0)を使用すると、クリックの通常のブラウザー処理が別のページに移動しないため、onclickを実行する時間があります。

これを実現するには、this.set(this.blankwin内)の定義を次のように変更する必要があります。

  this.set = function(obj){
    var href = obj.href;
    obj.href = "javascript:void(0)";
    obj.onclick = function() { (if ExitNotice(href) window.location.assign(href); };
    obj.target = "_blank";
    obj.className = "blank";
  };

void(0)については、こちらをご覧ください。

また、obj.classNameを「空白」に設定するコードは、リンクにすでに割り当てられている他のclassNameを削除するため、適切ではないことに注意してください。代わりに、次のように、既存のクラス名にクラス名を追加することができます。

obj.className = obj.className + " blank";
于 2009-06-29T18:34:08.383 に答える
0

コードをもう少し洗練させました。mfblank.js を次の内容に変更することを検討してください。したがって、すべてのスクリプトが 1 つのファイルにのみ含まれ、追加の rel=nofollow が追加されます。このスクリプトをお楽しみください...

this.blankwin = function(){
  var hostname = window.location.hostname;
  hostname = hostname.replace("www.","").toLowerCase();
  var a = document.getElementsByTagName("a");   
  this.check = function(obj){
    var href = obj.href.toLowerCase();
    return (href.indexOf("http://")!=-1 && href.indexOf(hostname)==-1) ? true : false;              
  };  
  this.set = function(obj){
            var href = obj.href;
            obj.onclick = function(){ if(confirm("Do you wanne leave this page?")) {
              return true;
            } 
              history.go(0);
              return false;
            };
            obj.target = "_blank";
            obj.className = obj.className + " blank";
            obj.rel = "nofollow";
    };
    for (var i=0;i<a.length;i++){
        if(check(a[i])) set(a[i]);
    };      
  }; 
  this.addEvent = function(obj,type,fn){
        if(obj.attachEvent){
            obj['e'+type+fn] = fn;
            obj[type+fn] = function(){obj['e'+type+fn](window.event );}
            obj.attachEvent('on'+type, obj[type+fn]);
        } else {
            obj.addEventListener(type,fn,false);
        };
    };
    addEvent(window,"load",blankwin);
于 2010-03-16T16:55:54.197 に答える