問題描述

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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。