2013-06-30 4 views
3

Итак, у меня есть сценарий содержимого с событием, которое запускает сообщение сценарию «запуска», который я использую, чтобы создать вкладку с локальным html-файлом и передать одно и то же сообщение/переменную на эту вкладку. Затем вкладка должна загружать определенные данные на основе переменной. Он работает примерно в 50% случаев, что заставляет меня думать, что это проблема синхронности. Я, вероятно, не собираюсь делать это правильно, но это лучшее, что я мог бы решить самостоятельно.Передача переменной во вновь созданную вкладку

Content Script (script.js):

function openHistory(event) { 
    var account = $(/*selector*/).html(); 
    chrome.runtime.sendMessage(account); 
} 

Запуск сценария (launch.js):

chrome.runtime.onMessage.addListener(function(account) { 
    chrome.tabs.create({url: 'background.html'}, function(tab) { 
     chrome.tabs.sendMessage(tab.id, account); 
    }); 
}); 

HTML Script (background.js):

chrome.runtime.onMessage.addListener(function(account) { 
    loadPage(account); 
}); 

function loadPage(account) { 
    chrome.storage.sync.get(account, function(data) { 
     // Do stuff with DOM 
    }); 
} 

Manifest:

{ 
    "manifest_version": 2, 

    "name": "Extension", 
    "version": "1.0", 

    "permissions": ["storage", "tabs"], 

    "background": { 
     "scripts": ["launch.js"], 
     "persistent": false 
    }, 

    "content_scripts": [{ 
      "js": ["jquery.js", "script.js"] 
    }] 
} 

Обновление: Я добавил "предупреждение (chrome.runtime.lastError.message)" внутри обратного вызова для tabs.sendMessage в launch.js, и всякий раз, когда он не работа, я получаю «Не удалось установить соединение. Конечный результат не существует.

+4

Существует еще один упрощенный метод, который не требует передачи сообщений вообще. То есть путем объединения данных с URL-адресом, в строке запроса или фрагменте местоположения (иначе хэш местоположения). Например. 'chrome.tabs.create ({url: 'background.html #' + account});' (читайте, используя 'location.hash.slice (1)'). –

+0

Так просто! Еще раз спасибо, Роб. =) –

ответ

5

Я предполагаю, что обратный вызов, используемый chrome.tabs.create, действительно срабатывает, когда вкладка готова, а не когда ее содержимое загружено. Я не могу сказать, потому что documentation для этого метода не работает «т сказать, когда обратный вызов обжигает.

чтобы обойти эту проблему, она может быть лучше иметь язычок недавно открытый фона отправить сообщение его прародителю —, как вы знаете, сценарий запуска уже будет запущен — чтобы сказать «пришлите мне информацию», на этом этапе вы затем включаете chrome.tabs.sendMessage(tab.id, account);

Если это имеет смысл?

следующее не было проверено и является лишь предположением о том, что может сработать. Очевидно, что с более пристальным взглядом можно было бы использовать MessageSender для разработки, если сообщение появилось из фонового сценария или не —, а не с использованием свойства объекта. Однако я предпочитаю быть конкретными об этих вещах с моим собственным кодом:

HTML Script (background.js):

chrome.runtime.sendMessage({from: 'background'}); 

Запуск сценария (launch.js):

chrome.runtime.onMessage.addListener(function(obj, sender) { 
    if (obj && obj.from == 'background') { 
     chrome.tabs.sendMessage(sender.tab.id, obj); 
    } 
    else { 
     chrome.tabs.create({url: 'background.html' }); 
    } 
}); 
+2

Ваши наблюдения полностью верны. Вместо использования 'chrome.tabs.sendMessage', я предлагаю просто использовать аргумент' sendResponse' события 'onMessage', потому что он достигает того же результата и его проще использовать. –

+1

@RobW Хорошая точка, я не заметил этого аргумента. Я вообще не очень хромирован;) – Pebbl

+0

Блестящее решение, имеет общий смысл. Я просто пойду с идеей хэша местоположения Роба, хотя из-за его полной простоты. Должен ли я пометить это как правильный ответ? Не совсем уверен, что делать здесь ... lol. –

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