Mam poniższy kawałek kodu. Debrugowałam i znajdowałem fragment, który powoduje długie opóźnienie w IE6.

Zasadniczo pętle kodu przez dokument konwertujący go do XML i wysyłanie do PDF. Na Ubuntu i Firefoksie 4 trwa 3 sekundy. Na IE regularnie potrwa do 40 sekund.

/**
* 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;

}

Wierzę, że funkcja Evalu powoduje opóźnienie w IE6. Czy istnieje schludny rozwiązanie, aby to naprawić. Dziękuję bardzo

0
topcat3 1 październik 2012, 18:11

6 odpowiedzi

Najlepsza odpowiedź

Prawdopodobnie jest to, że jest to concienation ciąg, który sprawia, że jest powolny. Za każdym razem, gdy dodasz coś do tekstu, skopiuje cały poprzedni tekst na nowy ciąg.

Nowsze przeglądarki mają zoptymalizowany kod dla tego specjalnego przypadku, więc dla nich wpływ jest mniejszy.

Zamiast wciągających ciągów takich jak to:

text = text + "something";

Zamiast tego użyj tablicy:

var text = [];

Następnie dodaj przedmioty do tablicy za pomocą metody push:

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

W końcu połącz ze sobą ciągi:

return text.join('');
0
Guffa 1 październik 2012, 14:25

Dlaczego używasz Eval w pierwszej kolejności?

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

Użyj notacji wspornika!

document.adv4["row"+i+"col"+j].style.color
3
epascarello 1 październik 2012, 14:16

W ogóle nie potrzebujesz eval():

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

Również w IE6 (ale nie w nowszych przeglądarkach), budując duże łańcuchy, wielokrotnie dodając więcej treści, jest naprawdę naprawdę powolny. W tym przeglądarce była szybsza w tej przeglądarce, aby zbudować ciągi, tworząc tablicę podciągów, a następnie dołączając do nich razem po zakończeniu wszystkich elementów.

3
Pointy 1 październik 2012, 14:16

Nie używaj Eval eval jest zła . Powiedziawszy, że naprawdę nie powinieneś dbać o IE6: Nawet MS nie obsługuje go już dłużej, dlaczego powinieneś przejmować?

W każdym razie, zmień wszystkie połączenia eval jak:

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

Do

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

Aby bezpośrednio uzyskać dostęp do elementów. Pamiętaj, że węzły są obiektami, więc ich właściwości mogą być dostępne albo za pomocą notacji dot (foo.bar) lub "Array asociative" "Notation: foo['bar'], tym ostatni jest bardzo Przydatne, gdy potrzebujesz wartości zmiennej, aby uzyskać dostęp do właściwości

2
Elias Van Ootegem 1 październik 2012, 14:17

Nie używaj oceny - okres. Eval () należy przemianować na zła (). Nie ma prawie żadnej sytuacji, w której naprawdę musisz używać funkcji Eval.

W takim przypadku możesz użyć document.getElementById(), aby znaleźć węzeł DOM z określonym identyfikatorem.

1
Philipp 1 październik 2012, 14:16

Jednym rozwiązaniem może być generowanie tablicy kolorów (lub może obiekt, jeśli go potrzebujesz), a następnie używa go.

Ale potem zadaj sobie pytanie "Czy naprawdę powinienem wspierać IE6?"

0
alexandernst 1 październik 2012, 14:15