Il y a une page Web avec un iframe à l'intérieur. Parfois, les contrôles de la zone de texte d'entrée, à l'intérieur de l'iframe, sont verrouillés/gelés. Les utilisateurs ne peuvent pas y saisir de texte. Mais la zone de texte peut être ciblée et non décolorée. Il n'y a pas de code pour désactiver les contrôles d'entrée et cela ne se produit pas toujours. Jusqu'à présent, cela se produit uniquement dans IE 9 et IE 10. Firefox et Chrome est OK.
Une brève description du fonctionnement de la page est:
Il y a un bouton sur la page parent. En cliquant dessus, vous construirez un iframe à partir de zéro et l'afficherez. Cela se fait par Javascript.
Encore une fois, il y a un bouton sur l'iframe pour le fermer. En cliquant dessus
supprimera l'iframe du DOM de la page parent.
Veuillez me faire savoir si vous souhaitez plus d'informations si nécessaire. Merci d'avance.
Ce bug est très ennuyeux, pire encore, il y avait très peu d'informations que nous pouvions trouver sur Google.
Il n'y a qu'un seul lien de Microsoft qui concerne IE9, mais le problème existe toujours dans IE10/IE11 et beaucoup plus facile à reproduire.
Je viens de créer un violon pour décrire ce problème
http://jsfiddle.net/WilliamLeung/T3JP9/1/
Pourquoi est-il si difficile pour M $ de résoudre ce problème pendant des années?
il devrait y avoir trois solutions de contournement
ou planifier une tâche "ne rien faire" qui peut prendre du temps, ce qui peut faire IE réponse à un événement de souris comme par magie, je ne pourrais pas vous dire pourquoi, peut-être M $ pourrait
Les exemples de codes qui configurent une tâche longue
setInterval(function () {
var loopCount = 10000;
var x = 0;
for (var i = 0; i < loopCount; i++) {
x = (x + Math.random() * 1000) >>> 0;
}
return x;
}, 1000);
ou réinitialiser le contenu DOM avant de le supprimer du document
someDivWithIframe.innerHTML = "";
$(someDivWithIframe).remove();
Je ne sais pas si cela aide dans tous les cas, vous devriez avoir essayé
La solution avec jQuery travaillé sur IE11 pour moi, pas les autres solutions.
$(theIframeElement).empty().remove();
Une autre solution fonctionnant sur IE9/10 consistait à définir le iframe src sur vide avant de le supprimer
iframe.src=""
Mais cela provoque une exception "Accès refusé" sur IE11 si vous utilisez une ancienne version de jQuery <1.11.1
Quelques liens: Pour plus d'informations, jQuery a également résolu ce problème pour son plugin Dialog.js qui affichait du contenu dans un iframe: http://bugs.jqueryui.com/ticket/9122
correction d'un bug jQuery sur IE11 "Accès refusé": http://bugs.jquery.com/ticket/14535
J'ai réussi à corriger ce bogue en redéfinissant le focus sur la page principale. Ce que j'ai fait jusqu'à présent, c'est: mettre une zone de texte d'entrée HTML, qui est définie invisible, dans la page principale. Lorsque l'iframe se ferme, je remets le focus sur cette zone de texte.
Veuillez consulter les liens suivants pour plus d'informations sur ce bogue IE.
Aucune des solutions n'a fonctionné pour moi dans IE 11.
Résolu en ajoutant ce code dans iframe:
$("input").first().focus().blur();
Évidemment, cela ne fonctionnera pas si vous ne contrôlez pas votre iframe.
Cela a fonctionné pour moi sur IE11,
document.body.focus();
Juste pour ajouter à ce que les autres ont dit, c'est en fait un problème lorsqu'une entrée dans un iframe a le focus qui est ensuite fermé, ce qui fait que toutes les autres entrées perdent le focus. Et en effet, avoir un script pour définir le focus sur un élément résout le problème. Mais pour moi, cela ne fonctionnait pas car certaines de mes entrées étaient désactivées. Donc, la solution qui a fonctionné pour moi est ci-dessous
$("input[type=text]:not([disabled])").first().focus();
Extrait complet lorsque j'utilisais bootstrap modal et le modal avait un iframe. J'ai défini le focus sur un champ modifiable avant d'ouvrir un modèle et après la fermeture:
var modalInstance = $uibModal.open({
// modal properties
});
modalInstance.closed.then(function () {
$("input[type=text]:not([disabled])").first().focus();
});
modalInstance.opened.then(function () {
$("input[type=text]:not([disabled])").first().focus();
});
J'ai initialement écrit le plugin ci-dessous pour corriger les fuites de mémoire dans IE 8, mais par conséquent, il résout également ce problème.
Solution simple avec Javascript qui fonctionne pour moi et je n'ai vu aucun effet secondaire dans d'autres navigateurs:
<script>
var pswElement = document.getElementById("password");
pswElement.addEventListener("focus", myFocusFunction, true);
function myFocusFunction() {
document.getElementById("password").select();
}
</script>
Quoi qu'il en soit, c'est assez triste, MS n'est pas en mesure de résoudre ce problème dans la version supérieure.
J'ai eu le même problème avec IE11, angularjs et en utilisant un IFrame. Mon modèle utilise ng-switch
pour changer de mode d'affichage. L'un des modes d'affichage contient un IFrame. Au moment où je quitte le mode d'affichage contenant l'IFrame:
var iFrame = <HTMLIFrameElement>document.getElementById("myIFrame");
iFrame.focus();
this.mode = ViewModes.ModeWithoutIFrame;
Résolu le problème pour moi.
Je souffrais également de ce problème. Comme William Leung l'a souligné, IE a un bug avec remove Iframe
Object du DOM.
Essayez ce qui suit:
$(someDivWithIframe).empty().remove();
Voici la solution qui a fonctionné pour moi, après avoir essayé toutes les autres sur cette page! Nécessite jQuery mais je suis sûr qu'il pourrait être réécrit en JavaScript natif si cela est nécessaire.
Comme avec la plupart des autres solutions, cela devrait être ajouté au source de l'iframe, en supposant que vous avez accès pour le modifier:
$("body").focusout( function () { window.focus(); });