SCRIPT70: Autorisation refusée lors de l'ajout d'options pour sélectionner l'élément à partir d'un iframe récemment fermé

Nous avons des problèmes lors de l'ajout d'options à un élément sélectionné à partir d'un iframe. Le code fonctionne bien dans Chrome, Firefox et Opera, mais dans IE11, nous obtenons un "SCRIPT70: Permision refusée" lorsque vous tentez d'accéder à l'option créée récemment à partir de la fenêtre parentale.

Ce dont nous avons besoin, c'est d'ajouter des options à un élément sélectionné en les choisissant dans une liste. La liste est affichée dans une lightbox (avec un iframe) et lorsqu'un élément est choisi, il doit être ajouté à l'élément select puis la lightbox a été fermée (et l'iframe a été détruit). Ce que nous avons est quelque chose comme ça (simplifié):

Une fenêtre parentale:

<select id="dropdown"> <option>1</option> <option>2</option> <option>3</option> </select> <!-- in the real code, this iframe is shown when a button is pressed --> <iframe src="iframe.html"></iframe> <script> $(document).ready(function() { $('#dropdown').on('change', function() { console.log($(this).children().last().val()); }); }); </script> 

Et le iframe.html:

 <a href="#" data-val="4">Add 4</a> <a href="#" data-val="5">Add 5</a> <a href="#" data-val="6">Add 6</a> <script> $(document).ready(function() { $('a').on('click', function() { var p = window.parent; if(p) { var dropdown = p.document.getElementById('dropdown'); if(dropdown) { var opt = new Option($(this).data('val'), $(this).data('val')); dropdown.options[dropdown.options.length] = opt; //close self $('iframe', p.document).remove(); } } }); }); </script> 

Si vous choisissez un élément de l'iframe, l'option est ajoutée à l'élément select et l'iframe est détruit. Et maintenant, si vous accédez à l'option récemment ajoutée dans l'événement Onchange attaché à l'élément de sélection, vous obtenez un "SCRIPT70: Autorisation refusée". Et la chose la plus étrange est que cela n'arrive pas la première fois que l'événement est déclenché. Vous devez déclencher l'événement onchange au moins deux fois pour obtenir l'erreur .

Vous pouvez voir une violon de travail

Solution

Si nous modifions la façon dont l'option est ajoutée à l'élément select, elle fonctionne comme un charme .

 //dropdown.options[dropdown.options.length] = opt; dropdown.appendChild(opt); 

Autres scénarios qui n'élèvent pas l'erreur

  • Si l'iframe n'est pas détruit, mais caché
  • Si l'option est accessible dans un événement rattaché à un autre objet (c.-à-d. L'événement onclick d'une ancre)

La question

Je souhaite que quelqu'un (peut-être un employé de Microsoft travaillant sur l'équipe IE) puisse expliquer les détails de ce comportement étrange.

Essayez de mettre cela dans votre page html et de voir si cela fait toute la différence

 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>