Il tuo problema è duplice, e entrambe le pieghe calpestano il territorio incerto.
Ai vecchi tempi di browser, window.open
ha fatto esattamente questo – aprire una nuova finestra. Questo perché il concetto di schede non era ancora stato inventato. Quando le schede sono state introdotte, sono state trattate esattamente come Windows per migliorare la compatibilità e questa tradizione continua ancora oggi. Ciò, e il fatto che window.open
fosse solo standardized very recently, significa che JavaScript non è in grado di distinguere tra finestre e schede.
Non esiste un modo "normale" per specificare se un collegamento deve essere aperto in una nuova scheda o no. È possibile ricorrendo a un trucco, però: specificare un formato finestra personalizzata alla chiamata open
(attraverso il terzo argomento), in questo modo:
window.open('http://example.com', '', 'width=' + screen.width);
Questo farà sì che quasi tutti i browser per aprire una finestra separata, perché le schede non può avere dimensioni personalizzate.
In JavaScript, ci sono fidati eventi e non attendibili eventi. Gli eventi attendibili sono, ad esempio, clic legittimi su un collegamento da parte dell'utente, mentre un evento non attendibile sarebbe una chiamata manuale click()
su un collegamento.
Solo gestori di eventi attendibili possono aprire nuove finestre/schede. Questo serve a prevenire attacchi lato client che bloccano il browser o confondono un utente aprendo rapidamente un centinaio di schede su mouseover
o qualcosa di simile.
Il secondo esempio non funziona perché il blocco popup blocca l'evento non attendibile che è stato attivato tramite click()
. Sebbene sia stato causato da un clic reale, la chiamata asincrona tra i due interrompe il collegamento alla fiducia.
Non è possibile. È una preferenza degli utenti se le nuove pagine si aprono in una finestra o in una nuova scheda e non possono essere modificate. –
Il tuo parco giochi demo sembra funzionare come previsto. Sono su IE 11. – pixelbits
@pixelbits Interessante. Sembra funzionare anche in Firefox 30.0. Mi chiedo il motivo per cui non funziona in Chrome (35.0 nel mio caso). –