Bookmarklet, js инъекция и всплывающее окно - PullRequest
2 голосов
/ 08 июня 2010

В настоящее время я пишу букмарклет, который загружает и выполняет удаленный js-файл, добавив новый тег <script> в текущее окно, например:

javascript:(function() {
    if(typeof __bml_main != "undefined") return __bml_main.init();
    var s= document.createElement('script');
    s.type= 'text/javascript';
    s.src= 'http://127.0.0.1:8000/media/bookmarklet.js';
    void(document.body.appendChild(s));
})();

Моему букмарклету нужно выполнить некоторые манипуляции с dom, чтобы извлечь данные с просматриваемой страницы, а затем открыть новое всплывающее окно для их перечисления.

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

Я пытался сделать что-то вроде этого:

javascript:var my_popup = window.open('http://127.0.0.1:8000/resources/manage/new/', 'newResourcePopup',config='height=200,width=400,toolbar=no,menubar=no,scrollbars=no,resizable=no,location=no,directories=no,status=no');
(function() {
// script injection (...)
})();

, но если я тогда попытаюсь получить доступ к my_popup из моего удаленно загруженного скрипта, большинство браузеров выдаст предупреждение безопасности и не позволит мне получить доступ к объекту Window. Это понятно, так как скрипт не из того же домена, что и отображаемая страница, но я застрял ...

Решением будет использование наложения div, но я бы действительно предпочел открыть окно в этом случае.

Есть какие-нибудь намеки?

1 Ответ

3 голосов
/ 08 июня 2010

Вы можете загрузить разметку для окна в виде строки в файле bookmarklet.js, а затем (позже) использовать window.open без URL (или с "about: blank", я забыл, что более кросс-браузер- совместимо) и используйте my_popup.document.write для записи разметки в новом окне.

Вы можете обнаружить, что не можете открыть окно позже, даже без междоменных проблем, если только вы не делаете это в прямом ответе на действия пользователя & mdash; что, наверное, хорошо. : -)

...