Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Переполнен стек. Как избежать? (https://javascript.ru/forum/misc/38458-perepolnen-stek-kak-izbezhat.html)

koeshiro 02.06.2013 21:18

Переполнен стек. Как избежать?
 
Здравствуйте. Сделал вот такой скрипт. Дабы определять какие теги\элементы на странице уже обработаны браузером.
loadDed=0; 
y=0; 
function load(x){ 
z=y+x;
   if(document.getElementsByTagName("body")[z]){//Проверяем "готов" ли нужный нам элемент. браузер именно тут пишет что стек переполнен.
    loadDed+10;//Прибавляем 10 дабы отследить сколько процентов уже обработано браузером. 
    alert(loadDed);
   } 
   if(loadDed!=100){ 
    setTimeout(load(x),100);//Делаем цикл дабы функция повторялась пока не погрузится страница.   
   } 
} 
load(1)
Но почему-то переполняется стек. Хотя по сути цикл не должен быть бесконечный. Объясните что я не так сделал .-.

BallsShaped 02.06.2013 21:37

Это бесконечная рекурсия. В 10-й строчке функция load вызывает себя снова и снова.

mta88 02.06.2013 21:43

document.getElementsByTagName("body") в любом случае дает коллекцию единичной длины
так что функция все-равно не будет работать

koeshiro 02.06.2013 21:56

mta88,
то есть разные элементы так не вызвать?

BallsShaped 02.06.2013 22:05

Вообще мозговзрыв!)
Цитата:

Сообщение от koeshiro
Прибавляем 10 дабы отследить сколько процентов уже обработано браузером.

Опустим тот момент, что значение loadDed всегда будет равно нулю. Мне вот интересно, в чем логика?! Прибавляя десять, ты хочешь узнать "сколько процентов уже обработано браузером" чего?:D

ruslan_mart 03.06.2013 06:23

Цитата:

Сообщение от koeshiro
то есть разные элементы так не вызвать?

document.getElementsByTagName('*')


И вообще, если Вы хотите сделать полосу загрузки страницы, то ловите лучше onload изображений.

Можно вот так попробовать, но я не проверял.
<div style="width:100px; background:#9F9; border:1px solid #222">
   <div style="width:1px; height:10px; background:red" id="loading"></div>
</div>

function loadComplete()
{
    loading += 100/imgs.length;
    document.getElementById('loading').style.width = loading+'px';
}

var imgs = document.getElementsByTagName('img'), loading = 0;
for(i=0; i<imgs.length; i++) imgs[i].onload = loadComplete;

koeshiro 03.06.2013 08:25

Ruslan_xDD,
честно хотел сделать что-то в этом духе, но ко всем элементам в body

ruslan_mart 03.06.2013 08:41

koeshiro, а что там загружается то? По моему все элементы кроме img загружаются сразу же, так что отлавливать их нечего, ибо загружаются они почти мгновенно.

koeshiro 03.06.2013 09:14

Ruslan_xDD,
все остальные просто за компанию. Для точности . . :)
Но это ещё нужно будет делать. И делать более обдуманно чем до этого.


Часовой пояс GMT +3, время: 09:27.