我正在为 WordPress 构建一个自定义模板,并且在几个地方我使用了 PHP if else 语句,例如页脚中的 JS 中的以下示例。它工作正常,但我想知道这是否被认为是“不好的做法”,如果是的话,什么是更好的处理方法?
<script type="text/javascript">
var $submenu = $('.submenu');
// SUBMENU animation
<?php if ( in_category('Collection') == false ) { ?> // if not a Collection subpage
$('.menu li a').each(function() {
if ( $(this).text() == 'Collection' ) { // If is Collection link show submenu on hover
$(this).mouseenter(function() {
$submenu.slideDown();
});
} else { // else close submenu on hover over other menu links
$(this).mouseenter(function() {
$submenu.slideUp();
});
}
});
$('.nav').mouseleave(function() { // close submenu
$submenu.slideUp();
});
<?php } else { ?> // If a Collection subpage always show subnav
$submenu.show();
<?php } ?>
</script>
最佳答案
虽然混合使用 PHP 和 JavaScript 并没有什么真正的问题,但我个人觉得阅读和修改它非常笨拙,而且它使得移动代码变得棘手。例如,如果您决定将该 JavaScript 导出到一个外部文件,这有很多好处:
<script src="myjs.js.php"></script>
如果您的 JavaScript 需要知道某些值以便计算 in_category('Collection')
,这会变得笨拙,因为您必须开始使用 GET 参数(除非您依赖于 session 变量,这可以变得相当复杂和不可预测,尤其是通过 Assets 请求):
<script src="myjs.js.php?random_vars_required=123"></script>
另一点需要注意的是,当 JavaScript 文件根据服务器端逻辑更改其内容时,您必须小心浏览器缓存的内容(为了避免此类问题,这基本上意味着您有更改 js 文件的每个可能结果的请求 URL)。即
<script src="myjs.js.php?collection=true"></script>
<script src="myjs.js.php?collection=false"></script>
另一个缺点是通过将 PHP 与 JS 混合使用,您可能最终会在许多地方重复 PHP 代码,这违背了 DRY 原则。这就是为什么建议的“将数据导出到 javascript 变量”是一个更好的主意。但是,如果可能,最好避免在全局 js 命名空间中使用变量。如果您需要在多个 JavaScript 文件之间共享逻辑并且不希望在每个文件的顶部导出变量,那么避免使用全局命名空间可能会很棘手。
另一种可能性
如果您正在测试的逻辑本质上是纯 bool 值,并且它还以页面分类(或子区域分类)为中心,那么以下是处理您要实现的目标的非常好的方法。它很好,主要是因为它将您的 PHP 和 HTML 放在一起,而您的 JS 是分开的。
以下内容应放在您用来生成外部 HTML 的任何模板中:
<?php
$classes = array();
if ( in_category('Collection') ) {
$classes[] = 'collection';
}
$classes = implode(' ', $classes);
?>
<!--
obviously you'd render the rest of the html markup
I've removed it for simplicity
//-->
<body class="<?php echo $classes; ?>"></body>
然后在你的 JavaScript/jQuery 中:
if ( $('body.collection').length ) {
/// if collection sub page
}
else {
/// else do otherwise
}
如果您不想将类添加到您的 body
元素,您始终可以根据页面的一个版本而不是另一个版本上已经存在的内容来定义 bool 检查。尽管我个人喜欢保持整洁,并且只有在我知道 HTML 标记将来不会发生太大变化时才采用这种检查。
当今世界应该担心的几乎所有浏览器都支持元素上的多个类。所以这意味着即使你有多个你想检查的东西,只要它有意义,你可以将这些类放在你的 html
或 body
标签上并使用 jQuery 的快速实现,为您找到它们。
关于php - 在 JS 不好的做法中使用 PHP if/else 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15799116/