2010-04-29 3 views
5

hinzugefügt:"return false" wird in bestimmten Browsern ignoriert für Verbindung mit I dynamisch hinzufügen einen <einen> (Link) Tag des DOM dynamisch auf das DOM mit JavaScript

var link = document.createElement('a'); 
link.href = 'http://www.google.com/'; 
link.onclick = function() { window.open(this.href); return false; }; 
link.appendChild(document.createTextNode('Google')); 
//someDomNode.appendChild(link); 

mag ich den Link zu öffnen in einem neuen Fenster (ich weiß, es ist schlecht, aber es ist erforderlich). Ich habe auch versucht, das "Ziel" -Attribut zu verwenden, aber ich habe auch das falsche Verhalten mit dieser Lösung.

Mein Code funktioniert gut in IE und Firefox, aber die Rückgabe false funktionieren nicht in Safari, Chrome und Opera. Mit nicht funktionieren, ich meine, der Link folgt, nachdem das neue Fenster geöffnet wurde.

Ich glaube, ich wegen der V3 Google Maps Umgebung sein könnte ...

Edit: Um das Verhalten auf der tatsächlichen Seite:

  1. Zum http://tinyurl.com/29q6nw6
  2. Klicken Sie auf jeder Marker auf der Karte, wird eine Sprechblase angezeigt.
  3. Klicken Sie auf den Titel, im Ballon, sollte der Link in einem neuen Fenster (Arbeit in IE und FF öffnen, aber nicht in Safari, Chrome und Opera.

Jede Hilfe ist willkommen!

Edit2: Das Problem ist in der Funktion "MakeInfoWindowContent", die in "gmaps3.js" ist. Ich verwende DOM nicht zum Erstellen der Elemente (ich benutze Zeichenfolge), da diese HTML-Zeichenfolge an Google Maps (für das Infofenster) übergeben werden muss - der Ballon), tatsächlich wird der gleiche Link an zwei verschiedenen Orten erzeugt: einer links, der mit der DOM-Funktion erstellt wurde (wie in dieser Frage gezeigt), die in allen Browsern funktioniert, und einer im Ballon, cr Mit einem HTML-String versehen, funktioniert dieser in Safari, Chrome und Opera nicht gut (der Link folgt nach dem Öffnen des neuen Fensters sogar mit dem Rückgabewert false).

Edit 3: Noch keine Ahnung, warum das passiert ... Wenn jemand eine Idee haben, lass es mich wissen!

+0

Funktioniert für mich: http://jsbin.com/aqode#noedit Chrome 2 + 4, Opera 10, Safari 4 (alle Win). Klicken Sie auf den Link, ein neues Fenster/Tab wird geöffnet, das übergeordnete Fenster bleibt auf der gleichen Seite. –

+0

Es funktioniert auch für mich bei dieser URL, seltsam, dass es nicht funktioniert in meiner Seite mit dem gleichen Code: S Vielleicht liegt es an der Google Maps-Umgebung. Aktualisierte Frage mit mehr Details ... – AlexV

Antwort

3

Würde möglicherweise verhindern, Standardaktion für das Ereignis arbeiten? Ich bin mir nicht sicher, ob gmaps Links in seinem Info-Fenster auf andere Weise behandelt, wenn nicht, sollte es funktionieren.

Update: erstes Beispiel hat nicht funktioniert. Das Ereignis wurde nicht übergeben, wenn "inline" onclick verwendet wird, um ein Ereignis zuzuweisen. Dieser ist tested and found to be working.

function bindEvent(target, event, handler) { 
    if (typeof target.addEventListener != 'undefined') {  
     target.addEventListener(event, handler, false); 
    } else if (typeof target.attachEvent != 'undefined') { 
     target.attachEvent('on' + event, handler); 
    } 
} 

var link = document.createElement('a'); 
link.href = 'http://www.google.com/'; 
link.appendChild(document.createTextNode('Google')); 

bindEvent(link, 'click', function (e) { 
    if (typeof e.preventDefault != 'undefined') { 
     // Common/W3C events 
     e.preventDefault(); 
    } 

    // (Old) IE specific events 
    e.returnValue = false; 

    var target = e.target || e.srcElement; 
    window.open(target.href); 

    return false; 
}); 

document.getElementsByTagName('body')[0].appendChild(link); 
+0

Es funktioniert nicht, aber es ist das nächste von dem, was ich es gelernt hätte. Meine Schlussfolgerung ist, dass es Google Maps ist, die meine Ereignisse stören ... – AlexV

0

