1

下面是来自 Joomla 插件的代码。它独立工作,其目的是检测页面上的外部链接并使用 _blank 强制它们进入新的浏览器窗口。

我已经尝试了大约一个小时(我不太了解 javascript),但我似乎无法弄清楚如何让 onclick 函数正常工作。

最终结果,我想在此脚本中添加确认对话框的功能,如第二个代码部分所示。

单击外部链接时,将弹出确认对话框,如果它说是,他们将能够访问外部 URL,并在新窗口中打开。否则,它会取消,并且什么也不做。

当我创建一个链接时

onclick="return ExitNotice(this.href);"
在其中它工作得很好,但由于我的网站有多个人提交输入,我希望确认框是全局的。

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 设置为“空白”,您希望改写链接以使用 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 更改为以下内容。所以现在,所有脚本都在一个文件中,并且添加了一个额外的 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 回答