如何从PHP调用JavaScript函数?


202

如何从PHP调用JavaScript函数?

<?php

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

以下代码来自xyz.html(单击按钮),它wait()在外部xyz.js中调用a 。这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是外部的。
Zeeshan Rang 2009年

Answers:


362

就PHP而言(或者实际上,通常是一个Web服务器),HTML页面只不过是一个大字符串而已。

您可以使用PHP之类的语言完成所有花哨的工作-从数据库和Web服务中读取信息以及所有这些-最终目的是完全相同的基本原理:生成HTML *字符串。

大的HTML字符串在通过网络浏览器加载之前不会变得比它更特别。一旦浏览器加载页面,然后所有其他的魔法发生-布局,盒模型的东西,DOM生成,并且很多其他的东西,包括JavaScript执行。

因此,您不必“从PHP调用JavaScript”,而应“在输出中包括JavaScript函数调用”。

有很多方法可以做到这一点,但是这里有几个。

仅使用PHP:

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

从php模式转为直接输出模式:

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

您无需返回函数名称或类似名称。首先,停止手动编写AJAX请求。您只会让自己受苦。获得jQuery或其他出色的框架之一。

其次,了解一旦收到AJAX调用的响应,您已经将要执行javascript代码。

这是我认为您正在使用jQuery的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等。


2
当然,也可以选择链接到一个外部javascript文件中,该文件可以自行调用...这样一来,您就可以将JavaScript保留在JavaScript代码中。=)
PatrikAkerstrand 2009年

这是行不通的。我尝试了两个。我的程序的操作是,从.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()可以正常工作,但是并没有以我想要的方式被调用。你能建议点什么吗
Zeeshan Rang

9
这个家伙让我到目前为止所做的一切都变得如此清晰。
凯西

4
@PeterBailey大多数人通常会侮辱要进行询问的人,然后留给那个人。您实际上给了我真正的建设性帮助。因此,谢谢您:)
Gideon Sassoon's

2
@NilsSens感谢您的问题。您仍然会误解这里的一些基本知识。PHP和客户端javascript不会直接相互交互。HTTP总是在中间。即使使用Ajax请求也是如此。重申我7年前在最初的回答中所写的内容:当充当Web应用程序服务器时,所有PHP所做的就是生成一串HTML,该HTML可能包含也可能不包含javascript。
彼得·贝利

86

我总是只使用 echo "<script> function(); </script>";或类似的东西。从技术上讲,您并不是在PHP中调用该函数,但这与您将要达到的目标非常接近。


13
只要确保将javascript函数放置在回显的脚本之前,否则就无法调用它。
Nurp

我们可以将echoin 的输出返回到变量PHP吗?
alper

52

目前(2012年2月)有一个新功能。在这里检查

代码示例(来自网络):

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

你不能 您可以从PHP 输出的HTML调用JS函数,但这完全是“别的”。


好吧,我能够调用这样的JS函数:echo“ <td onClick = loadxml()> <i> Click for Details </ i> </ td>”; ....但我现在不想单击任何东西。我只希望我的php在任何事件下调用JS函数。
Zeeshan Rang 2009年

2
该示例使用HTML中的click事件,而不是php。JavaScript是客户端,而php是服务器端。您不能直接使用PHP调用JavaScript。
MrChrister在2009年

7

那不可能。PHP是服务器端语言和JavaScript客户端,他们彼此之间并不真正了解很多。您将需要服务器端JavaScript解释器(例如Aptanas Jaxer)。也许您实际想要做的是使用像Ajax这样的Architecture(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并相互调用。在实践中,这或当然是极不可能的情况。
Michael Borgwardt 2009年

2

您也可以尝试以下方法:-

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

-1,因为这行不通。您正在两个单独的块中调用和定义这些提升功能。阅读以及此内容
Siraj Alam

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!"; } ?>

考虑一分钟。我们实际上是从Javascript代码调用PHP函数!过于简化的示例只是为了激发胃口,在Xajax网站上有一个更好的解释,玩得开心!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.