Comment appeler une fonction JavaScript depuis PHP?

203

Comment appeler une fonction JavaScript depuis PHP?

<?php

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

Le code suivant provient de xyz.html (sur un clic de bouton), il appelle un wait()dans un xyz.js externe . Cela wait()appelle 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;
  }
}

et wait.php

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

loadxml()appelle le code d'un autre fichier PHP de la même manière.

Le loadxml()fonctionne très bien par ailleurs, mais ce n'est pas appelé la façon dont je le veux.

Zeeshan Rang
la source
1
Aussi mon javascript et mon php sont externes.
Zeeshan Rang

Réponses:

362

En ce qui concerne PHP (ou vraiment, un serveur web en général), une page HTML n'est rien de plus compliqué qu'une grosse chaîne.

Tout le travail de fantaisie que vous pouvez faire avec un langage comme PHP - lecture à partir de bases de données et de services Web et tout cela - l'objectif final ultime est exactement le même principe de base: générer une chaîne de code HTML *.

Votre grosse chaîne HTML ne devient rien de plus spécial que cela jusqu'à ce qu'elle soit chargée par un navigateur Web. Une fois qu'un navigateur charge la page, puis tous les autres - la magie se produit mise en page, substance de modèle de boîte, génération DOM, et bien d' autres choses, y compris l' exécution de JavaScript.

Ainsi, vous "n'appelez pas JavaScript depuis PHP", vous "incluez un appel de fonction JavaScript dans votre sortie".

Il existe de nombreuses façons de procéder, mais en voici quelques-unes.

En utilisant uniquement PHP:

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

Passer du mode php au mode de sortie directe:

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

Vous n'avez pas besoin de retourner un nom de fonction ou quelque chose comme ça. Tout d'abord, arrêtez d'écrire les demandes AJAX à la main. Vous ne faites que vous compliquer la vie. Obtenez jQuery ou l'un des autres excellents cadres disponibles.

Deuxièmement, comprenez que vous allez déjà exécuter du code javascript une fois la réponse reçue de l'appel AJAX.

Voici un exemple de ce que je pense que vous faites avec 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
}

Maintenant, si vous êtes déterminé à envoyer un nom de fonction de PHP à l'appel AJAX, vous pouvez également le faire.

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

* Ou JSON ou XML etc.

Peter Bailey
la source
2
Il y a bien sûr aussi la possibilité de lier dans un fichier javascript externe qui fait l'appel lui-même ... De cette façon, vous gardez JavaScript là où il appartient, dans le code JavaScript. =)
PatrikAkerstrand
cela ne fonctionne pas. j'ai essayé les deux. la suite de mon programme est, à partir de .html (sur le bouton), il va à une fonction externe .js qui charge un fichier php (en utilisant xmlhttp = GetXmlHttpObject (); var url = "phpwithmysqlwait.php"; xmlhttp.onreadystatechange = statechanged ; xmlhttp.open ("GET", url, true); xmlhttp.send (null);) et mon appel php <? php echo "<script> loadxml (); </script>"; ?> où loadxml appelle un autre php de la même manière. Le loadxml () fonctionne bien sinon, mais il n'est pas appelé comme je le veux. pouvez-vous suggérer quelque chose
Zeeshan Rang
9
Ce type vient de rendre tout ce que je faisais si clair.
Kacy
4
@PeterBailey La plupart des gens insultent généralement la personne pour avoir fait cette enquête et en restent là. Vous m'avez en fait donné une aide vraiment constructive. alors merci :)
Gideon Sassoon
2
@NilsSens Merci pour votre question. Vous comprenez toujours mal quelque chose de fondamental ici. PHP et javascript côté client n'interagissent pas directement entre eux. HTTP est toujours au milieu. Même avec les demandes Ajax, c'est le cas. Pour réitérer ce que j'ai écrit il y a plus de 7 ans dans ma réponse d'origine: lorsque je fonctionne en tant que serveur d'applications Web, tout ce que PHP fait est de générer une chaîne de code HTML, qui peut ou non inclure du javascript.
Peter Bailey du
86

