2011-01-05 3 views
10

ho scritto un bookmarklet per tradurre rapidamente il testo selezionato utilizzando Google Translator in una finestra pop-up:Come un bookmarklet può evitare il blocco popup

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'); 
})(); 

Tuttavia, il blocco dei popup di Firefox non consente la nuova finestra da aprire . Posso aggiungere eccezioni per ogni sito in cui utilizzo il popup, ma può essere piuttosto fastidioso ...

Pensavo che i bookmarklet potessero aprire finestre popup - in realtà, molte di loro lo fanno, giusto? Che cosa sto facendo di sbagliato? O non è possibile farlo?

risposta

10

C'è un altro modo di aggirare il blocco dei popup includendo innanzitutto un collegamento sovrapposto sulla pagina e quindi consentendo all'utente di fare clic per generare il popup. Il bookmarklet javascript può quindi essere memorizzato in un file separato. Questo è il modo in cui il bookmarklet di Pinterest riesce a farlo. Per prima cosa selezionano le immagini dalla pagina e la sovrappongono direttamente sulla pagina. Quindi, quando l'utente fa clic per selezionare una delle foto, viene visualizzato il popup. Poiché questa azione è stata avviata dall'utente, il popup funziona.

Ecco alcuni codice è possibile utilizzare per verificare:

Inserire questo in un file chiamato 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); 

E poi il tuo link bookmarklet può essere come questo:

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

In alternativa, è necessario includere il popup nel collegamento reale bookmarklet. Il che a sua volta significherà che l'unico modo per apportare eventuali modifiche è che l'utente reinstalli il bookmarklet.

MODIFICA: in aggiunta al metodo sopra, in seguito ho scoperto che c'è anche un altro modo per aggirare questo problema usando easyXDM. Essa può aiutare a lavorare intorno alla stessa politica di origine http://easyxdm.net/wp/

Con questo, è possibile utilizzare un iframe per la vostra bookmarklet e si può anche avere una "stretta" di collegamento all'interno del vostro iframe che sarà in grado di rimuovere l'iframe dal genitore pagina.

+1

Puoi anche lanciare un id su quell'ancora e fare qualche shenigans come document.getElementById ('myid'). Click() e sparagli semplicemente dalla mazza (area grigia qui ...) Native DOM .click è difficile trovare supporto documentazione per, ma i moderni chrome e FF funzionano bene nei miei brevi test. –

-1

Il blocco popup ha la possibilità di aggiungere eccezioni. forse provare ad aggiungere un'eccezione per translate.google.com

(strumenti menu-> Opzioni-> sezione contenuti)

+1

In realtà, non funziona perché il sito con il contenuto è considerato il sito di origine. Ad esempio, se gli chiedo di tradurre una parola in es.wikipedia.org, dovrei aggiungere un'eccezione a es.wikipedia.org e così via a qualsiasi altro sito ... – brandizzi

+0

Mi scuso, in qualche modo ho perso quella parte del tuo OP – horatio

+0

In realtà, l'ho aggiunto dopo aver postato ma senza nemmeno vedere il tuo suggerimento. Quindi va bene :) – brandizzi

1

Domanda interessante, la mia sensazione è che non è possibile perché il browser non deve necessariamente tenere traccia di quale codice sta tentando di aprire una nuova finestra, quindi non può "permetterlo" poiché proviene dal sito X.

Un'opzione che ritengo sia effettivamente migliore è aprire il contenuto in una finestra di dialogo nello stesso finestra. Date un'occhiata a come implementare un bookmarklet jQuery e il resto dovrebbe essere straight-forward:

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

+0

È strano perché pepole dire che sarebbe possibile qui: stackoverflow.com/q/4048008/287976 Tuttavia, ho provato a utilizzare un bookmarklet che credevo potesse farlo (un bookmarklet per salvare i collegamenti su Delicious): in primo luogo ha fallito, e poi ha semplicemente cambiato la posizione del documento ... Questo è un peccato, perché volevo davvero aprirlo in un'altra finestra ... Forse provo jQuery, ma scommetto che sarà sufficiente per io per aggiungere eccezioni per alcuni siti comuni da dove voglio tradurre del testo ... – brandizzi

7

Un modo per evitare che i browser da inducendo un blocco dei pop-up è di avere il javascript completamente contenuto all'interno di ancoraggio etichetta.

Una volta che si fa riferimento a un altro file, apparentemente si attiva il blocco pop-up del browser.

Ad esempio, il seguente codice non innescare un pop-up blocker, quando un utente trascina l'ancora alla barra dei segnalibri del browser:

<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> 

Tuttavia, se si fa riferimento lo stesso codice in un altro file noblocker.js che è stato aggiunto all'oggetto documento per il sito l'utente sta visitando:

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

si innescherà il blocco dei pop-up. Potrebbe esserci un altro modo, ma questo è quello che sto lavorando al mio sito http://tagsby.me in questo momento.

+0

Hai trovato un altro modo? Vedo che Pinterest riesce ad avere un pop-up non bloccato attraverso il loro bookmarklet "Pin it" anche se viene chiamato attraverso un file javascript remoto - Check out live su http://pinterest.com/about/goodies/ – gwendall