Проблема Javascript с предупреждением о подтверждении глобальной внешней ссылки - PullRequest
1 голос
/ 27 июня 2009

Ниже приведен код из плагина для 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;
}

А) Может кто-нибудь помочь мне решить эту проблему? или Б) Есть ли лучшее решение?

Ответы [ 3 ]

0 голосов
/ 30 июня 2009

Все работает так, как я хочу сейчас. Спасибо за помощь. Так как я впервые использую 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";
    };
0 голосов
/ 16 марта 2010

Я усовершенствовал код немного больше. Пожалуйста, подумайте об изменении 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);
0 голосов
/ 29 июня 2009

Итак, я подведу итоги того, о чем вы думаете, и затем расскажу, как, по моему мнению, это можно решить. Возможно, я неправильно понял ваш вопрос.

У вас есть код, который проходит через все теги и устанавливает для их целевого атрибута значение «_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) заставляет обычную браузерную обработку щелчка не переходить на другую страницу, поэтому у вашего клика есть время для выполнения.

Чтобы это произошло, вам нужно изменить определение 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 в значение «blank», не очень хорош, потому что он удалит любое другое className, уже назначенное ссылке. Вместо этого вы можете просто добавить имя класса к существующим, например так:

obj.className = obj.className + " blank";
...