2009-10-15 12 views
113

Lorsqu'un utilisateur clique sur un lien, j'ai besoin de mettre à jour un champ dans une base de données, puis d'ouvrir le lien demandé dans une nouvelle fenêtre. La mise à jour n'est pas un problème, mais je ne sais pas comment ouvrir une nouvelle fenêtre sans les obliger à cliquer sur un autre lien hypertexte.Comment simuler target = "_ blank" dans JavaScript

<body onLoad="document.getElementById('redirect').click"> 
<a href="http://www.mydomain.com?ReportID=1" id="redirect" target="_blank">Report</a> 
</body> 
+1

Hm? 'target =" _ top "' ne s'ouvre pas dans une nouvelle fenêtre - 'target =" _ blank "' does. – Tomalak

+0

Si le lien est déjà ouvert dans une nouvelle fenêtre (en raison de target = "_ blank") et que le gestionnaire de clic javascript met déjà à jour votre base de données, pourquoi devriez-vous ouvrir la nouvelle fenêtre avec Javascript? –

Répondre

208
<script> 
    window.open('http://www.example.com?ReportID=1', '_blank'); 
</script> 

Le second paramètre est facultatif et est le nom de la fenêtre cible.

+1

'window.open' fait ce que' target = "_ blank" 'fait - il ouvre l'URL dans une nouvelle fenêtre. – ceejayoz

+2

oui. le second argument de window.open() est le "nom" que vous voulez donner à la fenêtre, similaire à la définition d'une cible sur un lien. https://developer.mozilla.org/En/DOM:window.open –

+1

Oh, je vois. window.open est bloqué par le bloqueur de pop-up Firefox, mais target = "_ blank" ne l'est pas. Dois-je demander au client d'activer les popups depuis son propre site? –

2

Vous pouvez extraire le href de la balise:

window.open(document.getElementById('redirect').href); 
7

Je sais que cela est fait et réglait beaucoup, mais voici ce que j'utilise pour résoudre le problème dans mon application.

if (!e.target.hasAttribute("target")) { 
    e.preventDefault();  
    e.target.setAttribute("target", "_blank"); 
    e.target.click(); 
    return; 
} 

Fondamentalement, ce qui se passe ici est que je lance un chèque si le lien a target=_blank attribut. Si ce n'est pas le cas, il arrête le déclenchement du lien, le configure pour s'ouvrir dans une nouvelle fenêtre puis clique dessus par programmation.

Vous pouvez aller plus loin et sauter l'arrêt du clic d'origine (et rendre votre code beaucoup plus compact) en essayant ceci:

if (!e.target.hasAttribute("target")) { 
    e.target.setAttribute("target", "_blank"); 
} 

Si vous utilisez jQuery pour abstraire la mise en œuvre d'ajouter un attribut cross-browser, vous devez utiliser au lieu de e.target.setAttribute("target", "_blank"):

jQuery(event.target).attr("target", "_blank") 

vous devrez peut-être retravailler pour l'adapter à votre cas d'utilisation exacte, mais voici comment je grattais démange.

Voici un demo en action pour vous de jouer avec.

(Le lien jsFiddle revient à cette discussion .. pas besoin d'un nouvel onglet :))

6

Je préfère personnellement en utilisant le code suivant si elle est pour un seul lien. Sinon, il est probablement préférable de créer une fonction avec du code similaire. J'ai commencé à l'utiliser pour contourner le test strict du XHTML du W3C.

+0

Je pense que JavaScript en ligne est plus compliqué que d'ajouter un attribut "non-standard" qui fonctionne partout. –

+0

@MattiVirkkunen dans certaines situations c'est la seule solution –

+0

@Claudiu: Si vous vous trouvez dans une telle situation absurde, vous devriez plutôt réparer la cause que kludge autour d'elle. –

5

Voici comment je le fais avec jQuery. J'ai un cours pour chaque lien que je veux ouvrir dans une nouvelle fenêtre.

$(function(){ 

    $(".external").click(function(e) { 
     e.preventDefault(); 
     window.open(this.href); 
    }); 
}); 
14

Cela pourrait aider

var link = document.createElementNS("http://www.w3.org/1999/xhtml", "a"); 
    link.href = 'http://www.google.com'; 
    link.target = '_blank'; 
    var event = new MouseEvent('click', { 
     'view': window, 
     'bubbles': false, 
     'cancelable': true 
    }); 
    link.dispatchEvent(event); 
+1

Cette réponse devrait être acceptée. – ebilgin

+0

IE11: "Erreur Javascript d'exécution: pas une action valide pour l'objet" –

+4

Cette réponse pourrait être améliorée en ajoutant une description de ce qui se passe –

1

Cela pourrait vous aider à ouvert toute la page Liens:

$(".myClass").each(
    function(i,e){ 
     window.open(e, '_blank'); 
    } 
); 

Il ouvrira ses portes tous les <a href="" class="myClass"></a> éléments de lien vers un autre onglet comme vous avait cliqué sur chacun d'eux.

Vous avez seulement besoin de le coller dans la console du navigateur. jQuery cadre requis

Questions connexes