日期:2014-05-16  浏览次数:20328 次

火狐重新附值 innerHTML后,js 调用函数出错。
如下,通过动态(如ajax或其他方式)再次附值 innerHTML时,发现innerHTML 中TT3这个函数的调用在火狐中出现异常。

innerHTMLstr = <span id="LS4" onMouseOver="TT3(this, TS44)"> MouseOvertext </span><span id="TS44">TargetText</span>   //动态获取innerHTMLstr。注: 为了易于看清,这里双引号不转义。

xg.innerHTML = innerHTMLstr;   //这时TT3(this, TS44) 这个函数能正常调用,运行正常。

xg.innerHTML = null;

innerHTMLstr = <span id="LS4" onMouseOver="TT3(this, TS44)"> MouseOvertext </span><span id="TS44">TargetText</span>  //重新动态获取innerHTMLstr, 这个innerHTMLstr与之前的innerHTMLstr一模一样。(特别是再次包含有TT3(this, TS44)这个调用和TS44这个元素。)

xg.innserHTML = innerHTMLstr;  //再次附值后这时TT3(this, TS44) 这个函数在火狐中不能正常工作。在IE, Chrome 等其他浏览器工作正常。

经debug检查后觉得出错可能原因有: 1) 第二次附值 innerHTML后,火狐没有清掉之前的TS44这个元素,即出现TS44的id重复,导致出错。2) 原先的 TT3(this, TS44)被绑定到旧的TS44。可能需要重新绑定函数。

我试了一个有效的解决,在第二次将innerHTMLstr附值给xg前,把 innerHTMLstr 中的TS44 替换加上随机数。结果TT3就能工作正常。但这个解决方案是没办法的办法。 以下是我上网找到的几种解决方法好象都没用:  1) LS4.removeAttribute(onmouseover)  2) 移除 xg 下的 childnodes  3) $(“#LS4”).unbind()   --- 还请高人指点正确解决途径。多谢!

------解决方案--------------------
id=TS44
TT3(this, TS44)
你直接用id 来引用对象是吧
我想你改成

TT3(this, 'TS44')

然后修改下 tt3函数  把 ts44的获取方法改成 document.getElementByid 获取
我想这样浏览器没理由 出错了