评估javascript函数IE6需要很长时间

评估javascript函数IE6需要很长时间,javascript,time,eval,Javascript,Time,Eval,我有下面的代码块。我已经调试并找到了导致IE6长时间延迟的代码段 基本上,代码在文档中循环,将其转换为XML并发送到PDF。在Ubuntu和Firefox4上需要3秒钟。在IE上,它通常最多需要40秒 /** * This function builds up the XML to be saved to the DM. */ function getXMLToSave(){ var text="<workbook><sheet><name>Adv4New&

我有下面的代码块。我已经调试并找到了导致IE6长时间延迟的代码段

基本上,代码在文档中循环,将其转换为XML并发送到PDF。在Ubuntu和Firefox4上需要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;
/**
*此函数用于构建要保存到DM的XML。
*/
函数getXMLToSave(){
var text=“Adv4New”;
//展示道具(document.adv4.row10col1,“document.adv4.row10col1”);

对于(i=1;i一种解决方案可以是生成一个颜色数组(或者如果需要,可以是一个对象),然后使用它


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

为什么要在第一个位置使用eval

eval('document.adv4.row'+i+'col'+j+'.style.color')
使用括号表示法

document.adv4["row"+i+"col"+j].style.color
您根本不需要
eval()

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

此外,在IE6中(但在较新的浏览器中不是),通过反复添加更多内容来构建大字符串的速度非常非常慢。在该浏览器中,通过创建一个子字符串数组来构建字符串,然后在完成所有片段后将它们连接在一起,速度要快得多。

不要使用eval-period。eval()应该重命名为evil()。几乎没有真正需要使用eval函数的情况


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

不要使用evaleval是邪恶的。话虽如此,您真的不应该关心IE6:即使MS不再支持它,为什么还要麻烦呢

无论如何,将所有
eval
调用更改为:

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


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

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

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

而不是像这样连接字符串:

text = text + "something";
改用数组:

var text = [];
然后使用
push
方法将项目添加到数组中:

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

支持MS甚至不支持的浏览器?您的评估试图实现的到底是什么?看起来您可以通过以下操作轻松访问颜色属性:document.adv4['row'+i+'col'+j].style.color我需要删除所有text=text部分吗?我尝试只添加上面的数组和括号解决方案,但仍然存在相同的时间延迟。我假设我需要执行text.push整个过程替换text=text?谢谢。我假设这与下面的文本数组相结合有效:)当然,这只是更快(更安全)要获取属性值,您对这些字符串所做的操作是不相关的。不是针对您的脚本,而是根据我的建议。连接确实较慢,没有考虑到这一点:)…使用括号表示法并最终加入数组,您应该注意到一个差异
text.push("<workbook><sheet><name>Adv4New</name>");
return text.join('');