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 を使用しないでください EVALEVILです。そうは言っても、本当に 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

すべての文字列連結が遅くなる可能性があります。テキストに何かを追加するたびに、以前のすべてのテキストが新しい文字列にコピーされます。

新しいブラウザでは、この特殊なケースに合わせてコードが最適化されているため、影響は少なくなります。

次のように文字列を連結する代わりに:

text = text + "something";

代わりに配列を使用します。

var text = [];

push次に、次のメソッドを使用して項目を配列に追加します。

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

最後に、文字列を結合するだけです:

return text.join('');
于 2012-10-01T14:25:15.583 に答える
0

1 つの解決策は、カラー配列 (または必要に応じてオブジェクト) を生成してから使用することです。

しかし、「本当に IE6 をサポートする必要があるのか​​」と自問してみてください。

于 2012-10-01T14:15:39.403 に答える