我最初把这个问题作为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\' );
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
对于某些选项来说太窄了,尤其是带有长页面标题的“页面父级”。
此解决方案将通过快速编辑专门解决您的问题,但您可能需要为其他动态情况实施额外的“修复”,特别是如果您想更好地使用高级自定义字段之类的插件。