setTimeout, не работающий в пользовательском сценарии Механика, когда JS отключен в браузере

Я работаю над проектом, который требует, чтобы мой пользовательский скрипт был запущен на страницах, поскольку они представляются, не выполняя ни одного JavaScript страницы. То есть мы должны просмотреть с отключенным JavaScript.

Я встретился с проблемой хотя, когда я пытаюсь задержать выполнение функции в рамках моего сценария. Каждый раз, когда я звоню window.setTimeout, функция, в которой я передаю, никогда не выполняется.

Я думаю, возможно, что эта функция на самом деле становится обращенной unsafeWindow вместо окна. Есть ли какое-либо обходное решение для этого?

Я должен упомянуть что вызовы setTimeout хорошо работайте, когда JavaScript включен, и все остальное в моем сценарии хорошо работает, не включая JavaScript.

Спасибо за помощь!

7
задан Brock Adams 29 July 2010 в 01:11
поделиться

2 ответа

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

Таким образом, если основной JavaScript страницы отключен, таймер никогда не запустится.

Возможные обходные пути:

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

     GM_xmlhttpRequest
    (
     {
    метод: "GET",
    url: "http://YourTestServer.com/DelayService.php?Seconds=2",
    onload: функция (ответ) {YourDelayedFunctionHere (); }
     }
    );
    

    Вызов бы страницу утилит, которую вы настроили, чтобы сделать задержку за вас.

  • Используйте NoScript, чтобы отключить весь JavaScript страницы, кроме главной страницы. Например, для страницы YourSite.com/testpage.htm , которая включает скрипты, скажем, из * SpamGenerator.net ... Разрешить скрипты из YourSite.com , но заблокируйте их на SpamGenerator.net .

4
ответ дан 7 December 2019 в 09:55
поделиться

Ссылка window по-прежнему является window страницы, просто обернутым в обертку песочницы. Когда вы вызываете setTimeout на нем, вы все еще устанавливаете что-то, что должно быть запущено страницей. Я полагаю, что должно быть так, что браузер вообще не будет вызывать эти события таймаута (или просто проигнорирует их), когда Javascript отключен.

2
ответ дан 7 December 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: