¿Cómo llamar a una función JavaScript desde PHP?

202

¿Cómo llamar a una función JavaScript desde PHP?

<?php

  jsfunction();
  // or
  echo(jsfunction());
  // or
  // Anything else?

El siguiente código es de xyz.html (al hacer clic en un botón) llama wait()a un xyz.js externo . Esto wait()llama a wait.php.

function wait() 
{
  xmlhttp=GetXmlHttpObject();
  var url="wait.php"; \
  xmlhttp.onreadystatechange=statechanged; 
  xmlhttp.open("GET", url, true); 
  xmlhttp.send(null);
} 

function statechanged()
{ 
  if(xmlhttp.readyState==4) {
       document.getElementById("txt").innerHTML=xmlhttp.responseText;
  }
}

y espera.php

<?php echo "<script> loadxml(); </script>"; 

donde loadxml()llama al código de otro archivo PHP de la misma manera.

De loadxml()lo contrario, funciona bien, pero no se llama como lo quiero.

Zeeshan Rang
fuente
1
También mi javascript y php son externos.
Zeeshan sonó el

Respuestas:

362

En lo que respecta a PHP (o realmente, un servidor web en general), una página HTML no es nada más complicado que una gran cadena.

Todo el trabajo sofisticado que puede hacer con un lenguaje como PHP, leer desde bases de datos y servicios web y todo eso, el objetivo final es el mismo principio básico: generar una cadena de HTML *.

Su gran cadena HTML no se convierte en nada más especial que eso hasta que la carga un navegador web. Una vez que un navegador carga la página, entonces pasa todo el otra magia - diseño, modelo de caja de cosas, la generación de DOM, y muchas otras cosas, incluyendo la ejecución de JavaScript.

Por lo tanto, no "llama a JavaScript desde PHP", "incluye una llamada de función de JavaScript en su salida".

Hay muchas maneras de hacer esto, pero aquí hay un par.

Usando solo PHP:

echo '<script type="text/javascript">',
     'jsfunction();',
     '</script>'
;

Escapar del modo php al modo de salida directa:

<?php
    // some php stuff
?>
<script type="text/javascript">
    jsFunction();
</script>

No necesita devolver el nombre de una función ni nada por el estilo. En primer lugar, deje de escribir solicitudes AJAX a mano. Solo te lo estás poniendo difícil. Obtenga jQuery o uno de los otros marcos excelentes que existen.

En segundo lugar, comprenda que ya va a ejecutar el código JavaScript una vez que se reciba la respuesta de la llamada AJAX.

Aquí hay un ejemplo de lo que creo que estás haciendo con AJAX de jQuery

$.get(
    'wait.php',
    {},
    function(returnedData) {
        document.getElementById("txt").innerHTML = returnedData;

        //  Ok, here's where you can call another function
        someOtherFunctionYouWantToCall();

        // But unless you really need to, you don't have to
        // We're already in the middle of a function execution
        // right here, so you might as well put your code here
    },
    'text'
);

function someOtherFunctionYouWantToCall() {
    // stuff
}

Ahora, si está decidido a enviar un nombre de función desde PHP a la llamada AJAX, también puede hacerlo.

$.get(
    'wait.php',
    {},
    function(returnedData) {
        // Assumes returnedData has a javascript function name
        window[returnedData]();
    },
    'text'
);

* O JSON o XML, etc.

Peter Bailey
fuente
2
Por supuesto, también existe la opción de vincular en un archivo javascript externo que hace la llamada en sí ... De esa manera, mantienes JavaScript donde pertenece, en el código JavaScript. =)
PatrikAkerstrand
esto no está funcionando. Los probé a los dos. El seguimiento de mi programa es que, desde .html (al hacer clic en el botón) va a una función externa .js que carga un archivo php (usando xmlhttp = GetXmlHttpObject (); var url = "phpwithmysqlwait.php"; xmlhttp.onreadystatechange = statechanged ; xmlhttp.open ("GET", url, true); xmlhttp.send (null);) y mi llamada php <? php echo "<script> loadxml (); </script>"; ?> donde loadxml llama a otro php de la misma manera. El loadxml () funciona bien de lo contrario, pero no se llama de la manera que lo quiero. ¿podría sugerirme algo
Zeeshan sonó el
9
Este tipo acaba de aclarar todo lo que he estado haciendo hasta ahora.
Kacy
44
@PeterBailey La mayoría de las personas generalmente insultan a la persona por hacer esta consulta y la dejan así. En realidad me diste una ayuda realmente constructiva. así que gracias :)
Gideon Sassoon
2
@NilsSens Gracias por tu pregunta. Todavía no entiendes algo fundamental aquí. PHP y javascript del lado del cliente no interactúan entre sí directamente. HTTP siempre está en el medio. Incluso con solicitudes de Ajax ese es el caso. Para reiterar lo que escribí ahora hace más de 7 años en mi respuesta original: cuando funciona como un servidor de aplicaciones web, todo lo que PHP está haciendo es generar una cadena de HTML, que puede incluir o no JavaScript.
Peter Bailey
86

