Отладка JS в Opera
Moderator: Shaos
-
- God
- Posts: 1388
- Joined: 02 Jan 2006 02:28
- Location: Abakan
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Просто очень неожиданный эффект... так подспудно думаешь - "ну это Венда-7...jdigreze wrote:Это вполне может делать встроенный в венду firewall, или ещё какой-нибудь антивирус.
наверно во всю поддерживает HTML-5... ща всё просто реактивно взлетит на этих
гигагерцах и ядрах..."
И неожиданно видишь "розовую птицу обломинго" там где её не ждал...

iLavr
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Я что-то тут одной JS конструкцией озадачился...
dtimeMS выставляется равным 1 ms.
Значит получается так, если 128 вызовов execute() выполнятся быстрее, чем 1 ms, то возникнет пауза в эмуляции кода 6502.
Но вот если 128 вызовов execute() НЕ успеют выполнится за 1 ms, то таймер всё равно вызовет заново функцию multiexecute(), но вот в какой момент он прервет текущий в этот момент цикл?
Я к тому этим озадачился, не прервет ли таймер эмуляцию прямо в ходе исполнения очередного кода 6502?
Или функция execute() все-таки закончится нормально в этот момент?

Code: Select all
myInterval = setInterval( "multiexecute()", dtimeMS ); //-- Интервал в миллисекундах;
/*
* multiexecute() - call from function runBinary();
*
*/
function multiexecute() {
if( !debug || autoDebugg ) { //- если НЕдебаггер или если авто-дебаггер
for( var w=0; w<64; w++ ) {
execute(); //-- выполняем код 6502
execute(); //-- выполняем код 6502
}
}
}
Значит получается так, если 128 вызовов execute() выполнятся быстрее, чем 1 ms, то возникнет пауза в эмуляции кода 6502.
Но вот если 128 вызовов execute() НЕ успеют выполнится за 1 ms, то таймер всё равно вызовет заново функцию multiexecute(), но вот в какой момент он прервет текущий в этот момент цикл?
Я к тому этим озадачился, не прервет ли таймер эмуляцию прямо в ходе исполнения очередного кода 6502?
Или функция execute() все-таки закончится нормально в этот момент?
iLavr
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Оказывается, что никак JS не прервет никакую выполняющуюся функцию.Lavr wrote:...если 128 вызовов execute() НЕ успеют выполнится за 1 ms, то таймер всё равно вызовет заново функцию multiexecute(), но вот в какой момент он прервет текущий в этот момент цикл?
Но более неприятным оказался другой факт...setTimeout и setInterval wrote:Принцип работы таймеров в JavaScript
Многие начинающие в JavaScript разработчики путают принцип работы его таймеров с принципом работы имеющейся во многих языках функции sleep. sleep приостанавливает выполнение программы на определённый промежуток времени, после чего работа продолжается с того же места, где была остановлена. В JavaScript такое невозможно, по крайней мере в браузерном JavaScript.
JavaScript язык однопоточный. Когда он выполняется в браузере, браузер никаких действий не производит. Если скрипт выполняется достаточно долго, становится заметно, что браузер "висит". Поэтому функция sleep вместе с приостановкой скрипта "вешала" бы браузер.
Вместо этого функции setTimeout/setInterval "делают отметку", что необходимо запустить некий код через столько-то миллисекунд, а скрипт продолжает работать своим чередом.Из того, что язык однопоточный следует ещё одно следствие — код выполнится не через строго заданный промежуток времени, а не раньше, чем через этот промежуток. Если в нужный момент времени будет выполняться какой-либо код, то интерпретатор дождётся его окончания, после чего только запустит код по таймеру.Code: Select all
var n = 0; setTimeout(function() { alert(n); // На момент вывода сообщения n уже будет равна 5. }, 1); // Ставим минимально возможный интервал n = 5; // После установки таймера меняем значение переменной.

Обескураживает такой подход... и нафига тогда указывать задержку в единицах мс, если выполняться это все-равно не будет...Минимально возможная задержка в разных браузерах варьируется. В среднем на момент написания этого текста (январь 2011) она составляет 12 мс. То есть, разницы между setTimeout(.., 1) и setTimeout(.., 12), как правило, нет.

iLavr
-
- God
- Posts: 1388
- Joined: 02 Jan 2006 02:28
- Location: Abakan
Честно сказать, у меня было такое предположение, но так как не подкреплено фактами, я тактично промолчал., итак сильно много имхи выкладываю последнее время.Lavr wrote: Оказывается, что никак JS не прервет никакую выполняющуюся функцию.
А вот хрен их знает, этих разработчиков. Может это каким-то образом связано с кроссплатформенностью HTML?Lavr wrote: Но более неприятным оказался другой факт...
Обескураживает такой подход... и нафига тогда указывать задержку в единицах мс, если выполняться это все-равно не будет...Минимально возможная задержка в разных браузерах варьируется. В среднем на момент написания этого текста (январь 2011) она составляет 12 мс. То есть, разницы между setTimeout(.., 1) и setTimeout(.., 12), как правило, нет.

-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
А ты выкладывай не стесняйся! Я же на повод посоветоваться спрашиваю...jdigreze wrote:Честно сказать, у меня было такое предположение, но так как не подкреплено фактами,Lavr wrote:Оказывается, что никак JS не прервет никакую выполняющуюся функцию.
я тактично промолчал., итак сильно много имхи выкладываю последнее время.
Так что мнение человека с опытом хоть какое-то направление поиска задает.
А то я погуглил на тему "как выполняется код JavaScript" - меня убедили, что сейчас быстро,
зачастую с частичной или полной компиляцией на лету...
Ну я и думаю - хотя и подозрительна дискретность в 1 мс, но кто знает - машины быстрые
сейчас, может разработчики и достигли такой точности таймера.
Хотя и в самой Венде знаю, что таймер неточный. Но в Венде-то тебя полюбому выкинет в
функцию таймера, а тут - видишь как необычно...
Так что излагай своё "имхо" не раздумывая, всё может проще поиск получится.
Я ведь случайно нашел про особенности setTimeout/setInterval, в официальных справочных
данных этого почему-то предпочитают не сообщать.

iLavr
-
- Admin
- Posts: 24083
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Похоже на то - странно было бы, если б у "интерпретатора", работающего в браузереShaos wrote:Возможно неточность таймеров связана с виндой как таковой...
и под Вендой точность была бы лучше самой Венды.
Я просто немного подзабыл какую точность дают таймеры Венды, но здесь просто
+/- "лапоть" по определению.
И большинство статей про таймер в JS пишут о его неточности.

Но разница 1 - 12 мс всё же неприятна. Это ж ошибка "на порядок" получается...

iLavr
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Собственно, особенности таймера связаны даже не столько с Вендой, сколько
с самими браузерами и реализацией таймеров в них.
с самими браузерами и реализацией таймеров в них.
Минимальная задержка таймера
У браузерного таймера есть минимальная возможная задержка. Она меняется примерно от нуля до 4мс в современных браузерах. В более старых она может быть больше и достигать 15мс.
По стандарту, минимальная задержка составляет 4мс. Так что нет разницы между setTimeout(..,1) и setTimeout(..,4).
Реальная частота срабатывания
Срабатывание может быть и гораздо реже
В ряде случаев задержка может быть не 4мс, а 30мс или даже 1000мс.
Большинство браузеров (десктопных в первую очередь) продолжают выполнять setTimeout/setInterval, даже если вкладка неактивна.
При этом ряд из них (Chrome, FF, IE10) снижают минимальную частоту таймера, до 1 раза в секунду. Получается, что в «фоновой» вкладке будет срабатывать таймер, но редко.
При работе от батареи, в ноутбуке — браузеры тоже могут снижать частоту, чтобы реже выполнять код и экономить заряд батареи. Особенно этим известен IE. Снижение может достигать нескольких раз, в зависимости от настроек.
При слишком большой загрузке процессора JavaScript может не успевать обрабатывать таймеры вовремя. При этом некоторые запуски setInterval будут пропущены.
Вывод: на интервал 4мс стоит ориентироваться, но не стоит рассчитывать.
iLavr
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Ну надо же...Lavr wrote:Кто-нибуть знает надежный код отследить потерю фокуса всем окном, т.е.
когда всё всплывающее окно становится неактивным?


Нашел в сети библиотеку - ifvisible.js - якобы она без проблем отслеживает
активность вкладок...
Но, как выяснилось, она отслеживает то же самое: window.onblur = function(e){...
http://serkanyersen.github.io/ifvisible.js/demo.html
То есть, при переходе вкладки в неактивное состояние - эта библиотека выдает
сразу несколько сообщений "hidden", собственно, дублируя фактически window.onblur....
iLavr
-
- God
- Posts: 1388
- Joined: 02 Jan 2006 02:28
- Location: Abakan
Пару раз подходил к разбору этой задачки, но ровно ничего вразумительного и кроссплатформенного не вышло. Связано это, "как ни странно", с разной реализацией безопасности у разных браузеров, да ещё и от настроек оной зависит.
Кстати, как я понял в ходе экспериментов, мозилка считает фрейм как отдельный документ, опера же считает его за часть основного, соответственно и событийная модель ведёт себя по-разному.
Возможно, к решению нужно подходить не через открытие дочерних окон, а через открытие/сокрытие элементов (типа div) одного окна, и с более мудрёным использованием css.
Кстати, как я понял в ходе экспериментов, мозилка считает фрейм как отдельный документ, опера же считает его за часть основного, соответственно и событийная модель ведёт себя по-разному.
Возможно, к решению нужно подходить не через открытие дочерних окон, а через открытие/сокрытие элементов (типа div) одного окна, и с более мудрёным использованием css.
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Да я сам уже много вариантов перепробовал... И не один я, как я вижу в поиске, этой проблемой озадачен.jdigreze wrote:Пару раз подходил к разбору этой задачки, но ровно ничего вразумительного и кроссплатформенного не вышло.
Довольно перспективным казалось мне параллельно с window.onblur отслеживать события мыши (клик вне вкладки),
но тут другая проблема вырисовалась - окно может стать неактивным чисто от событий горячих клавиш клавиатуры...
В общем сейчас остановился на варианте - "если браузер Опера" - закрываем окно по window.onblur,
во всех других ситуациях - окно не закрывается.
И здесь опять что неприятно - в зависимости от браузера следующий вызов pop-up окна может направить новый
контент в уже открытое окно, а может и новое окно создать - что приводит к путанице с открытыми окнами.
iLavr
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Самое неприятное, что все эти коллизии проявляются только при работе в офф-лайн с диска.
В он-лайне всё это совершенно не имеет места: 6502 CPU Emulator... - в основном всё корректно.
Всякие неприятные заморочки есть только в каких-то мелких особенностях внешнего интерфейса.
Хотелось просто сделать для своих целей эмулятор 65хх, в работу которого можно оперативно
вмешаться, если что-то надо быстро изменить в его поведении.
В он-лайне всё это совершенно не имеет места: 6502 CPU Emulator... - в основном всё корректно.
Всякие неприятные заморочки есть только в каких-то мелких особенностях внешнего интерфейса.
Хотелось просто сделать для своих целей эмулятор 65хх, в работу которого можно оперативно
вмешаться, если что-то надо быстро изменить в его поведении.
iLavr
-
- God
- Posts: 1388
- Joined: 02 Jan 2006 02:28
- Location: Abakan
А если попробовать сделать HTA (Hyper Text Application)?
Решение только под венду, но в некоторых случаях очень полезное.
Из особенностей - при создании опираемся исключительно на DOM IE5 или выше. Некоторые защитные механизмы при этом не работают.
P.S. Эмулятор на народе у меня не открылся, как собственно почти любой проект на народе - випсанбэс хренов вылазит, опять юкозовцы что-то мутят со своими скриптами.
Решение только под венду, но в некоторых случаях очень полезное.
Из особенностей - при создании опираемся исключительно на DOM IE5 или выше. Некоторые защитные механизмы при этом не работают.
P.S. Эмулятор на народе у меня не открылся, как собственно почти любой проект на народе - випсанбэс хренов вылазит, опять юкозовцы что-то мутят со своими скриптами.
-
- Supreme God
- Posts: 16689
- Joined: 21 Oct 2009 08:08
- Location: Россия
Да - мутят они там свои скрипты, как всё отлажу, займусь тем чтобы отключать их приблудыjdigreze wrote:Эмулятор на народе у меня не открылся, как собственно почти любой проект на народе - випсанбэс хренов вылазит, опять юкозовцы что-то мутят со своими скриптами.
через 1..3 секунды после старта страницы.
Совсем выкидывать нельзя, это условие "бесплатности" их хостинга.
У меня видно вот такое всплывающее окно:

Ну и по тексту замечаю, что они вставляют в HTML-код 2 своих скрипта:
В начале:
Code: Select all
<script type="text/javascript" src="/abnl/?adsdata=QrLRhLjsUAjuxdH^zgg79lmeAgglQ92xJQv2wTka;psGQ3C9j2GKRbbEWPx20KtFmz;yYFxEAcvuyFstBwz^1Xx3Hrgh0y!E2UPWL1kamFiBFWxZTscyYczxaIZ^5VvvOJN7sR4sjpgu8Nu3CeXK3uINXqj7mEQnKrUFvygW^tGSHQcAiS;1QfkeZqyE26aUWebv65z57cY74FS4JIZrbs1LkUoo"></script>
Code: Select all
<div><script type="text/javascript">var script = document.createElement("script");script.src="/stat/dspixel.js?ab=uc&cl="+window.location.href+"&bcn="+navigator.appCodeName+"&bn="+navigator.appName+"&bv="+navigator.appVersion+"&ce="+navigator.cookieEnabled+"&bl="+navigator.language+"&np="+navigator.platform+"&sw="+screen.width+"&sh="+screen.height+"&r="+Math.random();document.getElementsByTagName("head")[0].appendChild(script);</script></div>
iLavr