问题描述

WP.SE 社区一直建议使用 wp_register_scriptwp_enqueue_script 在主题/模板中添加脚本 (同样,wp_register_stylewp_enqueue_style 用于样式表) 。


这是我如何注册和排队我的脚本…

首先,我在 functions.php 中添加了这样的东西

add_action('init','wpse54189_register_script');
function wpse54189_register_script(){

    //Register scripts
    wp_enqueue_script( 'jquery' );
    wp_register_script( 'aahan_bootstrap_transition', get_template_directory_uri().'/js/bootstrap-transition.js');
    wp_register_script( 'aahan_bootstrap_carousel', get_template_directory_uri().'/js/bootstrap-carousel.js', array('aahan_bootstrap_transition'));
    wp_register_script( 'wpse54189_ajax_comment', get_template_directory_uri().'/js/no-reload-comments.js');
}

然后这样调用它在一个模板文件 (例如 header.php) 中

<?php wp_enqueue_script( 'aahan_bootstrap_carousel' ); ?>
<?php wp_enqueue_script( 'wpse54189_ajax_comment' ); ?>

现在来说,如何注册和排入特定浏览器可以识别的 「条件 JavaScript 文件」?例如:

<!--[if lt IE 9]>
<script src="<?php%20echo%20get_template_directory_uri();%20?>/js/html5.js" type="text/javascript"></script>
<![endif]-->

如何正确注册和排队?

PS:我使用 Reddle theme,由 Automattic 的主题摇滚者开发。而主题的 header.php 直接使用上面提到的代码 – 即它不是入队的。那么这是否意味着这是唯一的办法呢?

最佳解决方案

WP_ScriptsWP_Styles 类别都在 wp_enqueue_scriptwp_enqueue_style 功能之后。如果您看看类实现 (scriptsstyles),那么您将看到 WP_Scripts 类不支持任何类型的条件脚本,但是!你可以看到 WP_Styles!问题是 wp_enqueue_style 不允许您设置条件。

所以我们必须做一个小黑客:

add_filter( 'wp_enqueue_scripts', 'wpse2345_enqueue_scripts' );
function wpse2345_enqueue_scripts() {
    wp_enqueue_style( 'mystyle', 'url/of/my/style.css', array(), '1.0.0' );

    global $wp_styles;
    $wp_styles->registered['mystyle']->add_data( 'conditional', 'lt IE 9' );
}

因为所有注册的样式都存储在 WP_Styles 类的 registered 字段中,所以这样的黑客成为可能。每个注册样式都是_WP_Dependency 类的对象,它允许您添加额外的数据。

不幸的是,这个黑客不适用于脚本。

附加信息:我昨天晚上在 Aaron Campbell’s Essence Theme 中正在执行代码,并注意到他正在调用浏览器条件脚本和样式。

/**
 * @var WP_Scripts
 */
global $wp_scripts;
// Conditionally load this only for IE < 9
$wp_scripts->add_data( 'html5', 'conditional', 'lt IE 9' );

/**
 * @var WP_Styles
 */
global $wp_styles;
// Conditionally load this only for IE < 8
$wp_styles->add_data( 'blueprint-ie', 'conditional', 'lt IE 8' );

还有一个 ticket and patch but it’s not in core yet 。显然,条件脚本在没有补丁的情况下将无法正常工作,但需要注意的是,可以直接在附加到 wp_enqueue_scripts 操作的函数中使用 add_data 方法。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。