Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Ошибка 'stack out of space' при обработке onpropertychange в ie<9 (https://javascript.ru/forum/events/36606-oshibka-%27stack-out-space%27-pri-obrabotke-onpropertychange-v-ie-9-a.html)

svicserg 21.03.2013 13:56

Ошибка 'stack out of space' при обработке onpropertychange в ie<9
 
Имеется функция-обработчик события onpropertychange. В теле функции-обработчика содержатся многовложенные вызовы других функций.
При возникновении события возникает ошибка 'stack out of space'.

При этом:
  • для других событий, например keyup, эта же функция-обработчик работает правильно
  • если функцию-обработчик упростить (просто выводить какой-то alert) для onpropertychange она будет работать

Единственное объяснение которое я нашел - когда функция-обработчик имеет большую вложенность, это приводит к эффекту подобному бесконечному рекурсивному вызову (с сайта msdn).

При этом написание обработчика с меньшей вложенностью (все проверки в одной функции) в моем случае приведет к плохо структурированному коду.

Сталкивался ли кто-то с такой проблемой?

cyber 21.03.2013 15:29

svicserg,
а можно код в студию?

dmitriymar 21.03.2013 16:18

Цитата:

Сообщение от svicserg
При этом написание обработчика с меньшей вложенностью (все проверки в одной функции) в моем случае приведет к плохо структурированному коду.

Сложный выбор , между неработающим но структурированным кодом и работающим кодом. Даже не знаю что бы выбрал:)

svicserg 21.03.2013 16:37

Вложений: 1
Цитата:

Сообщение от dmitriymar (Сообщение 241896)
Сложный выбор , между неработающим но структурированным кодом и работающим кодом. Даже не знаю что бы выбрал:)

Вот я и пытаюсь понять что же служит реальной причиной проблемы. А потом уже приму решение как поступить. Это же нормально?

Прилагаю код.

dmitriymar 21.03.2013 16:43

Цитата:

Сообщение от svicserg
Вот я и пытаюсь понять что же служит реальной причиной проблемы.

Цитата:

Сообщение от svicserg
Единственное объяснение которое я нашел - когда функция-обработчик имеет большую вложенность, это приводит к эффекту подобному бесконечному рекурсивному вызову (с сайта msdn).

Именно это и есть. Стек вызовов функций ограничен по размеру .

cyber 21.03.2013 16:58

хм, странно не могу воспроизвести ошибку

dmitriymar 21.03.2013 17:06

Стесняюсь спросить . Весь смысл кода перевести 3 десятичных числа в 3 шестнадцатиричных и сложить их?

Серьёзный код. По настоящему требует запуска множества функций .... :)
Строк 20- 30 до кучи при правильной вёрстке.
Решение проблемы с переполнением стека -научиться составлять алгоритмы

svicserg 21.03.2013 17:12

Даже очень странно. Я тестировал в IE9 в режиме браузера IE8. Сейчас попробовал запустить на другом компьютере, где стоит именно IE8 и действительно все работает...

svicserg 21.03.2013 17:17

Цитата:

Сообщение от dmitriymar (Сообщение 241902)
Стесняюсь спросить . Весь смысл кода перевести 3 десятичных числа в 3 шестнадцатиричных и сложить их?

Серьёзный код. По настоящему требует запуска множества функций .... :)
Строк 20- 30 до кучи при правильной вёрстке.
Решение проблемы с переполнением стека -научиться составлять алгоритмы

согласен, кода много, а эффект не большой ))) просто это как часть нечто большего задуманного мной и функции объектов для проверки различного содержимого я буду использовать повторно в других участках программы. А вообще - это моя первая программка и учиться естественно мне есть чему )))

всем спасибо за ответы!

devote 21.03.2013 18:10

elem.onpropertychange = function() {
    if (!elem._lock) {
        setTimeout(function() {
            // блокируем выполнение повторного события
            elem._lock = true;

            // тут много-много-много-много кода
            // ....

            // снимаем блокировку
            elem._lock = false;
        }, 0);
    }

    // обработчик будет спокойно отпущен
    // сразу же после выполнения setTimeout();
    // не ожидая выполнения вложенных скриптов
    //
    // повторный вызов события не запустит огромный код,
    // если он был ранее запущен и еще не выполнился.
}


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