当脚本使用PHP变量时导出javascript

Export javascript when the script is using PHP variables

本文关键字:javascript 变量 PHP 脚本      更新时间:2023-09-26

我在一个站点的php脚本中有800行JS代码,并且在一些JS函数中散落着一些php回声来插入php中的变量。我想要尽可能多的JS出的页面,但我不知道任何好的方法来做到这一点,因为我不是很有经验的JS,因为我没有写代码,我甚至不知道这个东西的100%的原因。

这里有一个最糟糕的例子,我不知道如何从PHP页面中转换出来。

function validateCostCenter(el){
var objCB = el;
var emp_code = objCB.name.substring(23,29);
var local_plant_ID ="<?=$plant['Plant']['LocationID']?>";
var cc_plants_array = ["<?=$cc_plants?>"];
var CCPlant=false;
var CostCenterExists=false;
var std_cs_array = [];
<?
$idx = 0;
foreach($employees as $emp){
    foreach($std_cs as $cs){
        if($emp['Emp']['id'] == $cs[0]['emp_id']){
            echo "std_cs_array[".$idx."] = ['"".trim($emp['Emp']['code'])."'",'"".$cs['0']['emp_id']."'",'"".$cs['0']['locationid']."'",'"".$cs['0']['charge_back_plant_id']."'"];'n";
            $idx++;
        }
    }
}

?>

要做到这一点,最好的方法是从页面中删除所有的纯JS函数,并包括它们作为一个外部文件,只是离开部分php的100%是吗?这是我们网站上最浪费和最慢的页面之一,所以我希望它尽可能优化,并且单独的java脚本文件使一切更容易调试。

添加所有php生成的变量作为函数的参数:

function validateCostCenter(el, local_plan_ID, cc_plants_array, std_cs_array)

BTW你可以使用json_encode来导出你的$employers数组到javascript。

我将用一个非常简单的例子来说明可能的方法。

方法1:PHP

page.php包含计算和生成的Javascript文件(就像您现在拥有的那样):
<body>       
<?php
function sum_php($a) {
    $sum = 0;
    for ($i = 0; $i < count($a); ++$i) $sum += $a[$i];
    return $sum;
}
$a = array(1, 2, 3);
$sum = sum_php($a);
?>
<script type="text/javascript">
    // JS generated by PHP:
    alert("sum_php=" + <?php echo $sum ?>);
</script>     
</body>

方法2:Javascript中的计算

计算将从PHP移到单独的Javascript文件page.js中。PHP通过JSON-encoding:

向JS函数提供变量。

(1) page.php:

<head>     
    <script type="text/javascript" src="page.js"> </script>     
</head>     
<body>       
<?php
    $a = array(1, 2, 3);
?>    
<script type="text/javascript">
    sum_js(<?php echo json_encode($a) ?>); // supply $a to JS function
</script>     
</body>

(2) page.js:

function sum_js(a) {
    var s = 0;
    for (var i = 0; i < a.length; ++i) s += a[i];
    alert("sum_js=" + s);
    return s;
}

假设这些值是不可缓存的....

如果是我,我会让PHP创建一个全局对象/数组来保存这些值,并生成不可缓存的javascript文件,然后将其余代码移动到一个静态的,可缓存的文件中,例如

user_vars.php:
<?php
session_start();
....get values for variables....
print "user_vars={";
print "   '  plant': " . json_encode($plant) . "'n";
print "   ', cc_plants_array: [" . $cc_plants . "]'n";
....etc
generic.js:
function validateCostCenter(el){
 var objCB = el;
 var emp_code = objCB.name.substring(23,29);
 var local_plant_ID = user_var.Plant.LocationID;
 var cc_plants_array = user_var.cc_plants_array;
.....

然而,对每个参数的生成值进行拆分可能有点棘手——最简单的方法可能是在PHP生成基本HTML时编写一个临时文件,而不是尝试创建两次数据结构。