de la fenêtre.focus() ne fonctionne pas sous Google Chrome
Demandais juste si Google Chrome est à prendre en charge window.focus()
à un certain point. Quand je veux dire que le soutien, je veux dire qu'il fonctionne. L'appel à elle n'a pas d'échec, il n'a tout simplement pas faire n'importe quoi. Tous les autres navigateurs n'ont pas ce problème: FireFox, IE6-IE8 et Safari.
J'ai une classe côté client pour la gestion des fenêtres de navigateur. Quand j'ai d'abord créer une fenêtre la fenêtre est au point, mais les tentatives d'attirer l'attention sur la fenêtre ne fonctionne pas.
De ce que je peux dire, ce qui semble être une caractéristique de sécurité pour éviter les pop-ups et il ne semble pas être un WebKit problème tel qu'il fonctionne dans Safari.
Je connais une idée que quelqu'un a apporté de l'avant était de fermer la fenêtre, puis la rouvrir, mais c'est une horrible solution. Une recherche sur google montre que je ne semble pas être la seule personne frustré avec ce.
Et juste pour être sur à 100% clair, je veux dire de nouvelles fenêtres, pas de tabs (onglets ne peut pas être mis de ce que j'ai lu), et toutes les fenêtres étant ouvertes sont dans le même domaine.
Toutes les idées, les solutions à part la mauvaise, celui que je mentionne ci-dessus?
Il y a un bug connecté sur le Chrome de projet à ce sujet, check it out ici. Merci de poster que Riche.
MyCompany = { UI: {} }; //Put this here if you want to test the code. I create these namespaces elsewhere in code.
MyCompany.UI.Window = new function() {
//Private fields
var that = this;
var windowHandles = {};
//Public Members
this.windowExists = function(windowTarget) {
return windowTarget && windowHandles[windowTarget] && !windowHandles[windowTarget].closed;
}
this.open = function(url, windowTarget, windowProperties) {
//See if we have a window handle and if it's closed or not.
if (that.windowExists(windowTarget)) {
//We still have our window object so let's check if the URLs is the same as the one we're trying to load.
var currentLocation = windowHandles[windowTarget].location;
if (
(
/^http(?:s?):/.test(url) && currentLocation.href !== url
)
||
(
//This check is required because the URL might be the same, but absolute,
//e.g. /Default.aspx ... instead of http://localhost/Default.aspx ...
!/^http(?:s?):/.test(url) &&
(currentLocation.pathname + currentLocation.search + currentLocation.hash) !== url
)
) {
//Not the same URL, so load the new one.
windowHandles[windowTarget].location = url;
}
//Give focus to the window. This works in IE 6/7/8, FireFox, Safari but not Chrome.
//Well in Chrome it works the first time, but subsequent focus attempts fail,. I believe this is a security feature in Chrome to avoid annoying popups.
windowHandles[windowTarget].focus();
}
else
{
//Need to do this so that tabbed browsers (pretty much all browsers except IE6) actually open a new window
//as opposed to a tab. By specifying at least one window property, we're guaranteed to have a new window created instead
//of a tab.
windowProperties = windowProperties || 'menubar=yes,location=yes,width=700, height=400, scrollbars=yes, resizable= yes';
windowTarget = windowTarget || "_blank";
//Create a new window.
var windowHandle = windowProperties ? window.open(url, windowTarget, windowProperties) : window.open(url, windowTarget);
if (null === windowHandle) {
alert("You have a popup blocker enabled. Please allow popups for " + location.protocol + "//" + location.host);
}
else {
if ("_blank" !== windowTarget) {
//Store the window handle for reuse if a handle was specified.
windowHandles[windowTarget] = windowHandle;
windowHandles[windowTarget].focus();
}
}
}
}
}
- Je vais avoir ce problème pour IE 8 et 9.Des idées?
Vous devez vous connecter pour publier un commentaire.
Toujours le même dans la version 14.0.835.202 m sur Windows 7; trouvé une autre solution, pas plus élégant, mais au moins éviter de perdre des données sur la page: afficher un message d'alerte dans la fenêtre vous voulez vous concentrer.
J'ai été aux prises avec ce problème. Je voulais une référence à une autre fenêtre, j'ai donc été à la délivrance d'un:
Cependant, quand je émettez cette commande, le navigateur va passer à la OtherWindow. J'ai pensé que cela pourrait être abordé en faisant ceci:
mais la fenêtre.focus() n'a aucun effet. J'ai essayé:
Mais la fenêtre.focus() l'appel n'avait pas encore d'effet.
Je résoudre le problème en ajoutant le code suivant à la OtherWindow de la source.
Puis j'ai changé le code dans la fenêtre principale de:
Mise à JOUR: Cette solution semble ne plus fonctionner dans le navigateur Chrome.
Incroyablement, la solution est assez simple. J'ai été à essayer de comprendre ce problème pour au moins une semaine. Tout ce que vous devez faire est de flou de la fenêtre, puis lui donner le focus. J'avais essayé auparavant et ça ne fonctionne pas.
Alors j'ai fini par essayer ceci à la place:
et qui semble fonctionner.
J'ai mis à jour mon code ici:
setTimeout
)Une suggestion de quelqu'un du blog est d'utiliser cette:
Suivantes ce bug pourrait être utile.
vous pouvez
focus
une autre fenêtre en appelantopen
avecjavascript:;
commeurl
paramètre:Voici une solution de contournement, j'ai pu utiliser. Il peut ne pas fonctionner pour tout le monde, mais il le fait ce dont j'ai besoin, et elle ne poignée de scénarios où votre popup a été mis à jour via Ajax après le chargement initial (c'est à dire - il ne rentre pas dans le serveur de rechargement de la page).
Je suis en utilisant la nouvelle fenêtre truc pour la faire ressembler à je suis juste recentrage de la page, mais je suis en fait à la création d'une nouvelle fenêtre avec le contenu exact de l'ancienne fenêtre et la fermeture de l'ancienne fenêtre.
Vous aurez juste besoin de s'assurer que vous êtes en mesure de saisir tout ce dont vous avez besoin pour la nouvelle fenêtre. J'ai mis tout ce que j'ai besoin dans un
#everything
div; vous devrez peut-être modifier pour vos besoins.Espère au moins aide certains d'entre vous.
Note: inline Javascript semble exécuter avec cette approche, liée Javascript ne peut pas. Procéder avec prudence si ce sera un problème pour vous.
<script>
balises très bien, je n'ai pas de JS tirés à partir d'autres fichiers. La raison pour laquelle je utiliser mon#everything
div est que j'ai JS que j'ai ne pas souhaitez exécuter lorsque je vais rouvrir la page. Je me rends compte que ce n'est probablement pas très commun, mais c'est ce que je devais faire.window.focus()
pour enfant de windows fonctionne très bien pour moi sur Chrome v52 sur Windows, mais SEULEMENT à l'intérieur d'un événement initié par l'utilisateur, par exemple un clic de rappel. (C'est la même restriction que le pop-up bloquées s'applique àwindow.open()
appels.)La seule solution qui fonctionne dans Chrome est présent code à l'intérieur de la nouvelle fenêtre:
Malheureusement, la solution ne fonctionne que sous deux conditions:
window.opener
a à avoir son nom sur le document de charge (window.name="WhateverName";
)window.open()
est appelée lors du clic de l'utilisateurJe viens de découvrir un très solution la plus simple.
Si vous ouvrez une fenêtre qui est dans une position de fond, le ciblage de la même fenêtre ("_self"), Chrome automatiquement la mise au point de cette fenêtre.
Pour reprendre le focus à une fenêtre, vous devez utiliser le code suivant:
Cela fonctionne très bien pour moi.
Enlevé le lancement de la fenêtre vide de bloc catch, au lieu de lancer directement l'url, ce qui évite à l'utilisateur de confusion quand il dit de la fenêtre vide.
J'ai combattu cette dans google Chrome. Je voulais une fenêtre pop-up pour afficher lorsque l'utilisateur clique sur un lien sur le parent de l'écran. Les travaux la première fois, la fenêtre pop-up s'affiche, mais une fois le popup perd le focus, le javascript ne peut pas le ramener à l'avant de nouveau; vous devez cliquer sur la fenêtre. Voici ce qui a fonctionné pour moi. Ce script est la fenêtre parent (celui avec les liens). Comme vous pouvez le voir, je l'ai mis à la fin de la section de la TÊTE::
Tous les liens sont
<A href="Javascript: openLink('url')">
. Si l'utilisateur ne ferme pas la fenêtre pop-up manuellement, il est fermé lorsque la fenêtre parent reprend focus. Si le pop-up est détruit et recréé à chaque fois. Semble un peu compliquée, mais cela fonctionne pour moi.Peut-être pas ce que tout le monde veut, mais (dans google chrome), j'ai remarqué qu'une alerte soulevées dans le menu uped page maintient son emprise sur le focus de la fenêtre contextuelle. Donc je le fais maintenant...
Sur le menu uped page, ont une fonction chargé dans l'en-tête:
Puis, dans le menu uped page:
Donc, c'est une variante de la fermeture de la popup lorsque le focus est perdu. Mais dans mon cas, le pop-up est une fenêtre de modification de données. Une fenêtre, on ne veut pas fermer non sollicitées. Alors maintenant, l'utilisateur est notifié, l'accent est sur le point de tomber, et obtient un autre choix s'il veut fermer la fenêtre ou pas. Encore une fois, loin d'être parfait, mais il a travaillé pour moi.
(doux)
Aucune des solutions ici a fonctionné pour moi. Donc, je suis venu avec cette:
Cela crée un formulaire vierge qui est envoyé par la poste à l'URL cible. En appliquant
target="_blank"
nous imiter l'appel de la fenêtre.open() avec le côté pour effet de maintenir l'accent sur la nouvelle fenêtre.Edit: Vanilla JS version qui supprime également la forme de l'élément par la suite:
- Je simplement utiliser cette ligne de code ici pour recentrer, c'est la meilleure chose qui a fonctionné pour moi jusqu'à présent:
merci pour cette réponse [ici](https://stackoverflow.com/a/30758862/10706668"Réponse en dileepar")
J'ai aussi fait une [jsfiddle](https://jsfiddle.net/Foxygaming9978/6gc38f5x/"jsfiddle popup recentrer test") pour les tests.
J'espère que cette aide