Nueva ventana / pestaña en Google Chrome

Tengo un código javascript que mediante formulario abre una nueva pestaña para visualizar la página que se indica pasándole una serie de parámetros. Bien, esto funciona tanto para Firefox, como para Explorer, pero no para Google Chrome, que considera el target="_blank" como pop-up y lo bloquea. Sé que puedo poner como excepción la página que abre y así lo permitiría. Pero no quiero tocar eso, ya que lo "solucionaria" para mi pero no para los demás.

Mediante código javascript, he visto que esto debería funcionar:

chrome.tabs.create({url:"http://www.google.com/"});

Pero no lo hace, no funciona. Tengo la última versión del Chrome (la 36 ... )

¿Alguien se ha encontrado con esto? ¿Alguien lo ha solucionado?

1 Respuesta

Respuesta
1

En principio la llamada javascript window. Open debe abrir una nueva pestaña en todo navegador moderno sin necesidad de indicar nada más:

window.open('url');

Ahora bien, si la llamada javascript que está lanzado el window.open no es como respuesta de un evento que ha iniciado el usuario (como el "click") algunos navegadores pueden interpretarlo como algo malicioso y bloquear la petición (como parece que te está haciendo chrome).

Asegúrate de que siempre que quieres abrir un nueva tab con window. Open sea a consecuencia de un evento click y no deberías tener problemas.

No me respondes.

Vamos a ver... ¿es respuesta a un click? pues si y no ... Me explico: al hacer click, en un enlace va a una función que hace una serie de operaciones entre ellas llamar a otra función y es ahí donde se rellenan los datos del form, que se debe abrir en una nueva pestaña ...

¿Alguna idea más?

Necesitaría ver algo de código para poder entender mejor el problema ya que, en principio, el window. Open debe abrir un tab en cualquier navegador moderno.

¿Puedes pegarme por aquí el código para que le eche un vistazo?

¿Qué código quieres que te ponga:

