Wie rufe ich eine JavaScript-Funktion von PHP aus auf?

200

Wie rufe ich eine JavaScript-Funktion von PHP aus auf?

<?php

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

Der folgende Code stammt aus xyz.html (bei einem Klick auf eine Schaltfläche) und ruft a wait()in einer externen xyz.js auf . Dies wait()ruft wait.php auf.

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;
  }
}

und wait.php

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

Dabei wird loadxml()Code aus einer anderen PHP-Datei auf die gleiche Weise aufgerufen.

Das loadxml()funktioniert sonst gut, aber es wird nicht so genannt, wie ich es will.

Zeeshan Rang
quelle
1
Auch mein Javascript und PHP sind extern.
Zeeshan Rang

Antworten:

361

In Bezug auf PHP (oder wirklich einen Webserver im Allgemeinen) ist eine HTML-Seite nichts komplizierter als eine große Zeichenfolge.

All die ausgefallene Arbeit, die Sie mit einer Sprache wie PHP machen können - Lesen aus Datenbanken und Webdiensten und all das - das ultimative Endziel ist genau das gleiche Grundprinzip: Generieren Sie eine HTML-Zeichenfolge *.

Ihre große HTML-Zeichenfolge wird erst dann zu etwas Besonderem, wenn sie von einem Webbrowser geladen wird. Sobald ein Browser lädt die Seite, dann alle anderen Magie passiert - Layout, Boxmodell Sachen, DOM Generation, und viele andere Dinge, darunter die Ausführung von JavaScript.

Sie rufen also nicht "JavaScript aus PHP auf", sondern "fügen Ihrer Ausgabe einen JavaScript-Funktionsaufruf hinzu".

Es gibt viele Möglichkeiten, dies zu tun, aber hier sind ein paar.

Verwenden Sie nur PHP:

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

Flucht aus dem PHP-Modus in den direkten Ausgabemodus:

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

Sie müssen keinen Funktionsnamen oder ähnliches zurückgeben. Hören Sie zunächst auf, AJAX-Anfragen von Hand zu schreiben. Du machst es dir nur schwer. Holen Sie sich jQuery oder eines der anderen hervorragenden Frameworks.

Zweitens sollten Sie verstehen, dass Sie bereits Javascript-Code ausführen werden, sobald die Antwort vom AJAX-Aufruf empfangen wurde.

Hier ist ein Beispiel dafür, was Sie mit jQuerys AJAX machen

$.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
}

Wenn Sie nicht mehr in der Lage sind, einen Funktionsnamen von PHP an den AJAX-Aufruf zurückzusenden, können Sie dies auch tun.

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

* Oder JSON oder XML usw.

Peter Bailey
quelle
2
Natürlich gibt es auch die Möglichkeit, eine externe Javascript-Datei zu verknüpfen, die den Aufruf selbst ausführt ... Auf diese Weise behalten Sie JavaScript im JavaScript-Code, wo es hingehört. =)
PatrikAkerstrand
das funktioniert nicht. Ich habe beide ausprobiert. Das Folgende meines Programms ist, dass es von .html (beim Klicken auf die Schaltfläche) zu einer externen .js-Funktion geht, die eine PHP-Datei lädt (unter Verwendung von xmlhttp = GetXmlHttpObject (); var url = "phpwithmysqlwait.php"; xmlhttp.onreadystatechange = statechanged ; xmlhttp.open ("GET", url, true); xmlhttp.send (null);) und mein PHP-Aufruf <? php echo "<script> loadxml (); </ script>"; ?> wo loadxml ein anderes PHP auf die gleiche Weise aufruft. Die loadxml () funktioniert ansonsten einwandfrei, wird aber nicht so aufgerufen, wie ich es möchte. Können Sie bitte etwas vorschlagen
Zeeshan Rang
9
Dieser Typ hat einfach alles, was ich bisher gemacht habe, so klar gemacht.
Kacy
4
@PeterBailey Die meisten Leute beleidigen normalerweise die Person für diese Anfrage und belassen es dabei. Sie haben mir wirklich konstruktive Hilfe gegeben. Also danke :)
Gideon Sassoon
2
@NilsSens Danke für deine Frage. Sie verstehen hier immer noch etwas Grundlegendes falsch. PHP und clientseitiges Javascript interagieren nicht direkt miteinander. HTTP ist immer in der Mitte. Auch bei Ajax-Anfragen ist dies der Fall. Um noch einmal zu wiederholen, was ich vor über 7 Jahren in meiner ursprünglichen Antwort geschrieben habe: Wenn PHP als Webanwendungsserver fungiert, generiert es lediglich eine HTML-Zeichenfolge, die möglicherweise Javascript enthält oder nicht.
Peter Bailey
86

