¿Por qué mi controlador de eventos onclick en Javascript no funciona?

Actualmente tengo un botón cuando se hace clic en él, debería abrir una nueva ventana, pero recibo este error: Uncaught SyntaxError: Unexpected token :. estoy usando window.open()

$url = "http://www.google.com";
$button .= 
'<input type="button" value="Print Timetable" class="printButton" onclick="window.open('.$url.');"/>';

He notado que cuando uso window.open() sin parámetros funciona, pero cuando paso el $url variable todo el infierno se desata. Recibo errores de sintaxis. He intentado http://www.google.com, www.google.com y google.com en vano!

Gracias por su ayuda por adelantado!

preguntado el 03 de mayo de 12 a las 13:05

publique el HTML que obtiene en el navegador -

3 Respuestas

Porque le faltan las comillas simples necesarias para encapsular la cadena de URL.

$url = "http://www.google.com";
$button .= 
'<input type="button" value="Print Timetable" class="printButton" onclick="window.open(\''.$url.'\');"/>';

Está agregando una capa de encapsulación de cadenas. Cuando pasa un valor de cadena a una función, debe estar entre comillas, ya que es una cadena.

doSomething('http://www.ibm.com/');

Cuando está haciendo esto en línea en su html, necesita encapsular el javascript entre comillas dobles para que se convierta en

onclick="doSomething('http://www.ibm.com/');"; 

Luego, si desea que PHP repita eso, o lo asigne como variable, debe encerrar todo eso entre comillas, para que pueda hacer

<?php 
    //encapsulate in double quotes and escape double quotes
    echo " onclick=\"doSomething('http://www.ibm.com/');\" "; 

    //encapsulate in single quotes and escape single quotes
    echo ' onclick="doSomething(\'http://www.ibm.com/\'); '; 
 ?>  

De cualquier forma que lo desglose, necesita tener encapsulaciones de 3 cadenas incrustadas entre sí, por lo que debe encontrar una manera de diferenciar entre las comillas utilizadas en JS y las comillas utilizadas en PHP.

De lo contrario tendrías un problema.

<?php 

    //Houston We have a problem!
    echo " onclick="doSomething('http://www.ibm.com/');\" "; 
         ^         ^                                    ^ ^
 Open Quote       Close Quote                  Open Quote Close Quote 
 ?>  

contestado el 03 de mayo de 12 a las 14:05

Gracias esto funcionó :) Acabo de pasar 2 horas en esto. Los errores de sintaxis siempre me atrapan en el desarrollo web. ¡Maldición! Pero no entiendo por qué tengo que escapar. Supongo que porque es Javascript? Porque cuando escribo HTML en mis archivos PHP no tengo que escapar de nada, por ejemplo, $content = 'div class="'.$classname.'"> - Johnathan Au

@JohnathanAu - porque estás pasando un string de las personas acusadas injustamente llamadas window.open función. Inicialmente, lo que intentabas hacer era window.open(http://google.com), que estaba mal sin las comillas. - nómada web

Vea mi respuesta actualizada arriba. Resumen, si desea hacer eco de una cita en php, debe escapar de ella. echo "\""; los rendimientos " ... y echo '\''; los rendimientos '. La URL que está pasando es una cadena, por lo que necesita comillas en el nivel JS. - holandés432

Saludos compañero, eso fue fantástico. - Johnathan Au

Hay un par de cosas mal aquí:

Tiene un carácter de punto antes de los iguales, por ejemplo

$button .= 

Debieran ser

$button =

Y necesitas escapar de tus comillas simples:

$url = "http://www.google.com";
$button = '<input type="button" value="Print Timetable" class="printButton" onclick="window.open(''.$url.'');"/>';

contestado el 03 de mayo de 12 a las 14:05

Creo que se supone que es así:

$url = "http://www.google.com";
$button .= 
'<input type="button" value="Print Timetable" class="printButton" onclick="window.open("'.$url.'");"/>';

window.open() requiere comillas o comillas dobles

contestado el 03 de mayo de 12 a las 13:05

Esto tampoco funcionará ya que se utilizan comillas dobles para encapsular el texto de la función; tampoco puede usarlas para los argumentos de la función. - holandés432

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.