很灵异的异常

fuyun 2009-04-23
代码如下:
var leftTop = getElement('left_top');
var prefix = "<td style='padding-left:10px;' onclick='listRadiosOfProvince(\"";
leftTop.rows[1].innerHTML = prefix + province[0] + "\")'>" + province[0] + "</td>";

在FF下正常,在IE7和IE8下报异常(第3行,运行时错误);改动如下:
leftTop.rows[1].cells[0].innerHTML = province[0];
leftTop.rows[1].cells[0].setAttribute('onclick',"listRadiosOfProvince(\""+province[0]+"\")");

在FF和IE8下正常,在IE7下报异常(第2行,运行时错误);再次改动如下:
leftTop.rows[1].cells[0].innerHTML = province[0];
leftTop.rows[1].cells[0].onclick = listRadiosOfProvince(province[0]);

IE8下页面加载后,执行了listRadiosOfProvince()函数,之后报异常(第2行);最后改动如下:
leftTop.rows[1].cells[0].innerHTML = province[0];
leftTop.rows[1].cells[0].onclick = function(){listRadiosOfProvince(province[0]);}

如此,在FF和IE8,IE7下才均能正常运行通过.
敢问哪位高人能否解释其中原因.
fuyun 2009-04-23
浏览器不兼容?
按理说,都应该是标准写法呀...怎么还会报这种异常...郁闷...
欣水寓言 2009-04-23
最后一种才是标准的写法
我一直都是用最后那种方法写的
第一种方法是最行不通的
貌似微软曾经强调过,事件必须使用onclick=function这样的方法来添加的
用添加属性的方法添加事件是肯定不行的
第二种写法如果是无参的方法可以考虑使用,否则还是添加到新方法中比较好
keshin 2009-04-23
第一段的错误,在于在ie中,innerHTML对于以下元素是只读的: COL, COLGROUP, FRAMESET, HTML, STYLE, TABLE, TBODY, TFOOT, THEAD, TITLE, TR
第二段我也不清楚
第三段你将函数的执行结果赋值给onclick,就算不报错逻辑上也是错误的,至于报错,怀疑是该函数的返回值是void(不确定)
fuyun 2009-04-23
欣水寓言 写道
最后一种才是标准的写法
我一直都是用最后那种方法写的
第一种方法是最行不通的
貌似微软曾经强调过,事件必须使用onclick=function这样的方法来添加的
用添加属性的方法添加事件是肯定不行的
第二种写法如果是无参的方法可以考虑使用,否则还是添加到新方法中比较好

第二种写法是在看了w3c文档之后写的,而且在FF和IE8下均没问题,既然在w3c文档中能够明确列出,应该是符合该标准的,setAttribute方法是文档中明确支持的.
fuyun 2009-04-23
keshin 写道
第一段的错误,在于在ie中,innerHTML对于以下元素是只读的: COL, COLGROUP, FRAMESET, HTML, STYLE, TABLE, TBODY, TFOOT, THEAD, TITLE, TR
第二段我也不清楚
第三段你将函数的执行结果赋值给onclick,就算不报错逻辑上也是错误的,至于报错,怀疑是该函数的返回值是void(不确定)

学习了..
补充下:第三段,函数的返回值不是void,估计是语法错误,onclick的值应该是函数,而原先的这种写法,正如你所说的,实际上是将执行结果赋值给了onclick事件.
第二段,应该是之前版本的浏览器的不兼容,或者说对w3c标准的支持不完善引起的吧.我的理解.呵呵~!
keshin 2009-04-24
关于第二段,随便搜了一下,确认在ie8 beta2以前, 无法在ie中通过setAttribute的方式设置listener,而且关于setAttribute的bug还真不少……
参考下面这个链接,里面有详细的说明:
http://webbugtrack.blogspot.com/2007/08/bug-242-setattribute-doesnt-always-work.html
欣水寓言 2009-04-24
fuyun 写道
欣水寓言 写道
最后一种才是标准的写法
我一直都是用最后那种方法写的
第一种方法是最行不通的
貌似微软曾经强调过,事件必须使用onclick=function这样的方法来添加的
用添加属性的方法添加事件是肯定不行的
第二种写法如果是无参的方法可以考虑使用,否则还是添加到新方法中比较好

第二种写法是在看了w3c文档之后写的,而且在FF和IE8下均没问题,既然在w3c文档中能够明确列出,应该是符合该标准的,setAttribute方法是文档中明确支持的.


呵呵
关键就是微软的IE对w3c的支持一直都是不如FF的
也是一直在慢慢改进
所以IE7对w3c的标准支持不好是非常正常的,要是什么都能做到像FF那样,那就不是微软拉,哈哈
fuyun 2009-04-25
欣水寓言 写道
fuyun 写道
欣水寓言 写道
最后一种才是标准的写法
我一直都是用最后那种方法写的
第一种方法是最行不通的
貌似微软曾经强调过,事件必须使用onclick=function这样的方法来添加的
用添加属性的方法添加事件是肯定不行的
第二种写法如果是无参的方法可以考虑使用,否则还是添加到新方法中比较好

第二种写法是在看了w3c文档之后写的,而且在FF和IE8下均没问题,既然在w3c文档中能够明确列出,应该是符合该标准的,setAttribute方法是文档中明确支持的.


呵呵
关键就是微软的IE对w3c的支持一直都是不如FF的
也是一直在慢慢改进
所以IE7对w3c的标准支持不好是非常正常的,要是什么都能做到像FF那样,那就不是微软拉,哈哈

呵呵...
微软就是微软...什么都要特立独行...
不过IE8下要好些了...但更郁闷的就是...IE8和之前的版本在显示效果上出入太大了...以至于不得不常常要在兼容模式和正常模式之间进行切换...
期待最新的HTML5标准能够尽早在诸多浏览器中实现...
最后再感叹一句...要做到兼容各浏览器的web开发,可真不容易啊...
lookdd1 2009-04-29
为啥不用些js框架啊。比如jquery。把兼容浏览器的工作交给它们吧
Global site tag (gtag.js) - Google Analytics