Определите, уходит ли браузер - без загрузки - PullRequest
0 голосов
/ 30 января 2012

Я внедряю javascript в страницу с помощью autohotkey, вводя javascript: blahblahblah в строку адреса.

Мне нужно определить, ждет ли IE перехода к новой странице (например, статус страницы вращается, но еще не обновился до новой страницы).

В настоящее время я использую document.readyState, однако иногда удаленная веб-сервер отвечает долго. В течение этой задержки readyState по-прежнему говорит «завершено» (поскольку оно завершено, это просто старая страница, а не новая)

Если я попытаюсь что-то сделать со страницей, она будет работать на старой странице, а не на следующей.

Я мог бы просто поспать пару минут после каждой навигации по страницам, но это заставило бы скрипт работать вечно.

Подключение onunload не будет работать через адресную строку, так как каждый раз, когда я что-то вводю в адресную строку, это вызывает onunload, вызывая тонны ложных срабатываний.

Есть ли какой-нибудь способ в javascript в IE, чтобы определить, ждет ли браузер перехода на новую страницу?

1 Ответ

1 голос
/ 09 апреля 2012

Какое совпадение, я просто искал ту же проблему, я использовал readyState и столкнулся с вашей проблемой, я нашел похожие обработчики событий в VB , как и вы пытался использовать, но, как вы сказали, он будет выполняться каждый раз, когда срабатывает событие.

Соль: Я посмотрел в MSDN и обнаружил свойство Занято , которое получает значение, указывающее, участвует ли объект в операции навигации или загрузки, теперь я использую его в дополнение к readyState , Busy предназначен для ожидания ответа от удаленного сервера, а readyState для объекта, который готов к выполнению действий с ним.

примечание: я пытался использовать Busy в одиночку, но иногда ответ слишком быстрый, и следующая инструкция пытается быть выполнена до того, как объект будет готов.

Пример в AHK (тестовая страница входа в систему 20 раз с высокой скоростью):

Loop, 20
{
Global IE := ComObjCreate("InternetExplorer.Application")
IE.visible := 1
IE.Silent := 0
Login:
IE.navigate("www.example.com")
While (IE.ReadyState != 4 or IE.Busy = True)
continue

IE.document.forms("login").name.value := "Username"
IE.document.forms("login").password.value := "Password"
;IE.document.forms("login").s1.Click()
IE.document.forms("login").Submit()
While (IE.ReadyState != 4 or IE.Busy = True)
continue

;sleep 1000 ;use it just to see that you are login successfully 
IE.Stop()
IE.Quit()
}
...