Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jQuery UI自动完成自定义标记_Jquery_Jquery Ui_Jquery Ui Autocomplete - Fatal编程技术网

jQuery UI自动完成自定义标记

jQuery UI自动完成自定义标记,jquery,jquery-ui,jquery-ui-autocomplete,Jquery,Jquery Ui,Jquery Ui Autocomplete,我正在使用带有分类搜索结果的jQueryUIAutoComplete,我想用CSS来增加它的趣味性 不幸的是,jQuery UI并没有让它变得简单,而且默认标记很难使用: <input class="ui-autocomplete-input"/> <ul class="ui-autocomplete ui-menu ui-widget ui-widget-content ui-corner-all"> <li class='ui-autocomplete-ca

我正在使用带有分类搜索结果的jQueryUIAutoComplete,我想用CSS来增加它的趣味性

不幸的是,jQuery UI并没有让它变得简单,而且默认标记很难使用:

<input class="ui-autocomplete-input"/>
<ul class="ui-autocomplete ui-menu ui-widget ui-widget-content ui-corner-all">
  <li class='ui-autocomplete-category'>Category 1</li>
  <li class="ui-menu-item">
      <a class="ui-corner-all">item 1</a>
  </li>
  <li class="ui-menu-item">
      <a class="ui-corner-all">item 2</a>
  </li>
  <li class="ui-menu-item">
      <a class="ui-corner-all">item 3</a>
  </li>
  <li class='ui-autocomplete-category'>Category 2</li>
  <li class="ui-menu-item">
      <a class="ui-corner-all">item 1</a>
  </li>
  <li class="ui-menu-item">
      <a class="ui-corner-all">item 2</a>
  </li>
  <li class="ui-menu-item">
      <a class="ui-corner-all">item 3</a>
  </li>    
</ul>

  • 类别1
  • 项目1
  • 项目2
  • 项目3
  • 类别2
  • 项目1
  • 项目2
  • 项目3
我想要的标记是:

<input class="ui-autocomplete-input"/>
<ul class="ui-autocomplete ui-catcomplete">
    <div class="ui-block">
        <div class="ui-autocomplete-category">Category 1</div>
        <div class="ui-list">
            <li class="ui-menu-item">
                <a class="ui-corner-all">item 1</a>
            </li>
            <li class="ui-menu-item">
                <a class="ui-corner-all">item 2</a>
            </li>
            <li class="ui-menu-item">
                <a class="ui-corner-all">item 3</a>
            </li>
        </div>
    </div>
    <div class="ui-block">
        <div class="ui-autocomplete-category">Category 1</div>
        <div class="ui-list">
            <li class="ui-menu-item">
                <a class="ui-corner-all">item 1</a>
            </li>
            <li class="ui-menu-item">
                <a class="ui-corner-all">item 2</a>
            </li>
            <li class="ui-menu-item">
                <a class="ui-corner-all">item 3</a>
            </li>
        </div>
    </div>
</ul>

    第一类
  • 项目1
  • 项目2
  • 项目3
  • 第一类
  • 项目1
  • 项目2
  • 项目3
这就是我达到极限的地方

实际上,我成功地创建了标记,但我无法再通过单击该项目来选择和提交

下面是我想出的代码:

$.widget( "custom.catcomplete", $.ui.autocomplete, {

    _renderMenu: function( ul, items ) {
        var self = this,
            currentCategory = "",
            i = 0;

        $.each( items, function( index, item ) {
            if ( item.category != currentCategory ) {

                ul.append( "<div class='ui-autocomplete-category'>" + item.category + "</div>");
                currentCategory = item.category;

            }

            self._renderItem( ul, item );
        });

        /* This is how I thought it would work */

        ul.find('.ui-autocomplete-category').each(function() {
            $(this).nextUntil('div')
                    .andSelf()
                    .wrapAll('<div class="ui-block">')
                    .nextUntil('div')
                    .wrapAll('<div class="ui-list">');
        });

    },

    _renderItem: function( ul, item) {
        return $( "<li></li>" )
        .data( "item.autocomplete", item )
        .append( "<a>" + item.label + "</a>" )
        .appendTo( ul );
    },
});

