0

我有下面的代码块。我已经调试并找到了导致 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;

}

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

4

6 回答 6

3

你为什么首先使用 eval ?

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

使用括号符号!

document.adv4["row"+i+"col"+j].style.color
于 2012-10-01T14:16:22.243 回答
3

你根本不需要eval()

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

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

于 2012-10-01T14:16:48.717 回答
2

不要使用 eval EVAL is EVIL。话虽如此,你真的不应该关心IE6:连MS都不支持了,你何必呢?

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

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

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

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

于 2012-10-01T14:17:04.067 回答
1

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

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

于 2012-10-01T14:16:54.963 回答
0

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

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

于 2012-10-01T14:15:39.403 回答
0

很可能是所有的字符串连接都让它变慢了。每次向文本添加内容时,它都会将之前的所有文本复制到一个新字符串中。

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

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

text = text + "something";

改用数组:

var text = [];

然后使用以下方法将项目添加到数组中push

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

最后只需将字符串连接在一起:

return text.join('');
于 2012-10-01T14:25:15.583 回答