2011-01-05 3 views
10

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

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

ответ

10

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

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

Поместите это в файл с именем букмарклет.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 из родительского стр.

+1

Вы можете даже нарисовать id на этом якоре и сделать некоторые махинации, такие как document.getElementById ('myid'). Нажмите() и просто отпустите его с места в летучей мыши (серая область здесь ...) Родной DOM .click сложно найти поддержку документация, но современные хром и FF прекрасно работают в моих кратких тестах. –

-1

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

(инструменты меню-> Настройки-> раздел контента)

+1

На самом деле, это не работает, потому что сайт с контентом считается исходным сайтом. Например, если я попрошу перевести слово в es.wikipedia.org, я должен добавить исключение на es.wikipedia.org и т. Д. На любые другие сайты ... – brandizzi

+0

Прошу прощения, я как-то пропустил эту часть вашего OP – horatio

+0

На самом деле, я добавил его после публикации, но даже не вижу вашего предложения. Так что это нормально :) – brandizzi

1

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

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

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

+0

Странно, потому что pepole говорит, что это возможно здесь: stackoverflow.com/q/4048008/287976 Однако я попытался использовать один букмарклет, который, как я полагал, мог бы это сделать (букмарклет для сохранения ссылок на Delicious): во-первых, это не удалось, а затем просто изменило расположение документа ... Это неудачно, потому что я действительно хотел открыть его в другом окне ... Может быть, я попробую jQuery, но я уверен, что этого будет достаточно, чтобы мне добавить исключения для некоторых общих сайтов, откуда я хочу перевести текст ... – brandizzi

7

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

+0

Вы выяснили другой способ? Я вижу, что Pinterest удается получить незаблокированное всплывающее окно через свой букмарклет «Pin it», хотя он вызывается через удаленный файл javascript. Проверьте его в прямом эфире на http://pinterest.com/about/goodies/ – gwendall

Смежные вопросы