在小部件管理表单上优雅地使用JavaScript

时间:2014-01-16 作者:aendra

我正在从事一个涉及许多小部件的项目,我认为使用jQuery UI Accordion构建一个“更多选项”部分并在单击时展开会非常好。

因此,我使用“admin\\u enqueue\\u scripts”操作将“jquery ui accordion”排入队列:

function add_my_deps() {
    wp_enqueue_script(\'jquery-ui-accordion\');
}    
add_action( \'admin_enqueue_scripts\', \'add_my_deps\' );
。。。我的JavaScript如下所示:

(function($){
    $(\'.more-options-expansible\').accordion();
})(jQuery)

Now what?

如果我通过上面的“add\\u my\\u deps”操作将其排队,则只有在我重新加载页面时才有效(即,放置小部件时,JavaScript在创建元素之前实例化;如果保存小部件,则其JavaScript按正常方式排队,并按正常方式实例化)。

如果我把它放在<script> 在我的小部件的HTML输出末尾添加标记form() 方法,我得到以下异常:Uncaught TypeError: Object [object Object] has no method \'accordion\'. 这是因为它似乎是通过内联来实例化手风琴的<script> 在加载jQuery UI Accordion库之前。

我有什么明显的缺失吗?在这个示例中,我使用了一个简单的jQuery实例化,但如果我尝试使用AJAX做任何事情,似乎会遇到更严重的问题(即,我将如何选择适当的元素来放置响应?这是我需要开始使用Backbone.js来完成的吗?)。

有什么帮助吗?

2 个回复
SO网友:aendra

自从发布上述问题以来,我发现了一种解决方法,即通过WP_Widget::form(), 具有wp_enqueue_script() 加载必要的JavaScript(如上所述)——除了,这里是关键部分,加载JavaScriptin the header 而不是页脚(的第五个参数wp_enqueue_script()).

现在想想,这很有道理。

尽管如此,我还是讨厌使用内联JavaScript,而且在头中加载所有内容都不太理想。

因此,我将这个问题留待讨论,以防有人有更好的想法。

SO网友:scottsawyer

WordPress添加了一些JavaScript事件、“添加了小部件”、“更新了小部件”、“同步了小部件”,因此您不再需要破解ajax事件。

https://core.trac.wordpress.org/ticket/19675

因此,我认为您应该在外部js文件中将代码更新为如下内容:

$(document).on(\'widget-added\', function(event, widget) {
   $(widget).find(\'.more-options-expansible\').accordion();
}
您可能需要为“widget updated”和“widget synched”添加类似的内容,因为它们都会影响您的dom。

结束