Wie wäre es mit der Verwendung von Skript, um das Fenster zu öffnen?

+0

Getestet diese Lösung und ich habe das gleiche Problem. Aktualisierte Frage mit mehr Details ... – AlexV

+0

Ich testete das Hinzufügen von target = "_ blank" zum Element und es funktionierte (Sie sollten den onclick Event-Handler dann entfernen). –

1

Das Problem könnte ein Skriptfehler sein, der die Ausführung von JavaScript abbricht, bevor die Rückgabe false erreicht wird. In diesem Fall wird normalerweise die Verbindung verfolgt. Überprüfen Sie, ob Sie eine browserspezifische Methode/Eigenschaft verwenden und nach JavaScript-Fehlern suchen.

Ich kann Ihr Skript nicht überprüfen, da es nicht verfügbar scheint atm obwohl.

+0

Das Skript, wie Sie sehen können, ist wirklich einfach und funktioniert in IE 6-7-8 und Firefox. Ich bezweifle sehr, dass es sich um einen Skriptfehler handelt, da ich in den Fehlerprotokollen in Chrome, Safari und Opera nichts sehen kann. – AlexV

+0

Sie sollten überprüfen, ob Sie die Rückgabe trotzdem erreichen (vielleicht nur eine Warnung hinzufügen). Wenn Sie es erreichen, dann unterstützen die Browser diese Syntax für das Setzen von onclick-Ereignissen einfach nicht. Versuchen Sie '#' als href, wenn Sie sich nicht um Benutzer ohne Javascript sorgen müssen. – dbemerlin

+0

Ich habe eine Warnung ('debug') nach der Rückkehr hinzugefügt und die Warnung wird nicht angezeigt, so dass die Rückkehr ausgeführt wird, aber in einigen Browsern ignoriert ... Seltsam! – AlexV

1

paar Ideen

  • Google Maps irgendwie wieder Kopien (nur eine Vermutung) html Inhalt vor Pop-up und Blätter js Ereignisse hinter öffnen. Sie könnten versuchen, Ereignis-Listener anzuhängen, nachdem gmap popup geöffnet wurde.

  • in function MakeInfoWindowContent() code contructs events durch concating strings - vielleicht sollten Sie es auch versuchen.

  • Letzter (und dummer einer) Vorschlag: versuchen Sie, addEventListener anstelle des Ereignisses direkt zu verwenden.

+0

Nach einer Suche ist es die verknüpfende, die nicht funktioniert (die in MakeInfoWindowContent). Die in reinem JavaScript funktioniert ... – AlexV

2

Stellen Sie den href-'javascript:void(0);' und statt this.href in Ihrem Onclick-Handler, Hart Code die URL dort stattdessen verweist.

0
var link = document.createElement('A'); 
link.setAttribute('href', 'http://www.google.com/'); 
link.setAttribute('onclick', 'window.open(this.href, "_blank");return false;'); 
link.appendChild(document.createTextNode('Google')); 
0

Try this:

link.onclick = function(event) { 
    window.open(this.href); 
    if (event.stopPropagation) 
     event.stopPropagation(); 
    return false; 
}; 

I modifiziert direkt das DOM, über die Chrome-Entwickler-Werkzeuge und es funktionierte für mich.

0

Sie sind eigentlich nicht "dynamisch hinzufügen ein Link-Tag zum DOM". Ihr Code verkettet nur HTML-Zeichenfolgen. Ersetzen Sie Ihre MakeInfoWindowContent-Funktion (in gmaps3.js) durch native DOM-Methoden.

function MakeInfoWindowContent(name, institutionName, description, address, url) { 
    var result = document.createElement('div'); 
    result.className = 'infoBulle'; 
    // etc. 
    return result; 
} 
0

@AlexV - Sie müssen Inline onclick Ereignisse atomisch halten. Es gibt zwei einfache Lösungen: wickeln die gesamte Aktion in einer einzigen selbstausführende Funktion oder die window.open() und return false in seine eigene Funktion bewegen:

Option One

eine self-executing anonyme Funktion verwenden.

result += ' <h3><a href="' + url + '" onclick="(function(){window.open(' + url + '); return false;})()">' + instituteName + '</a></h3>' + "\n"; 

Option Zwei

Bewegen Sie den Code in seine eigene Funktion:

function openCustomWindow(url) { 
    window.open(url); 
    return false; 
} 

... und diese Funktion rufen Sie stattdessen:

result += ' <h3><a href="' + url + '" onclick="openCustomWindow(' + url + ')">' + instituteName + '</a></h3>' + "\n"; 

