Javascript &引用;无效参数";在IE 8中,在flash对象上的jQuery.prepend()上

Javascript &引用;无效参数";在IE 8中,在flash对象上的jQuery.prepend()上,javascript,jquery,flash,Javascript,Jquery,Flash,当在IE 8中运行时,此代码产生一个异常,带有“Invalid argument.”作为描述和消息,以及此数字:-2147024809 我正在使用最新的(1.7.1)jQuery。这是已知的bug吗?如何解决 var objs=$('object').not('object param[name="wmode"][value="transparent"]'); var appended = $('<param name="wmode" value="transparent"><

当在IE 8中运行时,此代码产生一个异常,带有“Invalid argument.”作为描述和消息,以及此数字:
-2147024809

我正在使用最新的(1.7.1)jQuery。这是已知的bug吗?如何解决

var objs=$('object').not('object param[name="wmode"][value="transparent"]');
var appended = $('<param name="wmode" value="transparent"></param>');
objs.prepend(appended);
更新:这不是“jQuery问题”-它发生在原始javascript中

:

函数句柄(对象){
var html=object.innerHTML;
//以下行引发异常:
//此外,“html”此时不是空的或未定义的。
object.innerHTML=''+html;
}

我不能100%肯定这一点,但以前遇到过类似的情况,这是特定于
标记的。IE不将其视为HTMLDOM的一部分,因此使用jquery进行操作将返回空对象。我记得使用的解决方案是类似html5shiv的,创建一个对象元素并将参数作为字符串而不是jQuery对象附加,所有这些都应该很好


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

下面的脚本并不完全是我希望的2行或3行修复,但我发现本文非常有用。我稍微修改了它,并删除了jQuery的检查,但它工作起来很有魅力


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

一个简单而省钱的解决方案是修改节点的完整
outerHTML
。这不会导致修改元素,但会删除、重新创建、替换元素,因此不会引发上述异常

jQuery示例:

$("object:has(> param[name=wmode][value=window]), object:not(:has(> param[name=wmode]))").each(replace);
function replace() {
  this.outerHTML = this.outerHTML.replace(/<(?:[^">]+|(["']).*?\1)*>/, '$&<param name="wmode" value="opaque"/>');
}
$(“对象:has(>param[name=wmode][value=window]),对象:not(:has(>param[name=wmode])))。每个(替换);
函数替换(){

this.outerHTML=this.outerHTML.replace(/我将尝试第二种方法。我不确定这是否达到预期的结果(“wmode”参数不是我试图设置的参数),但至少这不会崩溃:仔细想想..我真的不能这么做。我不控制页面,所以我不能强制
对象
元素位于div中。我正在处理现有的html页面。这似乎不是jQuery问题。看看这个例子,使用原始javascript操作对象:我最终只捕获了IE8上的异常并忽略它。无法修复世界:(是的,这不是jquery问题,而是ie javascript问题。
this.insertBefore( elem, this.firstChild );
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 = '<param name="wmode" value="transparent"></param>' + html;  
}
$("object:has(> param[name=wmode][value=window]), object:not(:has(> param[name=wmode]))").each(replace);
function replace() {
  this.outerHTML = this.outerHTML.replace(/<(?:[^">]+|(["']).*?\1)*>/, '$&<param name="wmode" value="opaque"/>');
}
$("embed[wmode=window], embed:not([wmode])").attr("wmode", "opaque").wrap("<div/>").unwrap();