【问题标题】:How to call a JavaScript function from PHP?如何从 PHP 调用 JavaScript 函数?
【发布时间】:2010-11-05 23:03:37
【问题描述】:

如何从 PHP 中调用 JavaScript 函数?

<?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() 在其他方面工作正常,但它没有按我想要的方式调用。

【问题讨论】:

  • 我的javascript和php也是外部的。

标签: php javascript


【解决方案1】:

你不能。您可以通过 PHP 从 HTML 输出 调用 JS 函数,但那完全是“另一回事”。

【讨论】:

  • 好吧,我可以像这样调用 JS 函数:echo "Click for Details";....但我现在不想点击任何东西。我只想让我的 php 调用任何事件的 JS 函数。
  • 该示例在 HTML 中使用点击事件,而不是 php。 JavaScript 是客户端,php 是服务器端。不能用 PHP 直接调用 JavaScript。
【解决方案2】:

我总是只使用echo "&lt;script&gt; function(); &lt;/script&gt;"; 或类似的东西。从技术上讲,您并没有在 PHP 中调用该函数,但这与您将获得的一样接近。

【讨论】:

  • 请确保将javascript函数放在之前回显脚本,否则无法调用它。
  • 我们能否将echo 的输出返回到PHP 中的变量中?
  • @alper - 不。使用 AJAX 或 xhr 将数据发送回服务器,尽管它不会发送到那个 PHP 实例。
【解决方案3】:

PHP 在服务器中运行。 JavaScript 在客户端中运行。所以php不能调用JavaScript函数。

【讨论】:

  • 严格来说,这不是真的。还有服务器端 JavaScript,理论上你可以让 PHP 和 JavaScript 在服务器上运行并相互调用。在实践中,这当然是非常不可能的情况。
【解决方案4】:

那是不可能的。 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\"";
?>

【讨论】:

    【解决方案5】:

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

    您可以使用 PHP 之类的语言完成所有花哨的工作——从数据库和 Web 服务读取等等——最终的最终目标是完全相同的基本原则:生成 HTML* 字符串。

    在 Web 浏览器加载之前,您的大 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 等

    【讨论】:

    • 当然也可以选择链接到执行调用本身的外部 javascript 文件中......这样你就可以在 JavaScript 代码中将 JavaScript 保留在它所属的位置。 =)
    • 这不起作用。我尝试了他们两个。我的程序的后续是,从 .html(单击按钮)转到加载 php 文件的外部 .js 函数(使用 xmlhttp=GetXmlHttpObject();var url="phpwithmysqlwait.php"; xmlhttp.onreadystatechange=statechanged ; xmlhttp.open("GET", url, true); xmlhttp.send(null); ) 和我的 php 调用 loadxml(); "; ?> loadxml 以同样的方式调用另一个 php。否则 loadxml() 工作正常,但它没有按我想要的方式调用。你能推荐一些东西吗
    • 这家伙把我到现在为止所做的一切都说得很清楚了。
    • @PeterBailey 大多数人通常会侮辱进行此调查的人,然后将其留在那儿。你实际上给了我非常有建设性的帮助。所以谢谢你:)
    • @NilsSens 感谢您的提问。你在这里仍然误解了一些基本的东西。 PHP 和客户端 javascript 不直接相互交互。 HTTP 总是在中间。即使使用 Ajax 请求也是如此。重申一下我 7 年前在原始答案中写的内容:当作为 Web 应用程序服务器运行时,PHP 所做的只是生成一个 HTML 字符串,它可能包含也可能不包含 javascript。
    【解决方案6】:

    现在(2012 年 2 月)有一个新功能。检查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);
    }
    
    ?>
    

    【讨论】:

    • 这可能不完全符合原始问题的用例,但按照问题标题,这个答案应该有更多的选票。
    • 请注意,这需要将 V8Js 扩展安装到您的 PHP 安装中。
    【解决方案7】:

    您可能无法直接执行此操作,但 Xajax 库非常接近您想要的。我将用一个例子来演示。这是网页上的一个按钮:

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

    我们的直觉猜测是 xajax_addCity() 是一个 Javascript 函数,对吧?嗯,对与错。 Xajax 允许的很酷的事情是我们没有任何名为 xajax_addCity() 的 JS 函数,但我们拥有的是一个名为 addCity() 的 PHP 函数,它可以执行 PHP 所做的任何事情!

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

    想一想。我们实际上是从 Javascript 代码调用 PHP 函数! 那个过于简单的例子只是为了勾起食欲,更好的解释在 Xajax 网站上,玩得开心!

    【讨论】:

      【解决方案8】:

      你也可以试试这个:-

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

      【讨论】:

      • -1 因为这不起作用。您在两个单独的块中调用和定义这些提升函数。阅读thisthis
      【解决方案9】:

      如果你想回显它以供以后执行,没关系

      如果你想执行 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/ 是你的解决方案

      【讨论】:

        【解决方案10】:

        这样试试

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

        【讨论】:

          【解决方案11】:

          我不接受反对者的回答。

          如果你发现一些特殊的包让它工作,那么你可以自己做!所以,我不买那些答案。

          onClick 是一个涉及最终用户的杂项,因此不可接受。

          @umesh 很接近,但它不是一个独立的程序。这是这样的(改编自他的回答):

          <script type="text/javascript">
          function JSFunction() {
              alert('In test Function');   // This demonstrates that the function was called
          }
          </script>
          
          <?php
          // Call a JS function "from" php
          
          if (true) {   // This if() is to point out that you might
                        // want to call JSFunction conditionally
              // An echo like this is how you implant the 'call' in a way
              // that it will be invoked in the client.
              echo '<script type="text/javascript">
                   JSFunction();
              </script>';
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-11
            • 1970-01-01
            • 2020-03-16
            • 2012-06-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多