Как вызвать функцию JavaScript из PHP?


203

Как вызвать функцию 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()противном случае он работает нормально, но его называют не так, как я хочу.


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в переменную in 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.
Velojet

11

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


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

2
В этом примере используется событие click в 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.