2009-06-25 4 views
162

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

<?php 

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

Следующий код из xyz.html (на нажатие кнопки) вызывается во внешнем xyz.js в wait(). Этот 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 являются внешними. –

ответ

305

Насколько касается 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 do 
     // 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

+0

это не работает. я попробовал их обоих. Следуя моей программе, с .html (при нажатии кнопки) она переходит к внешней .js-функции, которая загружает php-файл (используя xmlhttp = GetXmlHttpObject(); var url = "phpwithmysqlwait.php"; \t xmlhttp.onreadystatechange = StateChanged; \t xmlhttp.open ("GET", URL, правда); \t xmlhttp.send (нуль);) и мой PHP вызов loadxml();"; ?> где loadxml вызывает другой php одинаково. Loadxml() работает отлично в противном случае, но его не называют так, как я его хочу. можете ли вы предложить somthing –

+0

Обновите свой исходный вопрос с помощью этой информации, чтобы его было легче читать. Я могу изменить свой ответ, чтобы ответить на эти вопросы –

12

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

+0

хорошо я могу вызвать функцию JS следующим образом: echo " Нажмите для получения более подробной информации"; ....но я не хочу сейчас ничего нажимать. Я просто хочу, чтобы мой php вызывал функцию JS с любым событием. –

+2

Этот пример использует событие click в HTML, а не php. JavaScript - клиентская сторона, а php - серверная. Вы не можете напрямую вызывать JavaScript с PHP. – MrChrister

81

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

+14

+1 для простоты. – tetris11

+10

Просто убедитесь, что вы поместите функцию javascript _before_ в эхо-скрипт, или его нельзя вызвать. – Nurp

3

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

+9

Строго говоря, это неправда. Существует также серверный JavaScript, и теоретически вы можете иметь как PHP, так и JavaScript, запущенные на сервере и вызывающие друг друга. На практике это или очень маловероятный сценарий. –

6

Thats not possible. 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\""; 
?> 
42

Per сейчас (февраль 2012) есть новая функция для этого. Проверить here

образец кода (взятый из Интернета):

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

?> 
+0

Хорошо привет! Именно то, что мне нужно. – cen

+0

Это может не соответствовать истинному варианту использования оригинального вопроса, но, пройдя по названию вопроса, этот ответ должен иметь больше голосов. –

+3

Просто имейте в виду, что для этого требуется установка расширения V8Js для вашей установки PHP. – Velojet

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, повеселиться!

2

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

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

-1, поскольку это не сработает. Вы вызываете и определяете эти функции подъема в двух отдельных блоках. Прочитайте [this] (http://stackoverflow.com/questions/21807135/why-is-my-javascript-function-not-being-called-in-my-div) и [это] (http: // stackoverflow. ком/вопросы/24438186/вызывающей на JavaScript-функции из-PHP-не-работает) – Siraj

4

Если вы хотите, чтобы повторить его для последующего исполнения это нормально

Если вы хотите, чтобы выполнить 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"); }'); 

Вы можете сослаться здесь для справок: What are Extensions in php v8js?

Если вы хотите выполнить HTML & JS и использовать выход в PHP http://htmlunit.sourceforge.net/ ваше решение

1

, если вы хотите, чтобы вызвать метод внутри эхо вы должны заключить их в одинарные кавычки:

function f() { 
     //code 
     alert("its calling from echo "); 
    } 

    echo "<td onclick='f();'>".Method calling."</td>"; 
0

попробовать, как этот

<?php 
if(your condition){ 
    echo "<script> window.onload = function() { 
    yourJavascriptFunction(param1, param2); 
}; </script>"; 
?> 
Смежные вопросы