Як викликати функцію JavaScript від PHP?


202

Як викликати функцію JavaScript від PHP?

<?php

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

Наступний код з xyz.html (після натискання на кнопку) він називає wait()в зовнішньому xyz.js . Це wait()викликає 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;
  }
}

і почекай.php

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

де loadxml()викликає код з іншого файлу PHP таким же чином.

loadxml()Працює відмінно інакше, але це не називається так , як я хочу.


1
Також мій JavaScript і php є зовнішніми.
Зеешан Ренг

Відповіді:


362

Що стосується PHP (або насправді веб-сервера взагалі), HTML-сторінка не є більш складним, ніж велика рядок.

Всі фантазійні роботи, які ви можете виконати з такою мовою, як PHP, - читання з баз даних та веб-служб, і все це - кінцевою метою є саме той самий основний принцип: генерувати рядок HTML *.

Ваша велика HTML-рядка не стає нічого більш особливого, ніж ця, поки вона не завантажується веб-браузером. Після того, як браузер завантажує сторінку, тоді трапляються всі інші чари - макет, матеріали коробки, генерація DOM та багато інших речей, включаючи виконання JavaScript.

Отже, ви не "викликаєте JavaScript з PHP", ви "включаєте виклик функції JavaScript у свій вихід".

Є багато способів зробити це, але ось пара.

Використовуючи лише PHP:

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

Перехід з режиму php в режим прямого виходу:

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

Вам не потрібно повертати ім’я функції чи щось подібне. Перш за все, припиніть писати запити AJAX вручну. Ти лише ускладнюєш себе. Отримайте jQuery або один з інших відмінних кадрів там.

По-друге, розумійте, що ви вже збираєтесь виконувати код JavaScript, коли відповідь буде отримана від дзвінка AJAX.

Ось приклад того, що я думаю, що ти робиш з AJAX 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
}

Тепер, якщо ви готові відправити ім'я функції з PHP назад на виклик AJAX, ви можете зробити це теж.

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

* Або JSON або XML тощо


2
Звичайно, є також можливість підключення зовнішнього файлу JavaScript, який виконує сам дзвінок ... Таким чином, ви зберігаєте JavaScript там, де йому належить, у коді JavaScript. =)
PatrikAkerstrand

це не працює. я спробував обох. наступна робота моєї програми: з .html (при натисканні на кнопку) вона переходить до зовнішньої .js функції, яка завантажує файл php (використовуючи xmlhttp = GetXmlHttpObject (); var url = "phpwithmysqlwait.php"; xmlhttp.onreadystatechange = statechanged ; xmlhttp.open ("GET", url, true); xmlhttp.send (null);) і мій php виклик <? php echo "<script> loadxml (); </script>"; ?> де loadxml так само викликає інший php. В іншому випадку loadxml () працює нормально, але його не називають так, як мені хочеться. ви можете запропонувати щось
Зеешан Ранг,

9
Цей хлопець просто зробив все зрозумілим, що я робив до цього часу.
Касі

4
@PeterBailey Більшість людей, як правило, ображає людину за те, що вона робить це запит, і залишає це на цьому. Ви насправді надали мені справді конструктивну допомогу. тож дякую :)
Гедеон Сассон

2
@NilsSens Дякую за запитання. Ви все ще неправильно розумієте тут щось принципове. PHP та javascript на стороні клієнта не взаємодіють безпосередньо з іншими. HTTP завжди знаходиться посередині. Навіть із запитами Ajax це справа. Щоб повторити те, про що я писав понад 7 років тому, у своїй оригінальній відповіді: коли функціонує як сервер веб-додатків, все, що PHP робить, генерує рядок HTML, який може включати або не включати JavaScript.
Пітер Бейлі

86

Я завжди просто використовую echo "<script> function(); </script>";або щось подібне. ви технічно не викликаєте функцію в PHP, але це так близько, як ви збираєтеся отримати.


13
Просто переконайтеся, що розмістіть функцію javascript перед ехо-скриптом, інакше вона не може бути викликана.
Нурп

Чи можемо ми повернути висновок echoзмінної в PHP?
Alper

52

Наразі (лютий 2012 року) є нова функція для цього. Перевірте тут

Зразок коду (взято з Інтернету):

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

?>

Це може точно не відповідати оригінальному випадку використання запитання, але, переходячи до назви питання, ця відповідь повинна мати більше голосів.
Кріс Шмітц

4
Просто пам’ятайте, що для цього потрібна установка розширення V8Js до вашої установки PHP.
Велоет

11

Ви не можете. Ви можете викликати функцію JS з HTML, що виводиться PHP, але це ціла «інша річ».


добре, я можу викликати функцію JS, як це: echo "<td onClick = loadxml ()> <i> Клацніть для деталей </i> </td>"; .... але я не хочу нічого клацати зараз . Я просто хочу, щоб моя php викликала функцію JS з будь-якою подією.
Зеешан Ренг

2
У цьому прикладі використовується подія клацання в HTML, а не в PHP. JavaScript - це клієнт, а php - сервер. Ви не можете безпосередньо викликати JavaScript за допомогою PHP.
MrChrister

7

Це неможливо. PHP - це серверна мова та клієнтська сторона JavaScript, і вони насправді не знають багато про один одного. Вам знадобиться серверний перекладач JavaScript (наприклад, Aptanas Jaxer). Можливо, те, що ви насправді хочете зробити, - це використовувати Ajax на зразок архітектури (функція JavaScript викликає PHP-скрипт асинхронно і робить щось із результатом).

<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

Якщо ви хочете повторити це для подальшого виконання, це нормально

Якщо ви хочете виконати JS і використовувати результати в PHP, використовуйте 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"); }');

Ви можете звернутися сюди для подальшої довідки: Що таке розширення у php v8js?

Якщо ви хочете виконати HTML і JS і використовувати вихід у PHP http://htmlunit.sourceforge.net/ - це ваше рішення


3

PHP працює на сервері. JavaScript працює в клієнті. Отже, php не може викликати функцію JavaScript.


11
Строго кажучи, це неправда. Існує також JavaScript на стороні сервера, і теоретично ви могли б як PHP, так і JavaScript працювати на сервері і дзвонити один одному. На практиці це чи, звичайно, дуже малоймовірний сценарій.
Майкл Боргвардт

2

ви можете спробувати і цей:

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

-1 оскільки це не буде працювати. Ви викликаєте та визначаєте ці функції підйому в двох окремих блоках. Прочитайте це і це
Сірай Алам

2

спробуйте так

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

1

Ви, можливо, не зможете це зробити безпосередньо, але бібліотека Xajax досить близька до того, що ви хочете. Продемонструю на прикладі. Ось кнопка на веб-сторінці:

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

Нашою інтуїтивною здогадкою було б, що xajax_addCity()це функція Javascript, правда? Ну правильно і неправильно. Класна річ, яку дозволяє Xajax - це те, що у нас немає жодної JS-функції xajax_addCity(), але у нас є функція PHP, яка називається, addCity()що може робити все, що PHP робить!

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

Подумайте про це хвилину. Ми практично викликаємо функцію PHP з коду Javascript! Цей надто спрощений приклад полягав лише в тому, щоб розпалити апетит, краще пояснення - на сайті Xajax, весело!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.