正在替换所有选择的管理后端中的selt2

时间:2014-06-07 作者:Bryan Willis

我最初把这个问题作为javascript问题发布在这里,但我想也许在这里问会更好。我尝试将select2添加到所有wordpress管理屏幕。然而,由于许多选择是动态创建的,因此我需要找到一种方法来识别动态选择。我让它工作,但动态选择没有加载正确的宽度和位置。以http://example.com/wp-admin/edit.php 页单击“快速编辑”时,select2找不到新选择的正确宽度和位置。如果查看源代码,可以看到具有以下样式属性的下拉列表:

style="width:0; top:0; left:0; 
因此,当您单击它时,它不会显示。但是,如果单击一个新的选择,然后再次单击它的正下方,则会更新样式,但现在会将select2覆盖移动到选择的右侧。

下面是一个插件示例,如果有人想测试它,下面是一些屏幕截图:

<?php

/**
 * Plugin Name: Admin Select2 Not Working Everywhere
 * Plugin URI: 
 * Description: Adds select2 to all admin screens
 * Version: 1.0
 * Author: Bryan Willis
 * Author URI: 
 * License: GPL2
 */

function enqueue_select2_jquery() {
    wp_register_style( \'select2css\', \'http://cdnjs.cloudflare.com/ajax/libs/select2/3.4.8/select2.css\', false, \'1.0\', \'all\' );
    wp_register_script( \'select2\', \'http://cdnjs.cloudflare.com/ajax/libs/select2/3.4.8/select2.js\', array( \'jquery\' ), \'1.0\', true );
    wp_enqueue_style( \'select2css\' );
    wp_enqueue_script( \'select2\' );
    }
add_action( \'admin_enqueue_scripts\', \'enqueue_select2_jquery\' );

function select2jquery_inline() {
    ?>
<style type="text/css">
.select2-container {margin: 0 2px 0 2px;}
.tablenav.top #doaction, #doaction2, #post-query-submit {margin: 0px 4px 0 4px;}
</style>        
<script type=\'text/javascript\'>
jQuery(document).ready(function ($) {
   $("select").select2(); 
   $( document.body ).on( "click", function() {
        $("select").select2(); 
     });
});
</script>   
    <?php
 }
add_action( \'admin_head\', \'select2jquery_inline\' ); 
enter image description here

enter image description here

enter image description here

enter image description here

1 个回复
SO网友:TheDeadMedic

问题在于编辑的速度有多快-WordPress使用隐藏的<div /> 生成表单,该表单已经select2 已应用(因此,已计算的位置)。

你的click 主体上的事件侦听器不会在需要时启动,因为用于快速编辑的核心事件处理程序会返回false, 停止任何事件传播。相反,你可以偷听focus 标题输入的事件,该事件在呈现快速编辑表单后激发:

jQuery( document ).ready(
    function( $ ) {
        $( "select:visible" ).select2(); // Only fire on visible inputs to begin with.
        $( document.body ).on( "focus", ".ptitle,select",
            function ( ev ) {
                if ( ev.target.nodeName === "SELECT" ) {
                    // Fire for this element only
                    $( this ).select2({ width: "element" });
                } else {
                    // Fire again, but only for selects that haven\'t yet been select2\'d
                    $( "select:visible" ).not( ".select2-offscreen" ).select2({
                        width: "element"
                    });
                }
            }
        );
    }
);
你会看到我还添加了width: "element" 论点这意味着select2 将根据选项的长度计算适当的宽度。没有它,select2 对于某些选项来说太窄了,尤其是带有长页面标题的“页面父级”。

此解决方案将通过快速编辑专门解决您的问题,但您可能需要为其他动态情况实施额外的“修复”,特别是如果您想更好地使用高级自定义字段之类的插件。

结束

相关推荐

是否将我的用户帐户的wp-admin仪表板布局复制给其他用户?

在我的用户帐户的wp admin中的Dashboard选项卡上,我在屏幕选项中隐藏了某些项目,并且以特定的方式排列了面板。我想将相同的布局复制给我的其他管理用户,这样他们就可以看到某些信息,这样我就可以在需要时更轻松地远程解释事情。我假设此信息包含在数据库表中。我需要复制什么到哪里?