2

我正在开发一个包含自定义小部件的 Wordpress 主题,一切正常,但有一件事我不知道如何正确实现:

我想在管理面板中创建小部件实例后运行一些 Javascript,这意味着在小部件被放到侧边栏中之后的那一刻,而不是在保存之后。

我在加载页面或保存小部件后运行 JS 没有问题,我想在用户刚刚将新实例放入侧栏后运行 Javascript,实际上可能会发生不止一次而无需重新加载页面。

问候菲利普

4

2 回答 2

1

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

于 2013-08-15T23:20:15.387 回答
0

我刚刚想出了另一种方法——

我将展示一个涉及依赖关系的更复杂的示例,尽管意识到这一点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 的做事方式。

于 2014-01-16T12:08:22.770 回答