Может ли функция, определенная в букмарклете, вызываться из сценария уровня страницы? - PullRequest
4 голосов
/ 23 января 2010

У меня есть букмарклет, который должен открыть новое окно / вкладку. Чтобы избежать блокировщика всплывающих окон, мне нужно вызвать метод window.open() непосредственно в букмарклете, т.е. на уровне браузера.

Однако я хочу, чтобы букмарклет обновлялся за счет загрузки внешних файлов Javascript. Для этого букмарклету нужно добавить узлы скрипта в DOM. Если бы я поместил код window.open() в один из этих внешне загруженных сценариев, блокировщик всплывающих окон заблокировал бы его, начиная с уровня страницы.

Что я хочу знать, так это то, что я могу создать функцию-оболочку вокруг window.open() в моем букмарклете, а затем вызвать ее из загруженного извне скрипта? Какова область действия и каковы разрешения для обтекания, такого как этот?

Ответы [ 2 ]

1 голос
/ 23 мая 2010

Я придумала решение, которое не идеально, но соответствует требованиям:

Вот код букмарклета:

javascript:window.open(window.location);window.location="http://www.google.com/";var%20s=document.createElement('script');s.setAttribute('src','http://my-script.js');document.body.appendChild(s);void(0);

Пошаговый эквивалент для чтения:

window.open(window.location);                // Clone the current tab
window.location = "http://www.google.com/";  // Navigate to the desired page url
var s = document.createElement('script');    // Create the script
s.setAttribute('src','http://my-script.js'); //
document.body.appendChild(s);                // Embed it into current document

Осталась только одна проблема: страница, которую вы хотите показать, по умолчанию неактивна. Клонированный является.

0 голосов
/ 11 февраля 2011

Мне было интересно, может ли этот подход работать - приятно видеть, что он работает.

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

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

Альтернативой, с которой я пошел, было перемещение содержимого удаленного сценария непосредственно в букмарклет. Это было хорошо для моего простого приложения. Я написал это в своем блоге

...