$(function() {  
    $( "#ui-autocomplete-input" ).catcomplete({
        source: '<?php echo SITEURL?>/users/complete/',
        delay: 0,
        autoFocus: true,
        select: function(event, ui) {
            if(ui.item)
            {
                $('#ui-autocomplete-input').attr('value',ui.item.value);
            }
            $('#ui-autocomplete-form').submit();
        }
    });
});
$.widget(“custom.catcomplete”,$.ui.autocomplete{
_renderMenu:功能(ul,项目){
var self=这个,
currentCategory=“”,
i=0;
$。每个(项目、功能(索引、项目){
如果(item.category!=当前类别){
ul.追加(“+item.category+”);
currentCategory=item.category;
}
自我评估(ul,项目);
});
/*这就是我认为它会起作用的方式*/
ul.find('.ui自动完成类别')。每个(函数(){
$(this.nextUntil('div'))
.andSelf()
.wrapAll(“”)
.nextUntil('div'))
.wrapAll(“”);
});
},
_renderItem:功能(ul,项目){
返回$(“
  • ”) .data(“item.autocomplete”,item) .append(“+item.label+”) .附录(ul); }, }); $(函数(){ $(“#ui自动完成输入”).catcomplete({ 来源:“/users/complete/”, 延迟:0, 自动对焦:对, 选择:功能(事件、用户界面){ if(ui.item) { $('ui autocomplete input').attr('value',ui.item.value); } $(“#ui自动完成表单”).submit(); } }); });
    因此,基本上,select:function部分根本不起作用

    有人能帮我吗

    我相信有一种更简单的方法可以修改默认标记并使其正常工作

    这就是我希望它看起来的样子:


    您可以在不改变HTML的情况下通过一点CSS技巧来解决这个问题:

    ul.ui-autocomplete {
        padding-left: 200px;
    }
    
        ul.ui-autocomplete li.ui-autocomplete-category {
            width: 200px;
            height: 50px;
            margin-left: -200px;
            margin-bottom: -50px;
        }
    
    它不是完美的(分类li的高度可能超过结果的高度,或者它可能不适合li的内容),但它是有效的


    顺便说一句:ul的唯一有效子元素是li。所以span也帮不了你。

    我最终自己找到了解决方案,其中包括一些CSS技巧和一些简单的jQuery

    CSS:

    jQuery:

    $( "#search" ).catcomplete({
        delay: 0,
        source: data,
        autoFocus: true,
        select: function(event, ui) {
            if(ui.item) { $('#search').attr('value',ui.item.value);}
            $('#form').submit();
            },
    
        /* This is the important part! */
    
        open: function() {
            $('.ui-autocomplete-category').next('.ui-menu-item').addClass('ui-first');
        }    
    });
    
    基本上,我使用绝对定位将类别名称放在左侧,并使用jQuery向第一个LI元素添加一个类,以便使用填充创建一些间距


    它不是完美的,但工作完美:)

    A
    div
    不是无序列表的有效子元素,因此您已经在询问渲染问题。你能描述一下你设计这些元素的意图吗?不管怎样,我可以使用一个图标并将其显示为一个块,它不会改变任何风格。我想把分类放在左边,把项目放在右边,这样就节省了一些空间你对无序列表的看法是绝对正确的,我不知道我在想什么,也许我真的不在乎把跨度和div放在我想要的地方。总之,那天晚些时候我找到了另一个解决方案,它和你的类似,因为它不改变标记,并且使用了一些CSS技巧。祝贺你找到了这个解决方案。如果可以,请单击左侧的复选标记,将您的答案标记为“已接受”。这将让其他人从你的成功中学习。干杯~我遵循了你提到的完全相同的解决方案,但它对我根本不起作用。特别是,将div包装在li周围的代码。
    $( "#search" ).catcomplete({
        delay: 0,
        source: data,
        autoFocus: true,
        select: function(event, ui) {
            if(ui.item) { $('#search').attr('value',ui.item.value);}
            $('#form').submit();
            },
    
        /* This is the important part! */
    
        open: function() {
            $('.ui-autocomplete-category').next('.ui-menu-item').addClass('ui-first');
        }    
    });