Я работаю над проектом, который требует, чтобы мой пользовательский скрипт был запущен на страницах, поскольку они представляются, не выполняя ни одного JavaScript страницы. То есть мы должны просмотреть с отключенным JavaScript.
Я встретился с проблемой хотя, когда я пытаюсь задержать выполнение функции в рамках моего сценария. Каждый раз, когда я звоню window.setTimeout
, функция, в которой я передаю, никогда не выполняется.
Я думаю, возможно, что эта функция на самом деле становится обращенной unsafeWindow
вместо окна. Есть ли какое-либо обходное решение для этого?
Я должен упомянуть что вызовы setTimeout
хорошо работайте, когда JavaScript включен, и все остальное в моем сценарии хорошо работает, не включая JavaScript.
Спасибо за помощь!
Хотя 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 .
Ссылка window
по-прежнему является window
страницы, просто обернутым в обертку песочницы. Когда вы вызываете setTimeout
на нем, вы все еще устанавливаете что-то, что должно быть запущено страницей. Я полагаю, что должно быть так, что браузер вообще не будет вызывать эти события таймаута (или просто проигнорирует их), когда Javascript отключен.