Domanda

Di seguito è riportato il codice di un plugin per Joomla. Funziona da solo e il suo scopo è quello di rilevare collegamenti esterni sulla pagina e forzarli in nuove finestre del browser usando _blank.

Ho provato per circa un'ora (non conosco bene JavaScript) ma non riesco a capire come far funzionare una funzione onclick.

Risultato finale, voglio aggiungere a questo script la possibilità di una finestra di dialogo di conferma, mostrata nella sezione 2 ° codice.

Quando si fa clic su un collegamento esterno, verrà visualizzata la finestra di dialogo di conferma e, in caso affermativo, saranno in grado di accedere all'URL esterno, aprendosi in una nuova finestra. Altrimenti, annulla e non fa nulla.

Quando creo un link con

onclick="return ExitNotice(this.href);"
funziona perfettamente, ma poiché il mio sito web ha più persone che inviano input, vorrei che la casella di conferma fosse globale.

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);

Seconda parte

/* ----------
  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) Qualcuno può aiutarmi a risolvere questo problema? oppure B) Esiste una soluzione migliore?

È stato utile?

Soluzione

Quindi, riassumerò ciò che penso tu stia chiedendo e poi ti dirò come penso che possa essere risolto. È possibile che ho frainteso la tua domanda.

Hai un codice che attraversa tutti i tag e imposta il loro attributo target su " _blank " e imposta className su " vuoto " ;, e desideri invece riscrivere i collegamenti per utilizzare JavaScript per mostrare una finestra di conferma e andare alla posizione solo se l'utente fa clic su Sì.

In questo caso credo che tu voglia che i link finiscano come se fossero scritti in questo modo:

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

Il javascript: void (0) fa sì che la normale gestione del clic da parte del browser non vada a un'altra pagina, in modo che il tuo onclick abbia il tempo di eseguire.

Per far sì che ciò accada, ti consigliamo di cambiare la definizione di this.set (dentro this.blankwin) in qualcosa del genere:

  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";
  };

Vedi qui per informazioni sul vuoto (0).

Inoltre, si noti che il codice che imposta obj.className su " blank " non è eccezionale, perché rimuoverà qualsiasi altro className già assegnato al collegamento. Puoi invece semplicemente aggiungere il nome della classe a quelli esistenti, in questo modo:

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

Altri suggerimenti

Tutto funziona come lo voglio ora. Grazie per l'aiuto. Poiché è la prima volta che utilizzo SO, spero di averti accreditato correttamente. Dal momento che non riesco a capire come (o anche se è possibile) mostrare il codice nelle caselle di commento, sto scegliendo di rispondere alla mia domanda con il codice finale affinché altri possano trarne vantaggio.

Ancora una volta, mi hai mostrato la sintassi che avevo bisogno di modificare per farlo funzionare come volevo.

GRAZIE!

Codice finale

    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";
    };

Ho perfezionato il codice un po 'di più. Ti preghiamo di considerare di cambiare mfblank.js nel seguente contenuto. Quindi ora tutto lo script è in un solo file E viene aggiunto un rel = nofollow aggiuntivo. Divertiti con questo script ...

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top