【问题标题】:Execute javascript function from a PHP function从 PHP 函数执行 javascript 函数
【发布时间】:2011-07-18 07:52:36
【问题描述】:

如果存在 PHP 会话,我正在尝试找到执行 javascript 函数的最佳和更简洁的方法。

js-script.js

  • 包含 javascript 函数 -> function doStuff(){ //do stuff }

index.php

  • 包含js文件->在头
  • 包含检查 $_SESSION 的 PHP 类 -> 包含在 DOCTYPE 之前

请让我知道(我正在使用 PHP、javascript、jQuery)。

  1. 如果 $_SESSION 存在,执行 js 脚本的最佳方式是什么?
  2. 如果 $_SESSION 被销毁,停止 js 脚本的最佳方法是什么?

谢谢,

格雷格

【问题讨论】:

  • 您必须有一些方法让客户端 Javascript 查询服务器端 PHP 脚本。否则 Javascript 无法知道会话的当前状态。请记住,JS 在客户端浏览器上执行,而 PHP 在服务器上执行。

标签: php javascript jquery session


【解决方案1】:
<head>
  <? if (session_is_registered('foo')) echo '<script>doStuff();</script>'; ?>
  ...
</head>

无法跨越服务器/客户端边界,因此最好的情况是在页面上转储一些内容,使客户端排队以触发 javascript 函数。

或者,您可以拥有类似 session_verify.php 的内容,可以在 AJAX 调用中引用,然后根据收到的响应“继续执行”/“停止”。

伪代码:

if (ajax_response_from_session_verify() == still_logged_in){
  execute doSomething();
else
  stop doSomething();

但请记住,对会话检查文件的调用可能会延长会话,具体取决于您使用它的方式。 (我不确定是否需要)

【讨论】:

  • 我会准确地说出布拉德在这里所说的。如果这没有帮助,请让我们具体知道您想要做什么,我们也许可以提供更多帮助?
  • 布拉德给出的第一个选项实际上就是我这样做的方式。我想没有更优雅的方式。现在会话已经开始并且 JS 被执行,如果会话被破坏(用户在点击链接时注销),删除 JS 的最佳方法是什么?我想刷新浏览器 -> 使用 PHP 标头或 HTML 元刷新。
  • @Greg:这完全取决于您如何进行此设置。根据您的措辞,我假设注销是基于 AJAX 的请求。因此,如果您对脚本进行了足够模块化的编码,则可以得到答复,即执行/取消绑定它需要的任何内容(基本上执行本地清理)。如果不是 AJAX(或作为一般规则),页面刷新可能需要最少的工作量。
【解决方案2】:

你有两个选择。

  1. 将函数放在单独的 is 文件中,并且仅在设置会话时才包含它。
  2. 将 JS 文件作为 PHP 文件提供。这将允许您在 JS 文件中运行 PHP 命令。只需确保您的内容类型正常。

【讨论】:

    【解决方案3】:
    if(session is OK) {
        $script = "doStuff();";
    }
    

    然后,在你的 HTML 头中:

    <head>
    ...
    <script type="text/javascript">
    document.ready(function() {
    <?php echo $script; ?>
    });
    </script>
    ...
    </head>
    

    【讨论】:

      【解决方案4】:

      Brad 是正确的,您需要使用 PHP 来输出到页面,因为您不能直接从服务器调用 JS。

      写出脚本标签的另一种方法是通过 PHP 在 HTML 中放置一个标志,然后使用 JavaScript 读取该标志。例如,你正在使用 jQuery,你可以这样做:

      <div id="sessionExists><?php if (isset($_SESSION['foo'])) echo 'true';?></div>
      

      在你的 jQuery 中:

      var session = ($('#sessionExists').text() === 'true'))? true : false;
      

      现在您有一个 JS 变量,其中包含“sessionExists”的布尔值,您可以在 JS 脚本中查询并采取相应措施。

      【讨论】: