IE Javascript单击问题
首先,我正在开发一个编写为无法使用某些典型调试工具的应用程序(或者至少我不知道该如何使用:)。
在部署之前,JavaScript,html等都已"煮熟"并进行了编码(我认为;我对该过程的工作方式有点模糊),因此我无法将VS 2005添加到ie上,并且Firebug lite无法正常工作出色地。而且,界面以帧为单位(糟糕),因此其他一些工具也无法正常工作。
Firebug在没有这个问题的Firefox中也很好用(Safari也没有),所以我希望有人可能发现我的代码在IE中的播放方式"明显"存在问题。关于其古怪性,可以提供更多信息,但让我们从此开始。
基本上,我有一个函数,通过使普通表行不可见来将表"折叠"到其标题中。我在<tr>
标记中有" onclick ='toggleDisplay(" theTableElement"," theCollapseImageElement")'"
,表以" class ='closed'"开始。
单击可以折叠并展开FF&Safari中的表,但是IE表需要多次单击(看似介于1到5之间的任意数字)才能展开。有时,在最初"打开"表格后,只需单击一下即可扩展和折叠表格,直到最终恢复为需要多次单击的状态。我可以从Visual Studio中几乎看不到的地方知道每次实际上都可以实现该功能。在此先感谢任何建议!
这是JS代码:
bURL_RM_RID="some image prefix"; CLOSED_TBL="closed"; OPEN_TBL="open"; CLOSED_IMG= bURL_RM_RID+'166'; OPENED_IMG= bURL_RM_RID+'167'; //collapses/expands tbl (a table) and swaps out the image tblimg function toggleDisplay(tbl, tblimg) { var rowVisible; var tblclass = tbl.getAttribute("class"); var tblRows = tbl.rows; var img = tblimg; //Are we expanding or collapsing the table? if (tblclass == CLOSED_TBL) rowVisible = false; else rowVisible = true; for (i = 0; i < tblRows.length; i++) { if (tblRows[i].className != "headerRow") { tblRows[i].style.display = (rowVisible) ? "none" : ""; } } //set the collapse images to the correct state and swap the class name rowVisible = !rowVisible; if (rowVisible) { img.setAttribute("src", CLOSED_IMG); tbl.setAttribute("class",OPEN_TBL); } else { img.setAttribute("src", OPENED_IMG); tbl.setAttribute("class",CLOSED_TBL); } }
解决方案
我们是否尝试过更改此行
tblRows[i].style.display = (rowVisible) ? "none" : "";
像
tblRows[i].style.display = (rowVisible) ? "none" : "table-row";
或者
tblRows[i].style.display = (rowVisible) ? "none" : "auto";
我们可能希望将onclick调用放置在实际的<tr>标签上,而不是单个的<th>标签上。这样,HTML中的JS较少,这将使其更易于维护。
如果我们在IE中启用了脚本调试功能(工具-> Internet选项->高级),并放置了"调试器";代码中的IE语句,当IE到达调试器语句时,它将自动启动Visual Studio。
我在IE中遇到了这个问题。如果我没记错的话,我需要将"显示"样式的初始值直接放在最初生成的HTML上。例如:
<table> <tr style="display:none"> ... </tr> <tr style="display:"> ... </tr> </table>
然后,我可以使用JavaScript更改样式,即操作方式。
setAttribute在IE中不可靠。它将属性访问和对象属性访问视为同一事物,因此,由于" class"属性的DOM属性称为" className",因此我们必须在IE上使用它。
此错误已在新的IE8 beta中修复,但直接使用DOM Level 1 HTML属性更容易:
img.src= CLOSED_IMAGE; tbl.className= OPEN_TBL;
我们还可以在样式表中进行表格折叠,这将更快,并且省去了在脚本中循环遍历表格行的麻烦:
table.closed tr { display: none; }
我总是使用style.display =" block"和style.display =" none"