3

我有以下代码:

<HTML>
    <?php
        if(isset($_GET['adjust'])){
            $adjust = true;
        }
        //More variabele declaring
    ?>
    <HEAD>
        <script type="text/javascript">
            var adjust = "<?php Print($adjust); ?>";
            //More variable 'transports'
        </script>
    </HEAD>
<!-- rest of the file -->

我想稍微清理一下,因为我有很多变量。这会影响文件的可读性和概览。

我想把它全部放到一个外部 JavaScript 文件中,但它似乎没有用。

<HTML>
    <?php
        if(isset($_GET['adjust'])){
            $adjust = true;
        }
        //More variabele declaring
    ?>
    <HEAD>
        <script type="text/javascript" src="externalJS.js"></script>
    </HEAD>
<!-- rest of the file -->

使用 externalJS.js:

var adjust = "<?php Print($adjust); ?>";
//More variable 'transports'

根据这个问题,也在stackoverflow上问过,这是不可能的。

既然回答了上述问题,有没有办法利用过去几年的知识来做到这一点?还有其他方法可以提高可读性吗?

PS:我认为值得一提的是,我从 url、txt 文件和 cookie 中获得了我的 php 变量。

4

3 回答 3

5

当我遇到必须将许多变量放入 javascript 的情况时,我使用了将所有这些项目加载到对象(或数组)中并将该数据输出到 javascript 中的对象/数组文字的方法。

例如:

<?php
$js_object = new stdClass();
$js_object->foo = 'some value';
$js_object->bar = 'some other value';
?>
<script type="text/javacript">;
var php_values = <?php echo json_encode($js_object); ?>;
console.log(php_values.foo);
console.log(php_values.bar);
</script>

这做了几件事。

  1. 如果传递的变量需要更改,则您的 JS 输出部分根本不需要更改。您想在 JS 中访问的任何内容都需要在$js_object对象通过以下方式输出到浏览器之前加载json_encode()
  2. 它将所有 PHP 提供的值放在 javascript 中的一个整洁的对象/数组中,可以访问它们。
  3. 您可以通过这种方式轻松传递复杂的数据结构(嵌套数组、包含数组的对象、对象数组等)
  4. 如果需要,您可以在 javascript 中扩展对象以提供方法等来对数据进行操作。

我还要评论说,您可能想考虑一下您是否想以这种方式传递 cookie 数据。Cookie 数据无论如何都可用于 javascript,因此如果您需要更改值等,您可能希望直接使用该数据。

于 2013-11-08T22:01:50.450 回答
0

在 PHP 中创建一个数组,其中包含变量名称(如您在 javascript 中所希望的那样)作为每个元素的键,并在 javascript 中创建您希望的值作为每个元素的值。然后,按照这个:

$myVars = array();
$myVars['adjust'] = isset($_POST['adjust']) ? true : false;
$myVars['other'] = isset($_POST['other']) ? true : false;
$myVars['another'] = isset($_POST['another']) ? true : false;

<script type="text/javascript">
    <?php
    foreach( $myVars as $k => $v ):
         echo 'var ' . $k . '="' . $v . '";'; 
    ?>
</script>

干杯

于 2013-11-08T22:06:08.073 回答
0

Mike Brant 的方法在这里很好(将所有内容存储在一个json对象中),但是要以更分段的方式具体完成您在此处提出的要求,您可以简单地将包含的 javascript 库设置为输出 Javascript 标头的 PHP 文件。您的标记将如下所示:

<HTML>
    <?php
        if(isset($_GET['adjust'])){
            $adjust = true;
        }
        //More variabele declaring
    ?>
    <HEAD>
        <script type="text/javascript" src="externalJS.js.php?<?=http_build_query($_GET);?>"></script>
    </HEAD>
<!-- rest of the file -->

然后您的 externalJS.js.php 文件将如下所示:

<?php
header("content-type: text/javascript");
?>
var adjust = "<?php Print($adjust); ?>";
//More variable 'transports' and any other PHP/Javascript code

尽管有 .php 扩展名,但header此处告诉浏览器将结果视为 javascript。

此外,如果你真的想要,你也可以告诉你 webserver 将js文件解析为 PHP,这样它就会查找<?php ... ?>段并执行它们,所以你甚至不需要在文件上有一个非 js 扩展名:

AddType application/x-httpd-php .js

但是当你这样做时要小心,因为这意味着所有的 javascript 文件(或者指定目录中的任何文件,如果你正在使用htaccess)都将被解析,如果你不小心,这可能会打开安全漏洞。


一些旁注:

  1. 看看围绕text/javascriptvs的讨论application/javascript
  2. 不要将所有标签名称大写。是的,HTML5 表示可以,但 W3C 建议将小写字母作为约定(用于标准化和任何可能的 xhtml 转换)。
  3. 当只是printing 或echoing 时,首先使用小写字母 ( printvs Print),不要将打印的变量括在括号中 (print并且echo是语言结构,因此它们不需要括号,并且在某些情况下使用它们会导致问题),最后,如果您在 PHP 标记中所做的只是打印或回显,请尝试使用 PHP echo 简写(大多数网络服务器默认理解它们):<?=$var_name;?><?php print($var_name);?>
于 2013-11-08T22:39:47.170 回答