如何合并jquery自动完成和fcbkListSelection功能?

时间:2009-06-24 01:03:15

标签: javascript jquery jquery-plugins

最初的警告:我是jquery和javascript的新手。

我最近从bassistance.de开始使用autocomplete jquery插件。昨天,我找到了fcbkListSelection插件(http://www.emposha.com/javascript/fcbklistselection-like-facebook-friends-selector.html)并使用它在我的应用程序中包含一个选择器。

我现在想要做的是合并2个功能,因为我的选择器列表中有很多项目。更具体地说,我想在我的html中的facebook列表选择对象上面放置一个“按名称过滤”文本框。当用户在“按名称过滤”文本框中键入几个字符时,我希望Facebook列表选择器中的项目仅显示包含键入字符的项目 - 有点类似于自动完成功能已经存在,而不是结果显示在文本输入框下方,我希望它们动态更新facebook列表对象。

这可行且相对简单吗?如果是这样,有人可以描述一下如何做到这一点吗?如果没有,是否有更简单的方法来解决这个问题?谢谢!

好的,对于Spencer Ruport的评论,我想我可能已经有了一个更具体的问题。下面是我的HTML文件中的当前Javascript(尖括号代表Django标签)。 #suggest1和#fcbklist都是分开的,但我怎样让他们互相交谈呢?我是否需要在我的HTML文件中进一步编写javascript,还是需要自定义插件'.js的内容?这有助于详细阐述吗?

$(document).ready(function(){ var names = [];     var count = 0;         {%for a,b,c in friends_for_picker%}             names [count] =“{{b}}”;             count = count + 1;         {%endfor%}

function findValueCallback(event, data, formatted) {
    $("<li>").html( !data ? "No match!" : "Selected: " + formatted).appendTo("#result");
}

function formatItem(row) {
    return row[0] + " (<strong>id: " + row[1] + "</strong>)";
}
function formatResult(row) {
    return row[0].replace(/(<.+?>)/gi, '');
}

$("#suggest1").autocomplete(names, {
    multiple: true,
    mustMatch: false,
    autoFill: true,
    matchContains: true,
});

  //id(ul id),width,height(element height),row(elements in row)        
  $.fcbkListSelection("#fcbklist","575","50","4");
});

3 个答案:

答案 0 :(得分:2)

如果您只想过滤fcbkListSelection项,则根本不需要自动完成,实现过滤器非常简单。

以下是我放在一起的样本。基本功能就在那里,但更完整的解决方案将涉及编辑fcbkListSelection代码 例如。尽管按预期过滤了列表,但当您单击某个项目以选择/取消选择它时,所有项目都会再次显示,这可能是不受欢迎的行为。
它并不像看起来那么令人生畏,插件代码很容易理解,并且添加这样一个简单的功能应该是无痛的。

托管演示: http://jsbin.com/ubeda(可通过http://jsbin.com/ubeda/edit进行编辑)

相关代码:

<input id="filter"/> 
<ul id="fcbklist"></ul> 

<script> 
  var $fcbklist = $('#fcbklist'); 

  var $listItems = $fcbklist.find('li'); 

  // id (ul id), width, height (element height), row (elements in row)         
  $.fcbkListSelection($fcbklist, 570, 50, 4); 

  $('#filter').keyup(function (){ 
    var $this = $(this); 

    var val = $this.val(); 

    /*** Show all the listItems when the filter is cleared ***/ 
    if (!val) { 
      $this.data('lastVal', val); 
      $listItems.show(); 
      return; 
    } 

    var lastVal = $this.data('lastVal'); 
    $this.data('lastVal', val); 
    /*** If the filter hasn't changed, do nothing ***/ 
    if(val === lastVal) { return; } 

    /*** Hide the results of the previous filter ***/ 
    $listItems.filter(':visible').hide(); 

    /*** 
      Show only the items of the current tab that match 
      the filter. 
    ***/ 
    var $tabItems; 
    switch($(".view_on").attr("id").replace("view_","")) { 
      case "all": 
        $tabItems = $listItems; 
        break; 
      case "selected": 
        $tabItems = $listItems.filter('[addedid]'); 
        break; 
      case "unselected": 
        $tabItems = $listItems.filter(':not([addedid])'); 
        break;   
    } 
    $tabItems.filter(':icontains(' + val + ')').show(); 
  }); 

  /*** 
    This is a custom pseudo-selector that selects 
    elements whose text contains the specified substring. 
    It is case-insensitive, unlike the built-in :contains selector. 
  ***/ 
  $.extend($.expr[':'], { 
    icontains: function(elem, i, match){ 
      return (new RegExp(match[3], 'im')).test($(elem).text()); 
    } 
  }); 
</script> 

答案 1 :(得分:1)

这是关于brianpeiris在上述解决方案中提到的问题的说明(否则看起来效果很好!)。

  

brianpeiris:“虽然名单是   单击时按预期过滤   在一个项目上选择/取消选择它,全部   这些项目再次显示   可能是不受欢迎的行为。“

要轻松解决此问题,只需删除fcbkListSelection.js中hiddenCheck函数的.show()部分。

示例:

var hiddenCheck = function(obj) {
    switch (curTab()) {
        case "all":
            //elem.children("li").show();
            break;

        case "selected":
            elem.children("li:not([addedid])").hide();
            //elem.children("li[addedid]").show();
            break;

        case "unselected":
            elem.children("li[addedid]").hide();
            //elem.children("li:not([addedid])").show();
            break;
    }
}

另请注意brianpeiris提供的原始代码存在问题。每当清除过滤器时,它将显示所有项目;无论当前选择的选项卡如何。请参阅下文以解决此问题。

替换此

/*** Show all the listItems when the filter is cleared ***/ 
if (!val) { 
  $this.data('lastVal', val); 
  $listItems.show(); 
  return; 
} 

有了这个

/*** Show all the listItems when the filter is cleared ***/
/*** ADDED: switch to fix error of always showing all entries ***/
if (!val) {
    $this.data('lastVal', val);
    switch ($(".view_on").attr("id").replace("view_", "")) {
        case "all":
            $listItems.show();
            break;
        case "selected":
            $listItems.filter('[addedid]').show();
            break;
        case "unselected":
            $tabItems = $listItems.filter(':not([addedid])').show();
            break;
    }
    return;
}

在此处更新: http://jsbin.com/ubeda/16

答案 2 :(得分:0)

绝对不是直截了当的。完全可能。我建议你熟悉Javascript语法并试一试。如果你有一个更具体的问题回到这里,你会发现很多人都渴望提供帮助。