[EDIT] I Es tut mir so leid. Das habe ich total vermisst. Sie sollten immer noch eine der beiden obigen Methoden ausführen (nur eine Funktion kann return false, keine Anweisung). Das Problem hier ist eigentlich, dass Ihr this von Ihrer Funktion zum tatsächlichen onclick ändert. Bei Ausführung im Onclick bezieht sich this auf window, nicht auf das Ereignis. Da es keine window.href gibt, schlägt die Anweisung zu window.open(undefined) fehl. Und weil es fehlschlägt, schlägt der <a> Tag in Ich denke, zweimal die URL angeben (einmal im <a href> und wieder in den window.open() sollte es beheben

+0

Ahh Ich habe sicherlich gesagt, das würde funktionieren, aber keine Ihrer Lösungen funktioniert (der Link folgt, nachdem das neue Fenster in Safari, Chrome und Opera geöffnet wurde). – AlexV

+0

Wow. Habe das Problem komplett vermisst. Ich habe die Antwort aktualisiert. Es ist wirklich schwierig, den Inhalt des Google Maps-Fensters zu zerstören. Ich musste 'document.getElementById ('resultMap'). InnerHTML' verwenden, um zu sehen, wie das gerenderte HTML in Safari (und FF) aussah. Ich frage mich, wie sie das tun ... – Andrew

0

Versuchen jQuery Ereignis Delegation mit:..

function initialize(){ 
    // ... code ... 

     $("#resultMap").delegate("a.myLink").click(function(){ 
      window.open(this.href, "myWindow"); 
      return false; 
     }); 
     Search(); 

    // ... more code ... 
} 


function MakeInfoWindowContent(name, instituteName, description, address, url) 
{ 
    var result = '<div class="infoBulle">'; 
    if (url != '') 
     result += ' <h3><a href="' + url + '" class="myLink">' + instituteName + '</a></h3>'; 
    else 
     result += ' <h3>' + instituteName + '</h3>'; 
    if (Trim(description) != '') 
     result += ' <p>' + description + '</p>'; 
    result += ' <p>' + address + '</p>'; 
    result += '</div>'; 
    return result; 
} 
0

I‘ habe diese Lösung getestet und es funktioniert!

Ich schlage Ihnen einen anderen Ansatz vor, aber meiner Meinung nach einfacher und sauberer: Verwenden Sie jQuery .Live-Ereignisse (ich sehe, dass Sie bereits jQuery verwenden, also sollte es keine Probleme dabei tun)!

Sie nur zwei kleine Änderungen brauchen:

Erster Wechsel:

Ändern der 3. Zeile von MakeInfoWindowContent Funktion Links auf diese Weise zu erstellen (es entfernt nur die Onclick-Attribut und fügt eine Klasse für Klarheit) :

result += '<h3><a class="marker_link" href="' + url + '">' + instituteName + '</a></h3>' + "\n"; 

Zweite Änderung:

Wo auch immer Sie (zum Beispiel auf DOM Last oder vor Kartenerstellung) wollen ausführen dies:

$('div#resultMap a.marker_link').live('click', function(e) { 
    window.open(this.href); 
    e.preventDefault(); 
}); 

End :)

Dies das Click-Ereignis auf das Dokument in der Bubbling-Phase arbeitet abfängt. Ich habe es ausprobiert und es funktioniert sogar mit Google Chrome.

+0

Tatsächlich verwendet es die gleiche Idee der Antwort von David Murdoch. –

+0

Scheint nicht zu funktionieren, da die Links dynamisch zur Seite hinzugefügt werden. Ich habe versucht, die 2. Änderung an der richtigen Stelle auszuführen, aber die Funktion append wird nicht gemacht. – AlexV

+0

Lassen Sie mich Ihnen beweisen, dass es funktioniert :) Öffnen Sie Google Chrome und gehen Sie auf die interessierte Seite: http://www.plateformesinnovie.com/. Drücken Sie dann Shift + Ctrl + J, um die Javascript-Konsole zu öffnen und den folgenden Code auszuführen (in die Konsole einzufügen) (es ist ein anderer Code als oben, ich habe die Klasse marker_link entfernt): '$ ('div # resultMap a ') .live (' click ', Funktion (e) {window.open (this.href); e.preventDefault();}); '. Dann klicken Sie auf den Link in einem Marker und Sie würden bemerken, dass jetzt der Link nicht in der aktuellen Seite gefolgt wird, sondern nur in (zwei) neuen Fenstern !!. –

Verwandte Themen