2013-06-17 4 views
5

Я в настоящее время строит расширение Google, и это то, что я иду:Javascript: Выполнение действий после загрузки следующей страницы?

ли что-то на awesome.page1.html автоматически нажмите Next Page. Когда новая страница загрузится, заполните текстовое поле формы.

Моя проблема в том, что, хотя я знаю, как заполнять текстовое поле, я не совсем знаю, как сказать ему, чтобы заполнить его, как только страница2 загрузилась. Он продолжает пытаться сделать все, на странице 1.

Это то, что я пытаюсь, но это не работает:

function addEffect() { 
    document.getElementsByClassName("effect1 shine")[0].click(); 
    document.getElementsByClassName("nextPage BigButton")[0].click(); 
    nextStep(); 
} 

function nextStep() { 
    if(document.getElementsByClassName("myformTextField imageName") != undefined) { 
     alert('Page 2 is up.'); 
    } 

    else { 
     alert('Page 1 is still up.'); 
     setTimeout("nextStep()", 250); 
    } 
} 

Я использую предупреждение только для тестирования, и я постоянно получаю «Страница 2 вверх ", хотя он все еще находится на стр. 1. Я проверяю, находится ли элемент, который присутствует только на странице 2. Как я могу убедиться, что страница2 поднята?

ответ

2

Самый простой способ, с которым я решил пойти, - это совпадение содержимого скрипта.

Что я сделал, так это создание двух отдельных файлов javascript в моем расширении: 1.js и 2.js. Когда awesome.page1.html загружает его, он будет запускать 1.js, а при загрузке page2.html он запустит 2.js.

Все, что я делал в своем манифесте.JSON-файл состоит в следующем:

"content_scripts":[ 
     {"matches": ["http://awesome.page1.com/*"], "js": ["1.js"]}, 
     {"matches": ["http://page2.com/*"], "js": ["2.js"]}] 
2

Ну, ваш код здесь:

document.getElementsByClassName("myformTextField imageName") 

возвращает пустой массив, когда он не находит ничего, что не undefined. Поэтому ваше первое условие if всегда будет истинным, независимо от того, найдет ли он ваш товар или нет.

Вместо этого проверьте длину возвращенное getElementsByClassName или использовать querySelector и проверить нулевой

if (document.getElementsByClassName("myformTextField imageName").length) { ... } 

// Or.. 
if (document.querySelector('.myformTextField.imageName') !== null) { ... } 
+0

Благодаря rgthree, но она по-прежнему возвращая «он существует» на странице 1:/ – KingPolygon

+0

Ну, не могу отлаживать код из всего вашего примера здесь, но это не отменяет тот факт, что ваше первое условие будет всегда так, как есть. – rgthree

0

вы должны попытаться пользователь Jquery и $(document).ready(handler)

это действительно лучшая практика для того, чтобы страница загружается до того, как она попытается выполнить ваши команды http://api.jquery.com/ready/

+0

Может ли jquery использоваться в хромированном расширении? Спасибо Moises! – KingPolygon

3

Основная эмиссия e вы столкнетесь с тем, что переменные JavaScript, включая функции, не сохраняются с одной страницы на другую. Иными словами, вы не можете написать функцию на одной странице и выполнить ее на странице, которая ее заменяет.

Вы можете передать переменную URL или установить cookie для сохранения данных - или сохранить настройки на своем сервере, но прямой подход JavaScript не будет работать.

Конечно, есть небольшая уловка, которую некоторые люди используют для загрузки всей DOM следующей страницы в переменную (с использованием вариации на XMLHttpRequest), применяют сохраненные настройки к объекту в памяти, а затем заменяют большую часть документа с большей частью нового DOM, но это, вероятно, намного сложнее, чем вам нужно, и оно должно соответствовать требованиям одного домена.

+0

Спасибо Нейл! В моем файле манифеста мои совпадения домена имеют awesome.page1.com/*, где я хочу запустить свой главный файл js (main.js), однако этот домен следующей страницы awesome2.diffpage.com/* Может быть, проблема ? – KingPolygon

+0

Опять же, ваш JS запускает _only_ на странице, где он загружен ... и затем выходит. Код на стр. 1 _won't_ (не может) запускаться на стр. 2. Как отметил @rgthree, ваша функция nextStep() получает nodeList, который может быть пустым, но не будет неопределенным. Проблема, для которой у меня нет обходного пути, заключается в том, что, как только страница 2 загружается, ваш код страницы-1, включая все таймауты, исчезает. Проясняет? –

+0

Да, спасибо, Нил! Есть ли способ, возможно, иметь 2 js-файлов в моем расширении, чтобы второй .js-файл реагировал на эту новую страницу поддомена? Альтернативой, которую я вижу, является создание второго нового расширения, и так же, как этот первый реагирует на этот субдомен, создайте новое расширение, которое реагирует на второе. Но я чувствую, что должен быть более чистый способ. – KingPolygon

Смежные вопросы