Come chiamare una funzione JavaScript da PHP?


202

Come chiamare una funzione JavaScript da PHP?

<?php

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

Il seguente codice proviene da xyz.html (facendo clic su un pulsante) chiama a wait()in un xyz.js esterno . Questo wait()chiama 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;
  }
}

e wait.php

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

dove loadxml()chiama il codice da un altro file PHP allo stesso modo.

La loadxml()sta lavorando bene altrimenti, ma non viene chiamato il modo in cui lo voglio.


1
Anche i miei javascript e php sono esterni.
Zeeshan suonò il

Risposte:


362

Per quanto riguarda PHP (o davvero, un web server in generale), una pagina HTML non è niente di più complicato di una grande stringa.

Tutto il fantastico lavoro che puoi fare con un linguaggio come PHP - leggere da database e servizi web e tutto il resto - l'obiettivo finale finale è lo stesso principio base esatto: generare una stringa di HTML *.

La tua grande stringa HTML non diventa nulla di più speciale fino a quando non viene caricata da un browser web. Una volta che un browser carica la pagina, si verificano tutte le altre magie: layout, elementi del modello a scatola, generazione DOM e molte altre cose, inclusa l'esecuzione di JavaScript.

Quindi, non "chiami JavaScript da PHP", "includi una chiamata di funzione JavaScript nel tuo output".

Ci sono molti modi per farlo, ma qui ce ne sono un paio.

Utilizzando solo PHP:

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

Passare dalla modalità php alla modalità di uscita diretta:

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

Non è necessario restituire un nome di funzione o qualcosa del genere. Prima di tutto, smetti di scrivere le richieste AJAX a mano. Stai solo rendendo duro con te stesso. Ottieni jQuery o uno degli altri eccellenti framework là fuori.

In secondo luogo, tieni presente che eseguirai già il codice javascript una volta ricevuta la risposta dalla chiamata AJAX.

Ecco un esempio di ciò che penso tu stia facendo con AJAX di 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
}

Ora, se sei pronto per inviare un nome di funzione da PHP alla chiamata AJAX, puoi farlo anche tu.

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

* O JSON o XML ecc.


2
Ovviamente c'è anche la possibilità di collegarsi in un file javascript esterno che esegue la chiamata stessa ... In questo modo mantieni JavaScript dove appartiene, nel codice JavaScript. =)
PatrikAkerstrand,

Questo non funziona. ho provato entrambi. il seguito del mio programma è, da .html (al clic del pulsante) si passa a una funzione .js esterna che carica un file php (usando xmlhttp = GetXmlHttpObject (); var url = "phpwithmysqlwait.php"; xmlhttp.onreadystatechange = statechanged ; xmlhttp.open ("GET", url, true); xmlhttp.send (null);) e la mia chiamata php <? php echo "<script> loadxml (); </script>"; ?> dove loadxml chiama un altro php allo stesso modo. Il loadxml () funziona bene altrimenti, ma non viene chiamato come lo voglio. puoi per favore suggerire qualcosa
Zeeshan Rang

9
Questo ragazzo ha appena chiarito tutto quello che ho fatto finora.
Kacy,

4
@PeterBailey La maggior parte delle persone di solito insulta la persona per aver fatto questa inchiesta e lasciarlo a quello. In realtà mi hai dato un aiuto davvero costruttivo. quindi grazie :)
Gideon Sassoon,

2
@NilsSens Grazie per la tua domanda. Hai ancora frainteso qualcosa di fondamentale qui. PHP e javascript lato client non interagiscono direttamente tra loro. HTTP è sempre nel mezzo. Anche con richieste Ajax è il caso. Per ribadire quanto ho scritto più di 7 anni fa nella mia risposta originale: quando funziona come un server di applicazioni web, tutto ciò che PHP sta facendo è generare una stringa di HTML, che può includere o meno javascript.
Peter Bailey,

86

Uso sempre echo "<script> function(); </script>";o qualcosa di simile. non stai tecnicamente chiamando la funzione in PHP, ma questo è il più vicino possibile.


13
Assicurati di posizionare la funzione javascript prima dello script echo, altrimenti non è possibile chiamarla.
Nurp,

Possiamo restituire l'output di echoin una variabile in PHP?
alper il

52

Per ora (febbraio 2012) c'è una nuova funzionalità per questo. Controlla qui

Esempio di codice (tratto dal 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);
}

?>

Questo potrebbe non corrispondere esattamente al caso d'uso della domanda originale, ma andando dal titolo della domanda questa risposta dovrebbe avere molti più voti.
Chris Schmitz,

4
Basta essere consapevoli del fatto che ciò richiede l'installazione dell'estensione V8Js sull'installazione di PHP.
Velojet,

11

Non puoi. Puoi chiamare una funzione JS dall'HTML emesso da PHP, ma è un'altra cosa.


bene sono in grado di chiamare una funzione JS come questa: echo "<td onClick = loadxml ()> <i> Fai clic per i dettagli </i> </td>"; .... ma non voglio fare clic su nulla ora . Voglio solo che il mio php chiami una funzione JS con qualsiasi evento.
Zeeshan suonò il

2
Quell'esempio sta usando un evento click in HTML, non php. JavaScript è lato client e php è lato server. Non puoi chiamare direttamente JavaScript con PHP.
MrChrister,

7

Non e possibile. PHP è una lingua lato server e lato client JavaScript e non si conoscono molto. Avresti bisogno di un interprete JavaScript lato server (come Aptanas Jaxer). Forse quello che vuoi davvero fare è usare un Ajax come Architecture (la funzione JavaScript chiama lo script PHP in modo asincrono e fa qualcosa con il risultato).

<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\"";
?>

7

Se vuoi echeggiarlo per un'esecuzione successiva, va bene

Se vuoi eseguire il JS e usare i risultati in PHP usa 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"); }');

Puoi fare riferimento qui per ulteriori riferimenti: Cosa sono le estensioni in php v8js?

Se si desidera eseguire HTML e JS e utilizzare l'output in PHP http://htmlunit.sourceforge.net/ è la soluzione


3

PHP viene eseguito nel server. JavaScript viene eseguito nel client. Quindi php non può chiamare una funzione JavaScript.


11
A rigor di termini, non è vero. C'è anche JavaScript sul lato server e in teoria si potrebbe avere sia PHP che JavaScript in esecuzione su un server e chiamarsi l'un l'altro. In pratica, è o ovviamente uno scenario molto improbabile.
Michael Borgwardt,

2

puoi provare anche questo: -

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

-1 poiché non funzionerà. Stai chiamando e definendo queste funzioni di sollevamento in due blocchi separati. Leggi questo e questo
Siraj Alam il

2

prova così

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

1

Potresti non essere in grado di farlo direttamente, ma la libreria Xajax è abbastanza vicina a ciò che desideri. Lo dimostrerò con un esempio. Ecco un pulsante in una pagina Web:

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

La nostra ipotesi intuitiva sarebbe che xajax_addCity()sia una funzione Javascript, giusto? Bene, giusto e sbagliato. La cosa interessante che Xajax consente è che non abbiamo alcuna funzione JS chiamata xajax_addCity(), ma ciò che abbiamo è una funzione PHP chiamata addCity()che può fare qualunque cosa PHP faccia!

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

Pensaci per un minuto. Stiamo praticamente invocando una funzione PHP dal codice Javascript! Quell'esempio troppo semplificato era solo per stimolare l'appetito, una spiegazione migliore è sul sito Xajax, divertiti!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.