我正在开发一个包含自定义小部件的 Wordpress 主题,一切正常,但有一件事我不知道如何正确实现:
我想在管理面板中创建小部件实例后运行一些 Javascript,这意味着在小部件被放到侧边栏中之后的那一刻,而不是在保存之后。
我在加载页面或保存小部件后运行 JS 没有问题,我想在用户刚刚将新实例放入侧栏后运行 Javascript,实际上可能会发生不止一次而无需重新加载页面。
问候菲利普
我正在开发一个包含自定义小部件的 Wordpress 主题,一切正常,但有一件事我不知道如何正确实现:
我想在管理面板中创建小部件实例后运行一些 Javascript,这意味着在小部件被放到侧边栏中之后的那一刻,而不是在保存之后。
我在加载页面或保存小部件后运行 JS 没有问题,我想在用户刚刚将新实例放入侧栏后运行 Javascript,实际上可能会发生不止一次而无需重新加载页面。
问候菲利普
Place a script tag in the widget form function.
function form($instance)
{
?><script type="text/javascript">console.log("firing javascript");</script>
<?php
//form details...
}
I eventually went a different way with this. Loaded our plugin admin script on the page using wp_enque_script and then just used jquery selectors and an event handler to target the right widget.
$('div.widgets-sortables')
.on('sortstop', function (event, ui) {
// only if this widget has the proper identifier...do something
if (ui.item.find('.my_widget').length == 0)
return;
run some function...
Still not my favourite technique...but it is cleaner then coding it in the widget. Does require a variable to track created widgets and using the "this" variable is useful
我刚刚想出了另一种方法——
我将展示一个涉及依赖关系的更复杂的示例,尽管意识到这一点Custom_Widget::form()
是问题的真正答案:
function add_js_deps() {
if (is_admin()) {
wp_enqueue_script('jquery-ui-accordion');
}
}
add_action( 'init', 'add_js_deps' ); // "init" because wp_enqueue_scripts is too late.
// Then in the widget....
class Custom_Widget extends WP_Widget {
public function form($instance) {
/** Collapsing accordion-y form HTML here **/
wp_enqueue_script('custom-js', plugins_url('js/my.js', __FILE__), array('jquery-ui-accordion'), '1.0.0', true);
}
}
我认为这是更好的途径,因为它具有依赖管理,并且您不会在 DOM 中途有一堆 JavaScript。无论如何,使用wp_enqueue_script通常总是更 WordPressian 的做事方式。