Ich benutze immer nur echo "<script> function(); </script>";oder ähnliches. Sie rufen die Funktion in PHP technisch nicht auf, aber dies ist so nah wie möglich.

GSto
quelle
13
Stellen Sie einfach sicher, dass die Javascript-Funktion vor dem Echo-Skript steht, da sie sonst nicht aufgerufen werden kann.
Nurp
Können wir die Ausgabe von echoin eine Variable in zurückgeben PHP?
Alper
52

Ab sofort (Februar 2012) gibt es dafür eine neue Funktion. Überprüfen Sie hier

Codebeispiel (aus dem Internet entnommen):

<?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
quelle
Dies passt möglicherweise nicht genau zum Anwendungsfall der ursprünglichen Frage, aber nach dem Fragentitel sollte diese Antwort viel mehr Stimmen haben.
Chris Schmitz
4
Beachten Sie jedoch, dass hierfür die V8Js-Erweiterung für Ihre PHP-Installation installiert werden muss.
Velojet
11

Das kannst du nicht. Sie können eine JS-Funktion aus HTML aufrufen, das von PHP ausgegeben wird, aber das ist eine ganz andere Sache.

Matthew Flaschen
quelle
Nun, ich kann eine JS-Funktion wie diese aufrufen: echo "<td onClick = loadxml ()> <i> Für Details klicken </ i> </ td>"; .... aber ich möchte jetzt nichts anklicken . Ich möchte nur, dass mein PHP bei jedem Ereignis eine JS-Funktion aufruft.
Zeeshan Rang
2
In diesem Beispiel wird ein Klickereignis in HTML verwendet, nicht in PHP. JavaScript ist clientseitig und PHP ist serverseitig. Sie können JavaScript nicht direkt mit PHP aufrufen.
MrChrister
7

Das ist doch nicht möglich. PHP ist eine serverseitige Sprache und eine JavaScript-Client-Seite und sie wissen nicht wirklich viel voneinander. Sie benötigen einen serverseitigen JavaScript-Interpreter (wie Aptanas Jaxer). Vielleicht möchten Sie tatsächlich eine Ajax-ähnliche Architektur verwenden (die JavaScript-Funktion ruft das PHP-Skript asynchron auf und macht etwas mit dem Ergebnis).

<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
quelle
7

Wenn Sie es für eine spätere Ausführung wiedergeben möchten, ist es in Ordnung

Wenn Sie JS ausführen und die Ergebnisse in PHP verwenden möchten, verwenden Sie 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"); }');

Sie können hier für weitere Referenz verweisen: Was sind Erweiterungen in PHP v8js?

Wenn Sie HTML & JS ausführen und die Ausgabe in PHP verwenden möchten, ist http://htmlunit.sourceforge.net/ Ihre Lösung

Pian0_M4n
quelle
3

PHP läuft auf dem Server. JavaScript wird im Client ausgeführt. PHP kann also keine JavaScript-Funktion aufrufen.

Daniel Moura
quelle
11
Genau genommen stimmt das nicht. Es gibt auch serverseitiges JavaScript, und theoretisch könnten sowohl PHP als auch JavaScript auf einem Server ausgeführt werden und sich gegenseitig aufrufen. In der Praxis ist dies natürlich ein sehr unwahrscheinliches Szenario.
Michael Borgwardt
2

Sie können dieses auch versuchen: -

    public function PHPFunction()
    {
            echo '<script type="text/javascript">
                 test();
            </script>'; 
    }
    <script type="text/javascript">
    public function test()
    {
        alert('In test Function');
    }
    </script>
umesh
quelle
-1, da dies nicht funktioniert. Sie rufen diese Hubfunktionen in zwei separaten Blöcken auf und definieren sie. Lesen Sie dies und das
Siraj Alam
2

versuche es so

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

Möglicherweise können Sie dies nicht direkt tun, aber die Xajax- Bibliothek ist ziemlich nah an dem, was Sie wollen. Ich werde mit einem Beispiel demonstrieren. Hier ist eine Schaltfläche auf einer Webseite:

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

Unsere intuitive Vermutung wäre, dass xajax_addCity()es sich um eine Javascript-Funktion handelt, oder? Nun, richtig und falsch. Das Coole, was Xajax erlaubt, ist, dass wir keine JS-Funktion haben xajax_addCity(), aber was wir haben, ist eine PHP-Funktion namens addCity(), die alles kann, was PHP macht!

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

Denken Sie eine Minute darüber nach. Wir rufen praktisch eine PHP-Funktion aus Javascript-Code auf! Dieses stark vereinfachte Beispiel diente nur dazu, den Appetit anzuregen. Eine bessere Erklärung finden Sie auf der Xajax-Website. Viel Spaß!

Hamman Samuel
quelle