以下是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)有更好的解决方案吗?
答案 0 :(得分: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)的信息,请参阅here。
另外,请注意,将obj.className设置为“blank”的代码不是很好,因为它将删除已分配给该链接的任何其他className。您可以只将类名添加到现有名称中,如下所示:
obj.className = obj.className + " blank";
答案 1 :(得分:0)
现在一切都按我想要的方式运作。谢谢您的帮助。由于这是我第一次使用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";
};
答案 2 :(得分: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);