Среда, которую Microsoft предоставляет для вас через внешние устройства, - интересный зверь.На самом деле у вас есть два окна, первое из которых содержит переменную external
, а целевое окно браузера, в которое вы только что щелкнули правой кнопкой мыши, предоставляется через переменную external.menuArguments
.Для разговора мы будем называть их родительским и дочерним окном, хотя это не то же самое отношение, что и вызов window.open()
.
Так что в этой ситуации у вас есть две функции setInterval / setTimeout на выбор:
window.external.menuArguments.setTimeout(function first() { console.log('child'); }, 1);
window.setTimeout(function second() { external.menuArguments.console.log('parent'); }, 1);
Но ни одна из этих функций не будет выполняться так, как вы ожидаете, хотя и по разным причинам.
Первая из них выполнит setTimeout, но она передаст ссылку на функцию, которую ваше дочернее окноне может быть выполнен, потому что сама функция определена в родительском окне.Таким образом, external.menuArguments не может вызвать first
.
Второй будет выполнять setTimeout, а родительский window
будет иметь ссылку на second
, чтобы он мог вызвать метод в следующем событиипетля.Но внешняя функция IE не перекачивает все сообщения из цикла сообщений перед выходом.Таким образом, ваш метод будет поставлен в очередь, но код закроется после первого цикла сообщения.
Вы можете предотвратить немедленное завершение родительского окна, открыв новое окно через window.open('about:blank');
, которое будет работать до появления всплывающего окна.процесс полностью загружен.На моем ноутбуке это дает мне около 600 миллисекунд для работы с интервалами.
В настоящее время я пытаюсь разработать способ взлома, чтобы процесс продолжался, не блокируя цикл сообщений, как это происходит с for/ пока цикл.Я предполагаю, что что-то в сфере AJAX / FSO ActiveXObject подойдет, но я пока не нашел решения.В моей ситуации требуется, чтобы процесс родительского окна выполнялся вечно, поэтому я отправлю ответ, если найду обходной путь.
Достаточно забавно, просто вызов alert()
после того, как setTimeout выполнит обратный вызов setTimeout, когда интервалдля меня это меньше 10 миллисекунд, поэтому просто показ предупреждения занимает пару миллисекунд, прежде чем выпускать процесс родительского окна.
Другая проблема заключается в том, что для устаревших целей механизм JS является версией 7 или 8, поэтому JSON отсутствуетобъект в родительском экземпляре, что означает, что сериализация и десериализация объекта будут иметь разные цепочки прототипов между двумя экземплярами, если вместо этого вы используете объект external.menuArguments.JSON.И нет Object.keys () или каких-либо других современных дополнений к языку.
Документация в целом для этой области действительно очень скудна, поэтому обычно это эксперимент проб и ошибок для чего-либо полезного.