使用动态变量名很不方便。更好的解决方案是使用单个数组/对象,该数组/对象使用自动递增的整数引用每个“实例”。
这与您已经拥有的相差不大,但它将所有参数都保存在变量中,访问对象的特定属性比动态创建变量名感觉更好。
问题是wp_localize_script()
当对象名称相同时,删除以前的调用。因此,为了确保可以“整理”参数,可以使用静态类存储参数,并尽可能晚地将脚本排队(对于前端wp_footer
可以)。
下面是一个简单的例子:
class My_js_loader{
private static $scripts;
static function enqueue( $handle, $args ){
if ( ! isset( self::$scripts[$handle] ) ) {
self::$scripts[$handle] = array();
}
self::$scripts[$handle][] = $args;
add_action( \'wp_footer\', array( __CLASS__, \'enqueue_scripts\' ) );
return count( self::$scripts );
}
static function enqueue_scripts(){
if ( self::$scripts ) {
foreach( self::$scripts as $handle => $args ){
wp_enqueue_script( $handle );
wp_localize_script( $handle, $handle, $args );
}
}
}
}
用法示例:
$instance1_id = My_js_loader::enqueue( \'mywidget\', array(
\'param1\' => \'foo\',
\'param2\' => \'bar\',
) );
//$instance1_id = 1;
//generates HTML <div class="mywidget" data-mywidget-instance="1"></div>
$instance2_id = My_js_loader::enqueue( \'mywidget\', array(
\'param1\' => \'hello\',
\'param2\' => \'world\',
) );
//$instance2_id = 2;
//generates HTML <div class="mywidget" data-mywidget-instance="2"></div>
然后在javascript文件中
$(\'.mywidget\').each(function(){
var inst = $(this).data(\'mywidget-instance\');
var args = mywidget[inst];
});
缺点我假设您的JavaScript句柄用作变量名。如果不是这样,您可以始终允许将变量名传递给
My_js_loader::enqueue()
我也是延迟加载意味着它不能轻易地退出队列。你可以揭露
dequeue
方法(以防止加载特定或所有当前实例)。然而,在大多数情况下,相应的标记已经打印到页面上,因此您可能不希望它退出队列静态类的使用使得测试。。。尴尬
优点
- 避免了如果您的脚本已经打印到页面上,则进一步调用
wp_localize_script()
被忽略 - 所有参数都包含一个好的、已知的和固定的变量名,JavaScript文件始终加载在页脚中