Как букмарклет может избежать блокировки всплывающих окон

Я написал букмарклет для быстрого перевода выделенного текста с помощью Google Translator во всплывающем окне:

javascript:(function(){
    var text = encodeURI(document.getSelection());
    if (!text.length) {
        text = prompt('Texto')
    }
    var url = 'http://translate.google.com/translate_t?hl=&ie=UTF-8&text=' + text + ' &sl=es&tl=pt#';
    window.open(url,'trans','left=20,top=20,width=1000,height=500,toolbar=0,location=0,resizable=1');
})();

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

Я думал, что буклеты могут открывать всплывающие окна - на самом деле, многие из них делают это, не так ли? Что я делаю не так? Или это невозможно сделать?

Ответ 1

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

Вот код, который вы можете использовать для тестирования:

Поместите это в файл с именем bookmarklet.js

var popupProperties='width=600,height=400,toolbar=0,location=0,resizable=1';
var newA = document.createElement("a");
var url = 'http://www.stackoverflow.com';
newA.setAttribute("href","javascript:window.open(url,'Hi',popupProperties);");
newA.setAttribute("style","position:fixed;z-index:9999999;top:0;left:0;width:100px;height:100px;color:#000;background:#fff;display:block;");
var newT = document.createTextNode("Open this");
newA.appendChild(newT);
document.body.appendChild(newA);

И тогда ваша ссылка в букмаркете может выглядеть примерно так:

javascript:var jsCode = document.createElement('script');jsCode.setAttribute('src', 'http://localhost/bookmarklet.js?r='+Math.random()*99999999);document.body.appendChild(jsCode);

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

EDIT: В дополнение к вышеописанному методу, я позже обнаружил, что есть еще один способ обойти это с помощью easyXDM. Это может помочь вам работать с одной и той же политикой происхождения http://easyxdm.net/wp/

Используя это, вы можете использовать iframe для своего букмарклета, и у вас даже может быть "закрытая" ссылка внутри вашего iframe, которая сможет удалить iframe с родительской страницы.

Ответ 2

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

Как только вы ссылаетесь на другой файл, он, по-видимому, запускает блокировщик всплывающих окон браузера.

Например, следующий код не запускает блокировщик всплывающих окон, когда пользователь перетаскивает якорь на панель закладок браузера:

<a href="javascript:window.open('http://tagsby.me/index.small.php','newWindowName','width=960,height=400,scrollbars=yes,status=no,titlebar=no,toolbar=no');void(0);">No blocker</a>

Однако, если вы ссылаетесь на один и тот же код в другом файле noblocker.js, который был добавлен к объекту документа для сайта, который посетитель сейчас посещает:

<a id="tbm" class="testing" href="javascript:(function(){document.body.appendChild(document.createElement('script')).src='http://domain.com/noblocker.js';})();">

он вызовет блокировщик всплывающих окон. Возможно, есть и другой способ, но это то, что я сейчас на моем сайте http://tagsby.me.

Ответ 3

Интересный вопрос: мое чувство кишки состоит в том, что это невозможно, потому что браузер не обязательно отслеживает, какой код пытается открыть новое окно, поэтому он не может "разрешить" его, поскольку он появился с сайта X.

Опция, которая, как мне кажется, лучше, открывает содержимое в диалоговом окне в том же окне. Посмотрите, как реализовать букмарклет jquery, а остальные должны быть прямолинейными:

http://www.latentmotion.com/how-to-create-a-jquery-bookmarklet/

Ответ 4

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

(меню инструментов- > параметры- > раздел содержимого)