Как вызвать функцию JavaScript из PHP? - PullRequest
187 голосов
/ 25 июня 2009

Как вызвать функцию 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;
  }
}

и wait.php

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

где loadxml() аналогичным образом вызывает код из другого файла PHP.

В противном случае loadxml() работает нормально, но его называют не так, как я хочу.

Ответы [ 11 ]

340 голосов
/ 25 июня 2009

Что касается 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.

Вот пример того, что, по-моему, вы делаете с JJuery AJAX

$.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 и т. Д.

84 голосов
/ 25 июня 2009

Я всегда просто использую echo "<script> function(); </script>"; или что-то подобное. технически вы не вызываете функцию в PHP, но это настолько близко, насколько вы собираетесь получить.

46 голосов
/ 25 февраля 2012

В настоящее время (февраль 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);
}

?>
13 голосов
/ 25 июня 2009

Вы не можете. Вы можете вызывать функцию JS из HTML , выводимого PHP, но это совсем не так.

7 голосов
/ 16 октября 2013

Если вы хотите повторить его для последующего выполнения, все в порядке

Если вы хотите выполнить 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/ - это ваше решение

6 голосов
/ 25 июня 2009

Это невозможно. 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\"";
?>
3 голосов
/ 25 июня 2009

PHP работает на сервере. JavaScript работает в клиенте. Поэтому php не может вызвать функцию JavaScript.

2 голосов
/ 17 марта 2017

попробуй вот так

<?php
 if(your condition){
     echo "<script> window.onload = function() {
     yourJavascriptFunction(param1, param2);
 }; </script>";
?>
2 голосов
/ 19 марта 2013

Вы также можете попробовать это: -

    public function PHPFunction()
    {
            echo '<script type="text/javascript">
                 test();
            </script>'; 
    }
    <script type="text/javascript">
    public function test()
    {
        alert('In test Function');
    }
    </script>
1 голос
/ 13 июля 2012

Возможно, вы не сможете сделать это напрямую, но библиотека 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, получайте удовольствие!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...