2009-06-25 35 views
162

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

<?php 

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

El código siguiente es de xyz.html (en un botón del ratón) que llama un wait() en una entidad ajena a xyz.js. Este 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 wait.php

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

donde el código loadxml() llamadas desde otro archivo PHP de la misma manera.

El loadxml() funciona bien, de lo contrario, pero no se lo está llamando como yo quiero.

+1

también mis Javascript y PHP son externos. –

Respuesta

305

En lo que se refiere a PHP (o en realidad, un servidor web en general), una página HTML no es más complicado que una cadena grande.

Todo el trabajo de lujo que puede hacer con lenguaje como PHP - leyendo de bases de datos y servicios web y todo eso - el objetivo final es exactamente el mismo principio básico: generar una cadena de HTML *.

Su cadena de HTML grande no se convierte en algo más especial que eso hasta que se carga por un navegador web. Una vez que un navegador carga la página, y luego ocurre todo el resto de la magia: diseño, elementos del modelo de caja, generación de DOM y muchas otras cosas, incluida la ejecución de JavaScript.

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

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

Utilizando sólo PHP:

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

Escapar de modo php para dirigir el modo de salida:

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

No es necesario devolver un nombre de función o algo por el estilo. En primer lugar, deje de escribir solicitudes AJAX a mano. Solo lo estás haciendo difícil para ti.Obtenga jQuery o uno de los otros excelentes frameworks que existen.

En segundo lugar, entienda que ya va a ejecutar el código javascript una vez que se recibe la respuesta de la llamada AJAX.

He aquí 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 do 
     // 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ás muerto establecido en el envío de un nombre de función de PHP de nuevo a la llamada AJAX, puede hacerlo eso también.

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

* o JSON o XML, etc.

+2

Por supuesto, también existe la opción de vincular en un archivo javascript externo que hace la llamada en sí ... De esta forma, mantendrá JavaScript en el lugar al que pertenece, en el código JavaScript. =) – PatrikAkerstrand

+0

esto no está funcionando. intenté a los dos. el seguimiento de mi programa es, desde .html (al hacer clic en el botón) va a una función .js externa que carga un archivo php (usando xmlhttp = GetXmlHttpObject(); var url = "phpwithmysqlwait.php"; \t xmlhttp.onreadystatechange = StateChanged; \t xmlhttp.open ("GET", url, true); \t xmlhttp.send (null);) y mi php llamada loadXML();?"; ?> donde loadxml llama a otro php de la misma manera. El loadxml() funciona bien de lo contrario, pero no se está llamando de la manera que yo quiero. puede sugerir algo –

+0

Actualice su pregunta original con esta información para que sea más fácil de leer. Puedo modificar mi respuesta para abordar estos detalles –

12

No puede. Puede llamar a una función JS desde HTML con salida por PHP, pero eso es algo completamente distinto.

+0

así soy capaz de llamar a una función JS como esta: echo " Haga clic para Detalles"; ....pero no quiero hacer clic ahora. Solo quiero que mi php llame a una función JS con cualquier evento. –

+2

Ese ejemplo es usar un evento de clic en HTML, no en php. JavaScript es del lado del cliente y php es del lado del servidor. No puede llamar directamente a JavaScript con PHP. – MrChrister

81

Siempre uso echo "<script> function(); </script>"; o algo similar. no estás técnicamente llamando a la función en PHP, pero esto está tan cerca como puedas.

+14

+1 por simplicidad. – tetris11

+10

Solo asegúrese de colocar la función javascript antes del script echoed, o no se puede invocar. – Nurp

3

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

+9

Estrictamente hablando, eso no es cierto. También hay JavaScript en el lado del servidor y teóricamente puedes ejecutar PHP y JavaScript en un servidor y llamar entre sí. En la práctica, es o por supuesto un escenario muy poco probable. –

6

Eso no es posible. PHP es un lado del servidor y el lado del cliente de JavaScript y realmente no saben mucho el uno del otro. Necesitará un intérprete de JavaScript del servidor (como Aptanas Jaxer). Tal vez lo que realmente quiere hacer es utilizar una arquitectura tipo Ajax (la función 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\""; 
?> 
42

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

Ejemplo de código (tomada 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); 
} 

?> 
+0

¡Hola, hola! Exactamente lo que necesitaba. – cen

+0

Esto puede no coincidir exactamente con el caso de uso de la pregunta original, pero siguiendo el título de la pregunta, esta respuesta debe tener más votos. –

+3

Solo tenga en cuenta que esto requiere la instalación de la extensión V8Js en su instalación de PHP. – Velojet

1

puede que no sea capaz de hacerlo directamente, pero la biblioteca Xajax es bastante cerca de lo que desea. Voy a demostrar con un ejemplo. Aquí hay un botón en una página web:

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

Nuestra conjetura intuitiva sería que xajax_addCity() es una función Javascript, ¿verdad? Bien, correcto e incorrecto Lo genial que Xajax permite 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énselo un momento. ¡Estamos virtualmente invocando una función de PHP a partir de código Javascript! Ese ejemplo simplificado fue solo para despertar el apetito, una mejor explicación está en el sitio de Xajax, ¡diviértanse!

2

puede probar esto también: -

public function PHPFunction() 
    { 
      echo '<script type="text/javascript"> 
       test(); 
      </script>'; 
    } 
    <script type="text/javascript"> 
    public function test() 
    { 
     alert('In test Function'); 
    } 
    </script> 
+0

-1 ya que esto no funcionará. Está llamando y definiendo estas funciones de elevación en dos bloques separados. Lea [this] (http://stackoverflow.com/questions/21807135/why-is-my-javascript-function-not-being-called-in-my-div) y [this] (http: // stackoverflow. com/questions/24438186/calling-javascript-function-from-php-not-working) – Siraj

4

Si quiere hacer eco a cabo para la ejecución posterior está bien

Si desea ejecutar la JS y utilizar los resultados en PHP utilizar 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"); }'); 

Se puede hacer referencia aquí para mayor referencia: What are Extensions in php v8js?

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

1

si desea llamar al método dentro eco de lo que tiene que encerrarlos en comillas simples:

function f() { 
     //code 
     alert("its calling from echo "); 
    } 

    echo "<td onclick='f();'>".Method calling."</td>"; 
0

tratan como esto

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