Maison >interface Web >js tutoriel >Solution au problème selon lequel l'utilisation de window.open pour ouvrir une nouvelle fenêtre dans la réponse à la requête Ajax est interceptée
1. Description du problème
Une fois la requête asynchrone asynchrone réussie, une nouvelle fenêtre doit être ouverte pour ouvrir l'URL. La méthode window.open() est utilisée, mais elle le sera. intercepté par le navigateur et l'utilisateur doit cliquer sur Bas.
2. Analyse du problème
La raison pour laquelle le navigateur intercepte les fenêtres nouvellement ouvertes est que l'opération n'est pas activement déclenchée par l'utilisateur, il la considère donc comme dangereuse. , même si le comportement de l'utilisateur tel qu'un clic ou une soumission est simulé dans la fonction de rappel ajax (trigger('click')), le navigateur pensera qu'il n'est pas activement déclenché par l'utilisateur, il ne peut donc pas être exécuté en toute sécurité, donc il est intercepté.
Instructions :
1. Si c'est 0cccd343ebcf339b582ab20b8ce6e78f4a11e5928b3688cf38c9163b657eb5ac L'appel de window.open() dans la méthode fun spécifiée ici ne sera pas intercepté, car le navigateur pensera qu'il est actif. Mais l'ouverture de la fenêtre dans la réponse à la requête ajax sera interceptée.
2. Si vous n'ouvrez pas une nouvelle fenêtre, mais modifiez l'adresse Web d'origine, vous pouvez utiliser window.location = newurl pour y parvenir, afin qu'elle ne soit pas interceptée.
3. Solution
Avant la requête ajax, utilisez window.open pour ouvrir une fenêtre vide, puis définissez l'attribut d'emplacement de la fenêtre dans la fonction de réponse ajax. pour la nouvelle URL.
Exemple de code :
function fun(){ var tmpWin =window.open() ajax(xxx, handle(){ //回调函数。这是伪代码,语法不准。 var newurl = xxxx tmpWin.location = newurl; }) }
Il y a un problème avec la méthode ci-dessus, car une fenêtre vide est ouverte en premier. Si après l'échec de la requête ajax (problème de réseau ou de logique métier), aucun résultat normal ne sera affiché dans la nouvelle fenêtre, ce qui peut prêter à confusion pour l'utilisateur.
Une solution est qu'en cas de problème avec ajax, vous pouvez envisager de donner une invite, telle que tmpWin.document.write("Serverprocessing exception");
Même pour empêcher ajax temps de réponse Trop long. Lorsque la fenêtre est créée, l'invite tmpWin.document.write("Le serveur est en cours de traitement, veuillez patienter") est immédiatement donnée
Si ajax revient normalement plus tard, c'est le cas ; étant donné que l'emplacement est une valeur définie, les informations imprimées d'origine seront écrasées par les informations de la nouvelle page.
Voici une autre méthode, mais elle présente également des défauts :
Comme ajax peut être défini comme une requête synchrone, vous pouvez utiliser window.open pour ouvrir une nouvelle fenêtre après la requête ajax. Par exemple :
function fun(){ var result; ajax({ //需要设置同步请求 ..... result = xxx ....... }) if(result){ window.open(xxxx) } }
L'approche ci-dessus évite les problèmes mentionnés ci-dessus car elle ouvre une nouvelle fenêtre après avoir jugé le résultat de la requête ajax.
Cependant, comme il s'agit d'une requête synchrone, nous avons trouvé un problème lors de notre test. Si le temps de réponse du serveur est trop long, d'une part, l'interface se mettra en pause (l'expérience utilisateur n'est pas bonne), et d'autre part, la nouvelle fenêtre s'ouvrira. sera bloqué.
Pas de problème uniquement si le serveur revient rapidement. Lors de notre test, nous avons dormi 1 seconde pendant le traitement du code serveur et avons constaté que la nouvelle fenêtre était bloquée.
4. Résumé
En résumé, on peut voir qu'il n'y a pas de moyen particulièrement parfait d'ouvrir une nouvelle fenêtre après le retour d'ajax. Plus précisément, vous devez prendre les mesures appropriées en fonction des caractéristiques commerciales de votre propre système.
Ce qui précède est la solution que l'éditeur vous présente lorsque vous utilisez window.open pour ouvrir une nouvelle fenêtre dans la réponse à la requête Ajax et être intercepté. J'espère que cela vous sera utile si vous. Si vous avez des questions, veuillez nous contacter. Je laisserai un message et l'éditeur vous répondra à temps. Je voudrais également vous remercier tous pour votre soutien au site Web PHP chinois !
Pour plus d'articles connexes sur la façon de résoudre le problème de l'utilisation de window.open pour ouvrir une nouvelle fenêtre dans la réponse à la demande Ajax, veuillez faire attention au site Web PHP chinois !