jquery mobile:如何防止列表视图的标题行被过滤掉

jquery mobile:如何防止列表视图的标题行被过滤掉,jquery,listview,jquery-mobile,Jquery,Listview,Jquery Mobile,我正在创建一个jquery mobile listview,可以对其内容进行过滤,如下所示: <ul data-filter="true" ...> <li class='thisrowshouldnotbefilteredout'></li> <li>content to filter on</li> ...... ...... </ul> 要筛选的内容 ...... ...... 第一行是我的标题,当用户输入要

我正在创建一个jquery mobile listview,可以对其内容进行过滤,如下所示:

<ul data-filter="true" ...>
<li class='thisrowshouldnotbefilteredout'></li>
<li>content to filter on</li>
......
......
</ul>
  • 要筛选的内容
  • ...... ......

第一行是我的标题,当用户输入要过滤的文本时,我不希望它隐藏。是否有一个属性可以赋予此行,或者我是否必须覆盖基本回调函数以进行筛选?

您可以像这样覆盖筛选逻辑:

$("#mylist").listview('option', 'filterCallback', customSearch);

var customSearch = function(text, searchValue, item) {
    return text.toLowerCase().indexOf( searchValue) === -1;
}
为回调定义的任何函数都将提供三个参数。首先是当前列表项的文本,第二是要搜索的值,第三是要筛选的列表项。truthy值将导致隐藏列表项。下面介绍了默认回调函数,该函数过滤不包含searchValue作为子字符串的条目

使用它跳过标题li元素。根据需要修改它


关于这个例子和更多信息可以在这里找到:

我采取的另一个方法是实际更改jQuery移动代码中的一行

jquery.mobile.1-3.1.js中的第6846行

listItems = list.children( ":not(.ui-screen-hidden)" );

然后,只需将“no filter”类添加到您不希望被过滤的任何项目中

当然,您可以使用不同于类的逻辑,例如从不过滤第一个子级,或者使用data no filter=“true”属性


我想说,自定义回调显然是首选方法,因为如果您必须重新安装jQuery mobile,这可能会中断,但因为我们不会这么做,所以这是一个非常快速的解决方案。

您可以添加这样的代码,以添加对“数据无过滤器”属性的支持:

var origFilter = $.mobile.filterable.prototype.options.filterCallback;
  $.mobile.filterable.prototype.options.filterCallback = function(index, searchValue) {
    var origVal = origFilter.apply(this, arguments);

    if ($(this).attr('data-no-filter') === 'true') {
      return false;
    } else {
      return origVal;
    }
}

然后,在HTML中,您可以通过在元素上设置data no filter=“true”来防止项目被过滤。

我希望他们会准备一些东西,默认情况下跳过标题。一些我不知道的神奇数据属性!我猜这是唯一的路线。感谢您对回调进行的复习。没问题,我很乐意提供帮助。@Gajotres不知道为什么您说“为回调定义的任何函数都将提供三个参数”,而jQM API说“函数接受两个参数”参考:如果不涉及覆盖jQuery库,这是一个非常好的解决方案。我同意。在我们的用例中,我们从一开始就对jQuery mobile进行了大量的修改,因此进行这些修改并不是一个破坏者。
var origFilter = $.mobile.filterable.prototype.options.filterCallback;
  $.mobile.filterable.prototype.options.filterCallback = function(index, searchValue) {
    var origVal = origFilter.apply(this, arguments);

    if ($(this).attr('data-no-filter') === 'true') {
      return false;
    } else {
      return origVal;
    }
}