管理栏菜单项可以执行Java脚本,但不会重新加载页面?

时间:2011-03-10 作者:kaiser

我在管理栏中添加了一个菜单项,它执行一些Javascript来显示调试信息。问题是,单击此项目也会重新加载页面。我如何防止这种情况?

我试图加快调试速度(&A);开发人员的东西,并希望使用jQuery向我的主包装器div添加一个类。

第1步:

在头部添加样式

function my_admin_bar_script_def( $script ) {
$script = \'
    jQuery(document).ready( function() {
        jQuery("li#wp-admin-bar-showdebug").click( function() {
            jQuery(".wrap").toggleClass("showdebug");
        } )
    } );
\';

return print $script;
}
add_action( \'wp_head\', \'my_admin_bar_script_def\', 11 );
步骤2:添加管理栏菜单项:

function my_admin_bar_class_switch() {
global $wp_admin_bar;

$wp_admin_bar->add_menu( 
    array( 
         \'parent\'   => \'theme_options\'
        ,\'title\'    => __( \'showdebug\', TEXTDOMAIN )
        ,\'href\'     => \'\' // **interesting problem over here**
    ) 
);
}
add_action( \'admin_bar_menu\', \'my_admin_bar_class_switch\', 70 );
问题:每次触发切换功能时,都会启动链接并重新加载页面。因此,您将再次获得初始触发器。无法更换链接,因为在$args 的数组add_menu() 函数仅定义href 无论如何,链接都会被打印出来。过滤器还是挂钩?不可用。

2 个回复
最合适的回答,由SO网友:Jan Fabry 整理而成

如果你return false 在该Javascript函数中,不会传播单击,也不会重新加载页面。

更好的是,you can specify a onclick attribute for a menu item. 所以你的定义是:

function my_admin_bar_class_switch( &$wp_admin_bar ) {
    // $wp_admin_bar is passed by reference, you don\'t need the global var
    $wp_admin_bar->add_menu( 
        array( 
             \'parent\'   => \'theme_options\'
            ,\'title\'    => __( \'showdebug\', AHF_LANG )
            ,\'href\'     => \'\' // This can stay empty
            ,\'meta\'     => array(
                \'onclick\' => \'jQuery(".wrap").toggleClass("showdebug"); return false;\'
            )
        ) 
    );
}
add_action( \'admin_bar_menu\', \'my_admin_bar_class_switch\', 70 );
在这种情况下,您不需要连接onclick 亲自参加活动。我发现还有两个可能的错误:wp_head 是一个操作,而不是筛选器,因此通过返回脚本,它将不会被打印。此外,您依赖showdebug 作为id, 但由于您没有指定ID,因此它是从标题生成的。如果该字符串被翻译,则该ID将不会保持不变。

SO网友:kaiser

解决方案:

简单设置\'href\' => \'#\' 链接到未定义的锚点以避免页面重新加载。

我知道这很简单,但我花了将近一个小时才找到正确的方向(考虑了太多过滤器和挂钩来修改输出),所以这里是我的分享。

结束