我在PHP中有一个变量,并且我的JavaScript代码中需要它的值.如何将变量从PHP转换为JavaScript?

我有这样的代码:

<?php
$val = $myService->getValue(); // Makes an API and database call

在同一页上,我有JavaScript代码,需要将$val变量的值作为参数传递:

<script>
    myPlugin.start($val); // I tried this, but it didn't work
    <?php myPlugin.start($val); ?> // This didn't work either
    myPlugin.start(<?=$val?>); // This works sometimes, but sometimes it fails
</script>

推荐答案

实际上有几种方法可以做到这一点.有些需要比其他人更多的开销,有些被认为比其他人更好.

没有特定顺序:

  1. 使用Ajax从服务器获取所需的数据.
  2. 将数据回送到页面的某个地方,并使用JavaScript从DOM获取信息.
  3. 将数据直接 echo 到JavaScript.

在本文中,我们将研究上述每种方法,并了解每种方法的优缺点,以及如何实现它们.

1. Use AJAX to get the data you need from the server

这种方法被认为是最好的,因为your server side and client side scripts are completely separate.

专业人士

  • 如果明天您不再使用php,并且想要转向servlet、睡觉API或其他服务,那么您不需要更改太多的JavaScript代码.
  • More readable-JavaScript是JavaScript,PHP是PHP.在不混合这两种语言的情况下,您可以获得两种语言的可读性更好的代码.
  • Allows for asynchronous data transfer-从PHP获取信息可能需要花费大量时间/资源.有时你只是不想等待信息,加载页面,让信息随时到达.
  • Data is not directly found on the markup-这意味着您的标记没有任何附加数据,只有JavaScript可以看到它.

缺点

  • Latency-AJAX创建一个HTTP请求,HTTP请求通过网络传输,并具有网络延迟.
  • State-通过单独的HTTP请求获取的数据不会包含获取HTML文档的HTTP请求中的任何信息.您可能需要这些信息(例如,如果HTML文档是为了响应表单提交而生成的),如果需要,则必须以某种方式将其传递给其他人.如果你已经排除了在页面中嵌入数据的可能性(如果你正在使用这种技术,你就可以嵌入数据),那么这就限制了你使用cookie/会话,这些cookie/会话可能会受到竞争条件的影响.

实施示例

使用Ajax,您需要两个页面,一个是PHP生成输出的地方,另一个是JavaScript获取输出的地方:

获取数据.php

/* Do some operation here, like talk to the database, the file-session
 * The world beyond, limbo, the city of shimmers, and Canada.
 *
 * AJAX generally uses strings, but you can output JSON, HTML and XML as well.
 * It all depends on the Content-type header that you send with your AJAX
 * request. */

echo json_encode(42); // In the end, you need to echo the result.
                      // All data should be json_encode()d.

                      // You can json_encode() any value in PHP, arrays, strings,
                      //even objects.

指数php(或实际页面的名称)

<!-- snip -->
<script>
    function reqListener () {
      console.log(this.responseText);
    }

    var oReq = new XMLHttpRequest(); // New request object
    oReq.onload = function() {
        // This is where you handle what to do with the response.
        // The actual data is found on this.responseText
        alert(this.responseText); // Will alert: 42
    };
    oReq.open("get", "获取数据.php", true);
    //                               ^ Don't block the rest of the execution.
    //                                 Don't wait until the request finishes to
    //                                 continue.
    oReq.send();
</script>
<!-- snip -->

当文件加载完成时,上述两个文件的组合将向42发出alert .

再来点阅读material

  • 100
  • 100
  • 100

2. Echo the data into the page somewhere, and use JavaScript to get the information from the DOM

这种方法不如AJAX好,但它仍然有它的优点.从某种意义上说,PHP和JavaScript之间仍然有relatively个分隔,JavaScript中没有直接的PHP.

专业人士

  • Fast-DOM操作通常很快,可以相对快速地存储和访问大量数据.

缺点

  • Potentially Unsemantic Markup-通常情况下,你会使用某种类型的<input type=hidden>来存储信息,因为从inputNode.value中获取信息更容易,但这样做意味着你的HTML中有一个无意义的元素.HTML有<meta>个元素来表示文档的数据,HTML5为数据引入了data-*个属性,这些属性专门用于使用JavaScript阅读,可以与特定元素关联.
  • Dirties up the Source——PHP生成的数据直接输出到HTML源,这意味着你得到了一个更大、更不集中的HTML源.
  • Harder to get structured data- struct 化数据必须是有效的HTML,否则您必须自己转义和转换字符串.
  • Tightly couples PHP to your data logic-因为在演示中使用了PHP,所以不能将两者完全分开.

实施示例

这样做的目的是创建某种元素,这些元素不会显示给用户,但对JavaScript是可见的.

index.php

<!-- snip -->
<div id="dom-target" style="display: none;">
    <?php
        $output = "42"; // Again, do some operation, get the output.
        echo htmlspecialchars($output); /* You have to escape because the result
                                           will not be valid HTML otherwise. */
    ?>
</div>
<script>
    var div = document.getElementById("dom-target");
    var myData = div.textContent;
</script>
<!-- snip -->

3. Echo the data directly to JavaScript

这可能是最容易理解的.

专业人士

  • Very easily implemented--只需要很少的时间就可以实现和理解这一点.
  • Does not dirty source-变量直接输出到JavaScript,因此DOM不受影响.

缺点

  • Tightly couples PHP to your data logic-因为在演示中使用了PHP,所以不能将两者完全分开.

实施示例

实施相对简单:

<!-- snip -->
<script>
    var data = <?php echo json_encode("42", JSON_HEX_TAG); ?>; // Don't forget the extra semicolon!
</script>
<!-- snip -->

祝你好运!

Javascript相关问答推荐

JS生成具有给定数字和幻灯片计数的数组子集

将json数组项转换为js中的扁平

每次子路由重定向都会调用父加载器函数

深嵌套的ng-container元素仍然可以在Angular 布局组件中正确渲染内容吗?

我应该绑定不影响状态的函数吗?'

单击ImageListItemBar的IconButton后,在Material—UI对话框中显示图像

如何让npx在windows中运行js脚本?

如何从Intl.DateTimeFormat中仅获取时区名称?

如果Arrow函数返回函数,而不是为useEffect返回NULL,则会出现错误

将数组扩展到对象中

无法避免UV:flat的插值:非法使用保留字"

是否可以将Select()和Sample()与Mongoose结合使用?

如何组合Multer上传?

如何修复错误&语法错误:不能在纯react 项目中JEST引发的模块&之外使用导入语句?

使用可配置项目创建网格

是否设置以JavaScript为背景的画布元素?

通过解构/功能组件接收props-prop验证中缺少错误"

如何使用Cypress在IFRAME中打字

如果查询为空,则MongoDB将所有文档与$in匹配

如何使用useparams从react路由中提取id