2016-07-22 2 views
0

Итак, у меня есть popup.html, который загружает скрипт (popup.js) в качестве заголовка для действия браузера. Затем он вызывает звонки на сайт, чтобы получить необходимую информацию.Расширение Chrome: нажатие информации, собранной до создания новой вкладки?

Я получил всю необходимую информацию, используя XMLHTTPRequests, и сохранил ее в переменных в popup.js.

Теперь я пытаюсь создать новую вкладку, загрузить веб-страницу, а затем использовать сохраненную информацию для заполнения формы.

chrome.tabs.create({ 'url': "https://site.html" }); 

Эта линия в popup.js

Это берет меня к месту желаемого быстро, но, кажется, чтобы удалить всю информацию, которую я уже загруженную ранее. Он даже не предупреждает меня о той информации, которую я хочу, даже если я попрошу ее, прежде чем делать вкладку. Как мне приступить к созданию вкладки с определенным URL-адресом, а затем использовать информацию, которую я собрал ранее в popup.js, чтобы заполнить форму на ней, пока она содержится внутри popup.js? Неужели моя логика испорчена? Большое вам спасибо за любой совет.

ОБНОВЛЕНИЕ: Я редактирую это, чтобы иметь больше смысла.

это мой popup.js

function do(){ 
    var xhr = new XMLHttpRequest(); 
    xhr.open("Get", Url); 
    xhr.send(); 
    xhr.addEventListener("readystatechange", function() { 
     if (this.readyState === 4) { 
      var dogName = this.responseText; 
      alert(dogName) 
} 
do(); 
chrome.tabs.create({ 'url': "site.html" }); 

внутри site.html есть форма. Я должен был сделать это в этой форме.

document.getElementById('form').getElementsByTagName('input')[0].value = dogName; 
document.getElementById("btnOK").click() 

Но это обыкновение делать что-либо, если линия

chrome.tabs.create({ 'url': "https://site.html" }); 

существует, то он будет принимать только меня на эту страницу и не работать do(), чтобы предупредить ничего.

Удаляя строку создания, расширение предупреждает меня о той информации, которую я хочу.

+0

, учитывая, что вы даете ему действительно короткий URL-адрес без какой-либо информации, что вы, кроме как показать? – dandavis

+0

нет, я быстро его закодировал. Заморозь его снова. – Stevie

ответ

1

Вам нужно будет использовать event page вместо всплывающего окна. Страница событий - это длинный сценарий, который позволит вам получать данные по требованию. Открытая вкладка также должна запускать сценарий содержимого. Этот скрипт содержимого отправляет сообщения на страницу событий для извлечения данных XHR, а затем применяет данные к полям формы. Content scripts может быть injected с использованием файла manifest.json или непосредственно на функции chrome.tabs.create, переданной в качестве второго аргумента.

Примечание: Код ниже близкий пример того, как файлы и структура должны быть. Он не был протестирован, и его следует использовать для получения общей идеи решения .

manifest.json

"content_scripts": [{ 
    "matches": ["*://eample.com/formpage.html"], 
    "js":   ["content.js"], 
    "run_at":  "document_idle" 
    }], 

ИЛИ

всплывающее окно.JS

chrome.tabs.create({ 'url': "https://example.com/formpage.html" }, function(tab1) { 
    chrome.tabs.executeScript(tab1.id, {file: 'content.js', run_at}); 
}); 

content.js

chrome.runtime.sendMessage({data: "dogName"}, function(response) { 
    var dogName = response.data; 
    document.getElementById('form').getElementsByTagName('input')[0].value = dogName; 
}); 

event.js

function getDogName(callback){ 
    var xhr = new XMLHttpRequest(); 
    xhr.open("Get", Url); 
    xhr.send(); 
    xhr.addEventListener("readystatechange", function() { 
    if (this.readyState === 4) { 
     var = dogName = this.responseText; 
     callback({data: dogName}); 
    } 
    }); 
} 
chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
    if (request.data === "dogName") { 
     getDogName(sendResponse); 
     return true; 
    } 
}); 

Вы можете найти более подробную информацию о удлинительных связи здесь: Message Passing.

+0

Да, ты прав. Я забыл эту часть. Исправлено: – 10100111001

+0

Всплывающее окно уничтожит фокус, и поэтому обратный вызов не будет работать, так как активной вкладкой будет сайт. Однако использование фонового скрипта для открытия вкладок отлично работает. Где происходит вызов функции event.js или функция. – Stevie

+0

@Stevie Я забыл изменить имя функции 'do' на' getDogName'. Я обновил его. Что касается всплывающего окна, я думал, что у вас может быть расширение, предоставляющее пользовательский интерфейс для пользователя, и принятие некоторых действий откроет новую вкладку. Это все еще возможно, так как когда пользователь нажимает кнопку, открывающую новую вкладку, на вкладке будет скрипт контента, который может связываться со страницей событий. – 10100111001

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