window.open('http://www.todoexpertos.com/"); ?

El tema es que cuando pongo ese código o al hacer  document.getElementById("f_enviar").submit();   con un target='_blank' Google Chrome lo detecta como un pop-up, no es que no lo abra, que puedo hacer que lo abra mediante la seguridad / excepciones de Google Chrome lo que pasa es que lo detecta como ventana emergente. Por eso decia de si alguien había manejado / empleado la solución de crear tabs mediante el código: chrome.tabs.create({url:"http://www.google.com/"});     ya que a mí tampoco me funciona ...

Si a tí te funciona el window.open en Google Chrome, es porque probablemente tengas algo en configuración del chrome que te permite hacerlo, que no te detecte eso.

Mi pregunta era ¿cómo saltarme ese paso? ya que si subo la página a internet y un usuario selecciona esa opción, no le va a funcionar, y decirle "mira, ves a Configuración de Google Chrome y toca esto y lo otro" ... queda bastante mal. Por lo que repito si a alguien le pasaba lo mismo y lo ha solucionado mediante software, con el chrome.tabs.create o algún otro sistema, agradecería enormemente que me lo comentara.

Saludos.

No es necesario usar código expresamente para chrome para abrir un nuevo tab ya que con window. Open ya lo hace en cualquier navegador "moderno".

Ahora bien, como comentas con mucha razón, el bloqueador de popups puede detectar que se está abriendo un nuevo tab e impedirlo ya que cree que no ha sido por una acción del usuario si no por algo que considera "malicioso". Esto es otro problema distinto.

Como bien dices no es una opción agregar una excepción en tu navegador (o esperar a que lo haga cada usuario, eso es una locura) lo que debes hacer es asegurarte de que la llamada window. Open se hace directamente como una acción del usuario.

Por eso te pedía que me pegarás el código javascript involucrado, para ver en que evento se está lanzando e intentar ayudarte con alguno de los trucos que existen para evitar esto.

Por ejemplo, si lanzas el window. Open como callback de una de tus llamadas javascript (en el "done" de un $. Ajax o en un $. GetJSON, etc...) no se considera el mismo evento y te lo bloquea.

Si es tu caso asegúrate de hacer estas peticiones sincronamente.

Otra posibilidad es que lances primero el window. Open, luego hagas el submit y, en la página que acabas de abrir, en el document. Ready, hagas un GET para obtener los datos que ya se han posteado en la otra llamada.

Como ves sin conocer exactamente como lo haces no puedo más que darte recomendaciones genéricas pero vamos, que estoy seguro de que si lanzas el window. Open en un evento provocado directamente por el usuario en lugar de algo asíncrono te abrirá tab en todos los navegadores sin excepción.

Es que el código es muy simple es un <a href = ... > con un onclick, que llama a una funcion javascript, ésta llama a otra y en esa abre la ventana en cuestión (la abre en todo menos en el Chrome).

Lo de hacer primero el window.open y luego lo demás, ya lo había pensado ... pero no lo tengo claro, más que nada porque tendría que tocar bastante código y luego realizar las pruebas oportunas en los otros dos navegadores .. Ajax, ya he visto código por ahí, pero ajax, me parece más farragoso que cualquier otra cosa ...

Lo de utilizar chrome.tabs.create , me parecía lo menos malo, ya que al ser específico para ese navegador no creía que tuviera problemas ...

La clave de la cuestión es que es lo que hace la otra función javascript antes de invocar el window. Open. Estoy seguro de que haces alguna llamada con callback y estás incluyendo el window. Open en dicho callback.

Estoy preparando un ejemplo online para que puedas ver las diferencias e ilustrar mejor el ejemplo pero, en cualquier caso, no descartaría el hacerlo con una llamada $. Ajax síncrona que así seguro que te va

No es necesario que hagas ningún ejemplo

La función inmediata a la llamada no contiene ningun callback ni nada, solo coger un valor php y lo pasa junto con otras variables a la función que termina queriendo crear la nueva ventana ...

Esto tenía que haber sido rápido, el fallo está aquí o acá, el chrome.tabs.create no funciona o le hace falta eso o lo otro ...

Pero llevamos dándole vueltas al tema y nada ...

El tema es que la funcion, primero rellena un div, mediante jquery y de ahí va a la función que debería generar la nueva ventana/pestaña ...  Por eso voy tan al grano ... ya que chrome no permite los target='_new' o los target='_blank', pues a ver objetos específicos como el chrome.tabs ...

Por cierto el window.open tampoco lo puedo utilizar, por lo que he comentado, la función javascript que es llamada por el click en el enlace, llama a un fichero php que es ejecutado en un div, luego otra función coge datos de ese div y con ellos llama a una función que debe abrir la ventana / pestaña en cuestión ...  Por eso me parecía que el tema del chrome.tabs es lo que menos trabajo me llevaría, ya que con una línea me serviría.

Entiendo, por lo que dices, que en efecto se hace una petición php lo que implica forzosamente una llamada externa y de ahí que todo lo que se ejecute después sea bloqueado por el chrome al no venir expresamente del mismo evento.

En tal caso, tal y como lo tienes montado, la cosa se complica y deberías sustituir la petición php que haces a una llamada $. Ajax síncrona que haga un POST y en el callback hacer el window. Open.

Aquí tienes el ejemplo que te comentaba, lo he simplificado lo máximo posible:

http://jsfiddle.net/vfportero/ygabd4ok/2/ 

Por ahora es lo único que se me ocurre sin poder ver tu código pero creo que es una solución elegante y bastante correcta para evitar otros problemas similares en un futuro con algún navegador concreto.

Gracias ante todo.

Siento decirte que al pulsar en "abre nuevo tab", me pasa exactamente lo mismo, me lo bloquea, probándolo en el Google Chrome, en el Firefox va bien ...

Vaya, eso si que es raro... el mismo fiddle probado en múltiples chromes de varias versiones funciona como esperaba: la petición asíncrona es bloqueada y la síncrona funciona correctamente

¿Es posible que tengas alguna extensión de Chrome que sea la que esta bloqueando? ¿Puedes volver a probarlo en "modo privado" para que no ejecute ninguna extensión?

Estoy pensando en la lógica ...

Vamos a ver, me dices que un window.open, desde un onclick de un enlace, no tendría problemas ¿no? ... Entonces ... ¿por qué un submit de un form si que los tiene?, al fin y al cabo ambos son clicks sobre dos elementos html, ambos pueden ser programados automáticamente para que se ejecuten y ambos, evidentemente, pueden ser ejecutados por acción directa de alguien ...

Prueba realizada: desde la función que se ejecuta el submit del form, ejecuto un enlace con un target=_blank, y en el href con un window.open ... , me sigue saliendo en mismo mensaje.

Si nadie da una solución me parece que lo que voy a tener que hacer, es poner en la "ayuda" de la web un mensaje de "permita los pop-up de este sitio" ...

Si por modo privado quieres decir de incógnito tampoco funciona.

Lo de las extensiones ya lo había pensado. Ahora las he deshabilitado, tenía 2: Google Docs y NetBeans Connector ... tampoco.

Curiosidad:

El ejemplo que me has pasado "funciona", me explico si hago click en "abre nuevo tab" me sale el mensaje de bloqueo, pero si hago doble click, me dirige a la página de todoexpertos ...

Respecto a mi código: resulta que se puede hacer lo mismo en distintas partes del código, realizando pruebas ahora, resulta que por dónde lo estaba haciendo (mediante un enlace) no funciona, pero en otro sitio que es mediante un button si que funciona ... curioso ...

Un botón de tipo submit dentro de un form no tiene exactamente el mismo comportamiento que un link para los navegadores.

De hecho es cada día más importante que el markup de tu página sea lo más semántico posible, es decir, usar button cuando se haga una acción al ser pulsado y usar un link cuando se navegue al ser pulsado (otra cosa es que quieras que tenga un aspecto u otro, pero eso ya lo solucionas con css).

Sobre el evento "submit" de un form, no es uno de los eventos que los navegadores consideren como "de cliente" ya que existen multiples modos de que se lance sin necesidad de la intervención de un usuario.

Imaginando un poco como tienes montando el formulario intentaría hacer algo parecido a lo que te puse en el ejemplo: un botón dentro del form que en onclick lance un post ajax síncrono desde javascript contra tu página php y en el callback haces el window. Open.

Gracias por el interés mostrado.

Hoy lo he terminado de solucionar, de distinta manera a como me has comentado. Me diste la clave ... me dijiste que seguro que era por un callback que había hecho, esto es una llamada "externa" a un fichero php. Bueno pues lo he hecho al revés.

¿Cómo lo hacía?. Llamaba a una funcion mediante un enlace, esto cargaba en un div el resultado de una ejecución de un php y desde ese div, se ejecutaba un input de un form, que hacía un target=_blank y es aquí donde Google Chrome lo detectaba como pop-up y lo bloqueaba.

¿Como lo hago ahora?. Llamo igualmenet a la función mediante el enlace, en esa función relleno y ejecuto el input de un form (con menos información que antes, ya que no tengo el resultado de la consulta, sino que mediante el form ahora solo paso los parámetros para lanzar la consulta) haciendo un target=_blank (ahora si que funciona ya que es interno, no es desde otro php sino desde el mismo). Al abrirse la nueva ventana, ejecuto la consulta y relleno la información en pantalla, y ahora para ejecutar la consulta definitiva vuelvo a lanzar el form con la información que ya tengo en pantalla, pero en vez de hacer un target=_blank que haría que me saliera otra vez el bloqueo, lo que hago es un target=_self, por lo que no requiere abrir una nueva pestaña/ventana y por lo tanto no realiza el bloqueo, y a partir de ahí ya visualizo la información tal como quiero ...

Así explicado puede parecer un poco farragoso, pero contando los pasos que hago ahora y los que hacía antes, con estas modificaciones hago menos pasos, por lo que se puede decir que he salido ganando gracias a Google Chrome.

Saludos y gracias.

Me alegro de que al final te haya valido de algo toda esta conversación :)

La verdad es que es tipo de problemas que solo van asociados a un navegador/versión son complicados de solucionar y nunca das con una solución de por vida pero al menos ahora ya lo tienes solucionado y has refactorizado código que eso siempre es bueno, je je.

Saludos y si necesitas cualquier otra cosa me comentas

La pregunta no admite más respuestas

Más respuestas relacionadas