J'utilise toujours juste echo "<script> function(); </script>";ou quelque chose de similaire. vous n'appelez pas techniquement la fonction en PHP, mais c'est aussi proche que possible.

GSto
la source
13
Assurez-vous simplement de placer la fonction javascript avant le script en écho, sinon elle ne peut pas être appelée.
Nurp
Pouvons-nous retourner la sortie de echodans une variable dans PHP?
alper
52

À l'heure actuelle (février 2012), il existe une nouvelle fonctionnalité pour cela. Vérifiez ici

Échantillon de code (tiré du 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
la source
Cela peut ne pas correspondre exactement au cas d'utilisation de la question d'origine, mais selon le titre de la question, cette réponse devrait avoir beaucoup plus de votes.
Chris Schmitz
4
Sachez simplement que cela nécessite d'installer l'extension V8Js dans votre installation PHP.
Velojet
11

Tu ne peux pas. Vous pouvez appeler une fonction JS à partir du code HTML édité par PHP, mais c'est une toute autre chose.

Matthew Flaschen
la source
eh bien je suis capable d'appeler une fonction JS comme celle-ci: echo "<td onClick = loadxml ()> <i> Cliquez pour plus de détails </i> </td>"; .... mais je ne veux rien cliquer maintenant . je veux juste que mon php appelle une fonction JS avec n'importe quel événement.
Zeeshan Rang
2
Cet exemple utilise un événement de clic en HTML, pas php. JavaScript est côté client et php est côté serveur. Vous ne pouvez pas appeler directement JavaScript avec PHP.
MrChrister
7

Ce n'est pas possible. PHP est un langage côté serveur et côté client JavaScript et ils ne se connaissent pas vraiment. Vous auriez besoin d'un interpréteur JavaScript côté serveur (comme Aptanas Jaxer). Peut-être que ce que vous voulez réellement faire est d'utiliser une architecture comme Ajax (la fonction JavaScript appelle le script PHP de manière asynchrone et fait quelque chose avec le résultat).

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

Si vous voulez l'écho pour une exécution ultérieure, c'est ok

Si vous voulez exécuter le JS et utiliser les résultats en PHP, utilisez 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"); }');

Vous pouvez vous référer ici pour plus de référence: Que sont les extensions dans php v8js?

Si vous souhaitez exécuter HTML et JS et utiliser la sortie en PHP http://htmlunit.sourceforge.net/ est votre solution

Pian0_M4n
la source
3

PHP s'exécute sur le serveur. JavaScript s'exécute dans le client. Donc php ne peut pas appeler une fonction JavaScript.

Daniel Moura
la source
11
Strictement parlant, ce n'est pas vrai. Il existe également du JavaScript côté serveur et vous pourriez théoriquement avoir à la fois PHP et JavaScript s'exécutant sur un serveur et s'appelant. En pratique, c'est ou bien sûr un scénario très improbable.
Michael Borgwardt
2

vous pouvez également essayer celui-ci: -

    public function PHPFunction()
    {
            echo '<script type="text/javascript">
                 test();
            </script>'; 
    }
    <script type="text/javascript">
    public function test()
    {
        alert('In test Function');
    }
    </script>
umesh
la source
-1 car cela ne fonctionnera pas. Vous appelez et définissez ces fonctions de levage dans deux blocs distincts. Lisez ceci et cela
Siraj Alam
2

essayez comme ça

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

Vous ne pourrez peut-être pas le faire directement, mais bibliothèque Xajax est assez proche de ce que vous voulez. Je vais démontrer avec un exemple. Voici un bouton sur une page Web:

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

Notre supposition intuitive serait que xajax_addCity() c'est une fonction Javascript, non? Eh bien, bien et mal. Ce que Xajax permet, c'est que nous n'avons aucune fonction JS appelée xajax_addCity(), mais ce que nous avons, c'est une fonction PHP appelée addCity()qui peut faire tout ce que PHP fait!

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

Pensez-y une minute. Nous invoquons virtuellement une fonction PHP à partir du code Javascript! Cet exemple trop simplifié était juste pour aiguiser l'appétit, une meilleure explication est sur le site Xajax, amusez-vous!

Hamman Samuel
la source