Siempre uso echo "<script> function(); </script>";o algo similar. técnicamente no estás llamando a la función en PHP, pero esto es lo más cercano que vas a llegar.

GSto
fuente
13
Solo asegúrese de colocar la función de JavaScript antes del script repetido, o no se puede llamar a él.
Nurp
¿Podemos devolver la salida de echoen una variable en PHP?
Alper
52

Por ahora (febrero de 2012) hay una nueva característica para esto. Mira aquí

Ejemplo de código (tomado de la web):

<?php

$v8 = new V8Js();

/* basic.js */
$JS = <<< EOT
len = print('Hello' + ' ' + 'World!' + "\\n");
len;
EOT;

try {
  var_dump($v8->executeString($JS, 'basic.js'));
} catch (V8JsException $e) {
  var_dump($e);
}

?>
bertzzie
fuente
Es posible que esto no se ajuste exactamente al caso de uso de la pregunta original, pero siguiendo el título de la pregunta, esta respuesta debería tener muchos más votos.
Chris Schmitz
44
Solo tenga en cuenta que esto requiere instalar la extensión V8Js en su instalación de PHP.
Velojet
11

No puedes Puede llamar a una función JS desde HTML generado por PHP, pero eso es otra cosa.

Matthew Flaschen
fuente
bueno, puedo llamar a una función JS como esta: echo "<td onClick = loadxml ()> <i> Haga clic para obtener detalles </i> </td>"; .... pero no quiero hacer clic en nada ahora . Solo quiero que mi php llame a una función JS con cualquier evento.
Zeeshan sonó el
2
Ese ejemplo es usar un evento click en HTML, no php. JavaScript es del lado del cliente y php es del lado del servidor. No puede llamar directamente a JavaScript con PHP.
MrChrister
7

Eso no es posible. PHP es un lenguaje del lado del servidor y del lado del cliente JavaScript y realmente no se conocen mucho el uno del otro. Necesitaría un intérprete de JavaScript del lado del servidor (como Aptanas Jaxer). Tal vez lo que realmente desea hacer es usar una arquitectura similar a Ajax (la función de JavaScript llama al script PHP de forma asincrónica y hace algo con el resultado).

<td onClick= loadxml()><i>Click for Details</i></td>

function loadxml()
{
    result = loadScriptWithAjax("/script.php?event=button_clicked");
    alert(result);
}

// script.php
<?php
    if($_GET['event'] == 'button_clicked')
        echo "\"You clicked a button\"";
?>
Narciso
fuente
7

Si quieres repetirlo para una ejecución posterior, está bien

Si desea ejecutar JS y usar los resultados en PHP, use V8JS

V8Js::registerExtension('say_hi', 'print("hey from extension! "); var said_hi=true;', array(), true);
$v8 = new V8Js();
$v8->executeString('print("hello from regular code!")', 'test.php');
$v8->executeString('if (said_hi) { print(" extension already said hi"); }');

Puede consultar aquí para obtener más información: ¿Qué son las extensiones en php v8js?

Si desea ejecutar HTML y JS y usar la salida en PHP http://htmlunit.sourceforge.net/ es su solución

Pian0_M4n
fuente
3

PHP se ejecuta en el servidor. JavaScript se ejecuta en el cliente. Entonces php no puede llamar a una función de JavaScript.

Daniel Moura
fuente
11
Estrictamente hablando, eso no es cierto. También hay JavaScript del lado del servidor y, en teoría, podría tener tanto PHP como JavaScript ejecutándose en un servidor y llamándose entre sí. En la práctica, es, por supuesto, un escenario muy poco probable.
Michael Borgwardt
2

puedes probar este también: -

    public function PHPFunction()
    {
            echo '<script type="text/javascript">
                 test();
            </script>'; 
    }
    <script type="text/javascript">
    public function test()
    {
        alert('In test Function');
    }
    </script>
umesh
fuente
-1 ya que esto no funcionará. Está llamando y definiendo estas funciones de elevación en dos bloques separados. Lea esto y esto
Siraj Alam
2

intenta así

<?php
 if(your condition){
     echo "<script> window.onload = function() {
     yourJavascriptFunction(param1, param2);
 }; </script>";
?>
Vivek ab
fuente
1

Es posible que no pueda hacer esto directamente, pero la biblioteca Xajax está bastante cerca de lo que desea. Lo demostraré con un ejemplo. Aquí hay un botón en una página web:

<button onclick="xajax_addCity();">Add New City</button> 

Nuestra suposición intuitiva sería que xajax_addCity()es una función de Javascript, ¿verdad? Bueno, correcto e incorrecto. Lo bueno que permite Xajax es que no tenemos ninguna función JS llamada xajax_addCity(), ¡pero lo que sí tenemos es una función PHP llamada addCity()que puede hacer lo que PHP hace!

<?php function addCity() { echo "Wow!"; } ?>

Piénsalo por un minuto. ¡Estamos prácticamente invocando una función PHP a partir del código Javascript! Ese ejemplo demasiado simplificado fue solo para abrir el apetito, una mejor explicación está en el sitio de Xajax, ¡diviértete!

Hamman Samuel
fuente