“Argument non valide” dans IE 8 sur jQuery.prepend () sur des objects Flash

Page de démonstration .

Lorsqu’il est exécuté dans IE 8, ce code génère une exception avec “argument invalide”. comme description et message, et ce numéro: -2147024809

J’utilise la dernière version (1.7.1) de jQuery. Est-ce un bug connu? Comment résoudre?

 var objs=$('object').not('object param[name="wmode"][value="transparent"]'); var appended = $(''); objs.prepend(appended); 

Extrait de code HTML:

          

L’erreur se produit sur la ligne 5771 de jquery.js:

 this.insertBefore( elem, this.firstChild ); 

Mise à jour : Ce n’est pas “un problème jQuery” – cela arrive avec du javascript brut.

Ce code jette :

 function handle(object) { var html = object.innerHTML; // The following line throws an exception: // Also, 'html' is not empty or undefined at this point. object.innerHTML = '' + html; } 

Je ne suis pas sûr à 100% de cela, mais j’ai déjà rencontré quelque chose comme cela auparavant, qui était spécifique à la . IE ne voit pas cela comme une partie du dom HTML, aussi la manipulation avec jquery renvoie un object null. La solution dont je me souviens, c’est html5shiv, c’est-à-dire créer un élément object et append le paramètre en tant que chaîne au lieu d’un object jQuery et tout devrait bien se passer.

Alternativement, vous pouvez envelopper le flash dans un div, puis obtenir le code HTML interne de ce dernier, l’append à ce code HTML, puis le replacer dans le div de l’emballage.

Comme l’indique Fresheyeball, IE ne voit pas dans le DOM ou ne permet pas de modifications dès qu’il a été inséré dans le document (alors qu’avant l’insertion, il peut être très bien modifié).

Une solution simple et efficace pour résoudre ce problème consiste à modifier le outerHTML complet du nœud. Cela ne provoquera pas de modification de l’élément mais le supprimera, le recréera, le remplacera et par conséquent, ne lèvera pas l’exception susmentionnée.

Exemple pour jQuery:

 $("object:has(> param[name=wmode][value=window]), object:not(:has(> param[name=wmode]))").each(replace); function replace() { this.outerHTML = this.outerHTML.replace(/<(?:[^">]+|(["']).*?\1)*>/, '$&'); } 

Un rendu similaire pour pourrait être obtenu comme suit:

 $("embed[wmode=window], embed:not([wmode])").attr("wmode", "opaque").wrap("
").unwrap();

Le script ci-dessous n’est pas exactement le correctif de 2 ou 3 lignes que j’espérais, mais j’ai trouvé cet article très utile. Je l’ai légèrement modifié et j’ai supprimé le chèque pour jQuery, mais cela a fonctionné comme un charme!

http://www.developersnippets.com/2010/12/04/how-to-add-wmodetransparent-for-flash-object-using-jquery-and-native-javascript/