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的检查,但它就像一个魅力!