Расширение Safari - слишком много внедренных скриптов, отвечающих на сообщение - PullRequest
5 голосов
/ 16 июня 2010

Я пытаюсь закодировать расширение Safari, подобное Bubble Translate для Chrome.

при нажатии кнопки на панели инструментов он автоматически переводит выбранный в настоящее время текст на выбранный вами язык с помощью API языка Google.

Я использую следующий внедренный скрипт, чтобы получить выделенный текст и отобразить результат (как предупреждение на данный момент): http://pastebin.com/bYVuQAmp

Я использую следующий глобальный скрипт для вызова внедренного скрипта, если это необходимо: hxxp: //pastebin.com/VHaAKM5a

У меня проблема в следующем:

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

Как я могу убедиться, что скрипт вставлен только в нужную страницу или только правильная страница отвечает?

Спасибо,

Philipp

Ответы [ 2 ]

3 голосов
/ 21 июня 2011

Когда глобальный сценарий отвечает на сообщение из введенного сценария, включите URL-адрес целевой вкладки в ответное сообщение, например, так:

var message = {
  translation: result.translation,
  url: event.target.url
}
event.target.page.dispatchMessage("displayTranslation", message);

Затем в обработчике сообщений введенного сценария проверьте, чтоURL-адрес, переданный в сообщении, соответствует URL-адресу страницы, например:

if (event.name === "displayTranslation" && 
     event.message.url === window.location.href) {
  alert(event.message.translation);
}

Таким образом, только ответ в кадре, который создал запрос, будет действовать в ответе.

1 голос
/ 17 июня 2010

Возможно, вы могли бы проверить, что страница, в которую вставлен скрипт, не находится внутри фрейма:

if (window == window.parent) { /* you're not inside a frame! */ }

Я не уверен, работает ли он изнутри <object> тегов, встраивающих HTML.Скорее всего, да.

...