2016-12-21 7 views
0

мне нужно найти решение этой задачи:расширения Chrome - открыть новую вкладку из всплывающего окна и послать туда сообщение

  1. Открыть указанного веб-сайт из списка сайтов в всплывающем окне

  2. Run указанная сценария содержимого на этом веб-сайте.

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

In popup.js:

(function($) { 

    $(document).ready(function() { 

    $('#grantexpert').click(function() { 

     var newURL = "https://www.grantexpert.sk"; 
     chrome.tabs.create({ url: newURL }, function(tab) { 

     chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
      chrome.tabs.sendMessage(tabs[0].id, {type: "action_example"}); 
     }); 

     }); 

    }); 
    }); 
})(jQuery); 

В content.js:

chrome.runtime.onMessage.addListener(

    function(request, sender, sendResponse) { 

    switch(request.type) { 

     case 'action_example': 
     alert('running action-example'); 
     break; 

    } 
    }  
); 

Это не работает, и предупреждение не отображается. В консоли любой вкладки/всплывающей подсказки нет ошибки. Это неправильный подход? Как это можно сделать?


Update Я не могу использовать растворенную форму этого ответа: Chrome extension create new tab and send message from popup.js to content script of new tab потому что есть сообщение, отправленное из скрипта содержания, но мне нужно отправить сообщение из всплывающего окна.

+0

Возможный дубликат [Расширение Chrome создает новую вкладку и отправляет сообщение из popup.js в сценарий содержимого новой вкладки] (http: // stackoverflow .com/questions/38296583/chrome-extension-create-new-tab-and-send-message-from-popup-js-to-content-script) –

+0

Я не могу управлять тем, как изменить мой скрипт этим ответом – Incredible

+0

@Incredible , В вопросе вы указываете «есть сообщение, отправленное из сценария контента». Однако это не показано в коде, который вы предоставили, а также никакой возможности всплывающего окна получать такое сообщение. Вам нужно обмениваться сообщениями после открытия вкладки или просто отправить одно сообщение из всплывающего окна? – Makyen

ответ

0

Почему вы не просто используете параметр вкладки в своем обратном вызове после создания новой вкладки? Этот код должен послать сообщение вновь созданного вкладки:

chrome.tabs.create({ url: newURL }, function(tab) { 
    chrome.tabs.sendMessage(tab.id, {type: "action_example"}); 
}); 
+0

Даже это не работает. Событие не запускается, не отображается предупреждение в прослушивателе сообщений о сценарии содержимого. – Incredible

1

Я нашел несколько замечаний по SO, что это слишком рано, чтобы отправить сообщение скрипта содержимого вкладки сразу после создания вкладки, так что, вероятно, это true (требуется проверенный источник).

Я нашел другое решение:

В popup.js Я посылаю сообщение для background.js (что "тест" должен быть выполнен):

$(document).ready(function() { 

    $('#grantexpert').click(function() { 

     chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 

     // message for content scripts 
     // chrome.tabs.sendMessage(tabs[0].id, {type: "start-test", test: "grantexpert"}); 

     // message for background scripts 
     chrome.runtime.sendMessage({type: "start-test", test: "grantexpert"}); 
     }); 

    }); 
    }); 

В фоне. js Я слушаю сообщение из popup.js (case «start-test»), создавая новую вкладку и устанавливая глобальную переменную testname (в каком тесте работает текущий шаг теста - один шаг - одна pageload):

var step = 0; 
var test = 'no-test'; 

// Message listener 
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 

    switch(request.type) { 

    case "start-test": 
     startTest(request.test); 
     break; 

    case "is-test-running": 
     sendResponse({test: test, step: step}); 
     break; 

    case "increment-step": 
     step = step + 1; 
     break; 

    case "end-test": 
     test = 'no-test'; 
     alert('Koniec testu'); 

    } 

    return true; 

}); 

function startTest(testname) { 

    test = testname; 
    step = 1; 

    var newURL = "https://www.grantexpert.sk"; 
    chrome.tabs.create({ url: newURL }); 
    alert('ZAČIATOK TESTU: '+test); 

} 

В content.js на каждом PageLoad (включая создание вкладки) им посылающего сообщение для backgorund.js и ожидающего ответа (проверка, если тест работает - если да, то определенная часть кода должна быть выполнена по содержанию ,JS в соответствии с тем, что тестом и какой шаг работает):

// every pageload 
$(document).ready(function() { 

    // check if test is running 
    chrome.runtime.sendMessage({type: "is-test-running"}, function(response) { 

    switch (response.test) { 

     case 'no-test': 
     // do nothing if no test is running 
     break; 

     default: 
     // increment step of test on pageload if test is running 
     chrome.runtime.sendMessage({type: "increment-step"}); 
     // calling custom external testing functions by eval 
     eval('test_'+response.test+'('+response.step+');'); 
    } 
    }); 


}, true); 

Так дело не отправить сообщение из всплывающего меню для вновь созданной вкладки это скрипт содержания (что некоторые действия должны быть выполнены) , но отправьте сообщение из content.js в pageload и запросите информацию из background.js о том, какое действие должно быть выполнено. "What action has to be executed" хранится в глобальной переменной фона, которая может быть установлена ​​сообщением из popup.js