我偶尔会遇到通过PHP文件包含一些Javascript的页面:
<html>
<head>
<script type="text/javascript" src="fake_js.php"></script>
</head>
<body onload="handleLoad();">
</body>
</html>
fake_js.php 的内容可能如下所示:
<?php header('Content-type: text/javascript') ?>
function handleLoad() {
alert('I loaded');
}
包含这样的Javascript有哪些优点(或缺点)?
答案 0 :(得分:13)
可以很容易地从服务器端设置javascript变量。
var foo = <?=$foo?>
我的项目中通常有一个php / javascript文件,我用它来定义需要在javascript中使用的任何变量。这样我就可以在javascript中轻松访问服务器端使用的常量(css颜色,非敏感站点属性等)。
编辑:例如,这是我正在处理的项目中config.js.php
文件的副本。
<?php
require_once "libs/config.php";
if (!function_exists("json_encode")) {
require_once "libs/JSON.php";
}
header("Content-type: text/javascript");
echo "var COLORS = ". json_encode($CSS_COLORS) .";\n";
echo "var DEBUG = ". ((DEBUG == true) ? "true" : "false").";";
?>
答案 1 :(得分:8)
如果您不需要,请不要使用它:
您需要保留的第一件事 心灵是 YAGNI 。 你不会 需要它。直到某个功能, 原则或指南变得有用 并且相关,不要使用它。
<强>缺点:强>
<强>优点:强>
<head> </head>
部分中使用正确的变量/参数进行初始化来实现除非javascript真正独特(即JSON,参数/变量),否则你不会获得太多收益。但在每种情况下,您都应该最小化服务器端生成的JS数量,并最大化静态文件中的代码量。不要忘记,如果它是动态的,它必须一次又一次地生成/下载,所以它不是一个繁重的过程。
同时强>
答案 2 :(得分:1)
上面给出的示例没有任何好处(除了可以访问.php文件的特殊部署方案,而不是.js文件,这些文件很疯狂但不是闻所未闻)。
也就是说,这种方法允许您通过php解析器传递JS - 这意味着您可以根据服务器变量动态生成JS。
答案 3 :(得分:1)
同意tj111。除了tj提到的,我还发现php生成的javascripts是一个很好的武器来对抗浏览器的缓存技巧。就在不久之前,我正在诅咒整个javascript,因为它经常被浏览器缓存。刷新页面对我没有帮助,不得不清除整个缓存以强制浏览器重新加载javascript文件。只要我在javascripts前面构建了一个php墙:
fake_js.php:
<?php
header('Content-type: text/javascript')
include('the_real_javascript.js');
?>
一个全新的javascript总是出现在客户端。然而,这种方法显然只有在开发阶段才有用,因为它可以让开发人员在浏览器中加载正确的 javascript时非常头疼。当然,当连接到localhost时,重复加载同一文件的代价并不大。
在实时Web应用程序/站点中,欢迎使用客户端缓存来减少网络流量和整体服务器负载。
答案 4 :(得分:0)
Advantage(不是特定于PHP的 - 我在EmbPerl和JSP中使用这种技术)将能够在服务器端动态生成或调整/自定义JavaScript代码。
示例用法是基于DB表内容的数组填充。 或者应用本地化技术。
答案 5 :(得分:0)
如果您没有完整的服务器访问权限且无法打开gzip编码,那么将以下内容放入您的javascript文件中非常有用(注意:需要重命名为file.js.php或解析为PHP通过.htaccess指令):
<?php
ob_start( 'ob_gzhandler' );
header("Content-type: text/javascript");
?>
// put all your regular javascript below...
您还可以将其用于更好的缓存控制,访问者跟踪等,以代替服务器控制的解决方案。
答案 6 :(得分:-1)
绝对没有,恕我直言。我使用我编写的js框架来处理我需要访问的任何服务器端变量的设置。它基本上与在JavaScript中嵌入PHP相同,但更不含糊。使用此方法,您还可以将服务器端逻辑与html完全分开,远离javascript。这样可以产生更清晰,更有条理,耦合度更低的模块化代码。
您可以在html中执行以下操作:
<script type="text/javascript">
registry = {
myString : '<?php echo $somePhpString; ?>',
myInt : <?php echo $somePhpInteger; ?>
}
</script>
然后在你的js中做这样的事情:
if (registry.myInt === 1) {
alert(registry.myString);
}