2010-01-04 2 views
0

Я использую eval() в javascript для оценки значительного количества js-кода (не только json, но и вызовов функций). Браузер зависает во время вызова, то есть пользователь не может прокручивать браузер или ничего нажимать. Есть ли способ обойти эту проблему замораживания?Браузер зависает во время javascript eval()

+2

вы будете иметь, чтобы дать более подробно, чем это. какой браузер? как выглядит ваш код? –

ответ

4

В большинстве браузеров JavaScript работает в потоке пользовательского интерфейса, поэтому он блокирует пользовательский интерфейс, как вы описываете. Лучший способ разблокировать пользовательский интерфейс - разбить JS на более мелкие части и связать их вместе с setTimeout (который возвращает управление потоком в браузер для визуализации пользовательского интерфейса)

0

Вы должны разбить свой функции на более мелкие части. Я рекомендую комбинировать их с setTimeout.

В современных браузерах есть web workers, которые могут вычислять данные в фоновом режиме.

+0

Возвращает ли отображение пользовательского интерфейса после каждой строки кода в setTimeout? Почему замораживание не происходит, когда, скажем, браузер выполняет большое количество javascript при загрузке начальной страницы? –

+0

Это зависит от браузера. Я считаю, что пользовательский интерфейс зависает только в том случае, если он либо a) максимизирует процессор. B) javascript управляет HTML/CSS. Вы должны сделать свое собственное тестирование, у меня нет _any_ данных для поддержки моего требования. –

+1

UI * делает * блокировать, когда JavaScript выполняется при загрузке начальной страницы. Большинство JavaScript не занимают много времени, но, надеюсь, вы этого не заметите. – bobince

1

Вы также можете попробовать выполнять код, вводя новый сценарий тег в страницу:

function executeCode(code) { 
    var element = document.createElement('script'); 
    element.type = 'text/javascript'; 

    try { 
     element.appendChild(document.createTextNode(code)); 
     document.body.appendChild(element); 
    } 
    catch (e) { 
     element.text = code; 
     document.body.appendChild(element); 
    } 
} 

var code = 'alert("hello world");'; 
executeCode(code); 
Смежные вопросы