2012-10-01 19 views
0

我有下面的代码块。我已经通过调试,找到了导致IE6长时间延迟的片段。eval javascript函数IE6花费很长时间

基本上,代码循环遍历文档,将其转换为XML并发送至PDF。在Ubuntu和Firefox 4上需要3秒。在IE上它可能需要长达40秒的时间。

/** 
* This function builds up the XML to be saved to the DM. 
*/ 
function getXMLToSave(){ 

var text="<workbook><sheet><name>Adv4New</name>"; 

//show_props(document.adv4.row10col1, "document.adv4.row10col1"); 

for(i=1;i<157;i++){ 
    text = text + "<row number='" + i + "'>"; 
    for(j=1;j<=7;j++){ 
     text = text + "<col "; 
     //alert(eval('document.adv4.row'+i+'col'+j+'.readonly')); 
     try{ 
      text = text + "number='" + j + "' label='" + eval('document.adv4.row'+i+'col'+j+'.className')+ "'"; 
     } 
     catch (e) { 
      text = text + "number='" + j + "' label=''"; 
     } 
     try { 
      if(eval('document.adv4.row'+i+'col'+j).readOnly) 
      text = text + " type='readonly'"; 
      else 
      text = text + " type=''"; 
     } 
     catch (e) { 
      text = text + " type=''"; 
     } 
     try { 
      text = text + " color='" + eval('document.adv4.row'+i+'col'+j+'.style.color') + "'"; 
     } 
     catch (e) { 
      text = text + " color=''"; 
     } 
     text = text + ">"; 
     try { 
      // don't wrap in a CDATA (like previously), but run cleanNode 
      // this fixes html entities 
      var content = eval('document.adv4.row'+i+'col'+j+'.value'); 
      text = text + cleanNode(content); 
     } 
     catch (e) { 
      text = text + "0"; 
     } 
     text = text + "</col>"; 
    } 
    text = text + "</row>"; 
} 
text = text + "</sheet></workbook>"; 

return text; 

}

我相信它的eval函数导致IE6的延迟。有没有一个很好的解决方案来解决这个问题。非常感谢

+0

支持MS甚至不支持的浏览器? http://www.ie6countdown.com/ – epascarello

+0

你的eval试图完成的究竟是什么?它看起来像你可以通过这样做轻松访问颜色属性:document.adv4 ['row'+ i +'col'+ j] .style.color –

回答

0

它可能是所有的字符串concourseation,使其缓慢。每次向文本添加内容时,都会将所有以前的文本复制到新字符串中。

较新的浏览器针对这种特殊情况优化了代码,因此对他们来说影响较小。

而是连接字符串是这样的:

text = text + "something"; 

使用数组来代替:

text.push("<workbook><sheet><name>Adv4New</name>"); 

最后只是:

var text = []; 

然后使用push方法将项目添加到阵列连接在一起的字符串:

return text.join(''); 
+0

我需要取出所有文本=文本部分吗?我试着在阵列和上面的括号解决方案中加入,但仍然有相同的时间延迟。我假设我需要做text.push整个取代文本=文本? – topcat3

+0

你绝对天才:) – topcat3

0

一种解决方案可能是生成一个颜色数组(或者可能是一个对象,如果你需要的话)然后使用它。

但是,问自己问题“我应该真的支持IE6吗?”

3

为什么你在eirt的地方使用eval?

eval('document.adv4.row'+i+'col'+j+'.style.color') 

使用括号表示法!

document.adv4["row"+i+"col"+j].style.color 
3

你不需要eval()都:

text = text + "number='" + j + "' label='" + document.adv4['row' + i + 'col' + j].className + "'"; 

此外,在IE6(但不新的浏览器),通过反复增加更多的内容确实是建立大型字符串,真的慢。在该浏览器中,通过创建一个子字符串数组来创建字符串,然后在完成所有部分时将它们连接在一起,这样做更快。

+0

尝试这些解决方案。感谢您的快速响应。 – topcat3

1

请勿使用评估期。 eval()应该重命名为evil()。几乎没有你真的需要使用eval函数的情况。

在这种情况下,您可以使用document.getElementById()来查找具有特定ID的DOM节点。

2

不要使用evalEVALEVIL。话虽如此,你真的不应该关心IE6:即使MS不再支持它,你为什么要打扰?

总之,改变所有eval调用,如:

eval('document.adv4.row'+i+'col'+j+'.value'); 

document.adv4['row' + i + 'col' + j].value; 

要直接访问的元素。请记住节点是对象,因此可以使用点符号(foo.bar)或“关联数组”表示法:foo['bar']来访问它们的属性,当需要变量的值访问属性时,后者非常有用

+0

谢谢。我假设这与下面的文本阵列工作:) – topcat3

+0

当然,这只是更快(更安全)的方式来获取属性值,你对这些字符串做什么是无关紧要的。不是为你的脚本,但据我的建议。连接确实比较慢,没有想到:)...使用括号表示法并在最后加入数组,您应该注意到差异 –

+0

绝对快得多!谢谢 – topcat3