IE 8中关于flash对象的jQuery.prepend()的“无效参数”

演示页面 。

在IE 8中运行时,此代码会产生“无效参数”的exception。 作为描述和消息,这个号码: -2147024809

我正在使用最新的(1.7.1)jQuery。 这是一个已知的错误? 怎么解决?

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

Html片段:

          

jquery.js第5771行发生错误:

 this.insertBefore( elem, this.firstChild ); 

更新 :这不是“jQuery问题” – 它发生在原始javascript上。

此代码抛出 :

 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; } 

我不是百分之百地确定这个问题,但之前遇到过这样的问题,而且它特定于标签。 IE不会将此视为html dom的一部分,因此使用jquery进行操作会返回null对象。 我记得工作的解决方案是html5shiv之类,创建一个对象元素并将param作为字符串而不是jQuery对象附加,并且一切都应该很好。

或者,您可以将flash包装在div中,然后获取该div的内部html,附加到该html,然后将其放回到包装器div中。

正如Fresheyeball所述,IE不会将视为DOM的一部分,或者不会在插入文档后立即进行修改(而在插入之前,它可以很好地修改)。

解决此问题的一个简单且非常省略的解决方案是修改节点的完整outerHTML 。 这不会导致元素的修改,但会删除它,重新创建它,替换它,因此不会抛出上述exception。

jQuery示例:

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

对于类似重新渲染可以实现如下:

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

下面的脚本不完全是我希望的2或3行修复,但我发现这篇文章非常有用。 我稍微修改了它并删除了jQuery的检查,但它就像一个魅力!

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