Как букмарклет может избежать блокировки всплывающих окон - PullRequest
11 голосов
/ 06 января 2011

Я написал букмарклет для быстрого перевода выделенного текста с помощью 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 не позволяет открывать новое окно.Я могу добавить исключения для каждого сайта, где я использую всплывающее окно, но это может быть довольно раздражающим ...

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

Ответы [ 4 ]

12 голосов
/ 22 августа 2012

Существует еще один способ работы с блокировщиком всплывающих окон: сначала включить ссылку, наложенную на страницу, а затем позволить пользователю щелкнуть ее, чтобы создать всплывающее окно. 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);

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

РЕДАКТИРОВАТЬ: В дополнение к вышеописанному методу, позже я обнаружил, что есть еще один способ обойти это с помощью easyXDM. Это может помочь вам обойти ту же политику происхождения http://easyxdm.net/wp/

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

7 голосов
/ 09 июня 2011

Один из способов запретить браузерам запрашивать блокировку всплывающих окон - полностью включить ваш 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 прямо сейчас.

1 голос
/ 06 января 2011

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

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

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

0 голосов
/ 06 января 2011

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

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

...