Spec-Zone.ru › jQuery Mobile

Фильтруемый виджет

Фильтруемый виджетверсия добавлена: 1.4

Описание: Делает потомков элемента фильтруемыми.

Быстрый навигатор

Параметры

children
classes
defaults
disabled
enhanced
filterCallback
filterPlaceholder
filterReveal
filterTheme
input

Методы

destroy
disable
enable
option
refresh

События

beforefilter
create
filter

Фильтруемый виджет

Фильтруемый виджет позволяет фильтровать потомков элемента. Фильтрация выполняется путём применения класса ui-screen-hidden к тем потомкам, для которых функция обратного вызова фильтра, предоставленная через параметр виджета filterCallback, возвращает true.

Обратная совместимость

Функции фильтруемого виджета, предоставленные для обратной совместимости, устарели начиная с 1.4.0 и будут удалены в 1.5.0.

Фильтруемый виджет является обобщением расширения фильтра виджета listview , которое было доступно в jQuery Mobile 1.3. Он сохраняет совместимость API с фильтром listview. Его поведение также сделано совместимым с предыдущими версиями благодаря следующим устаревшим функциям:

  • Если для фильтруемого виджета не предоставлен источник через атрибут data-input, он сгенерирует текстовое поле и разместит его перед элементом.
  • Он предоставляет параметр filterPlaceholder, который устанавливает атрибут placeholder на сгенерированное текстовое поле.
  • Он предоставляет параметр filterTheme, который устанавливает параметр theme на сгенерированное текстовое поле.
  • Если на элементе, чьи потомки должны быть отфильтрованы, инициализирован виджет collapsibleset, selectmenu, controlgroup или listview, он синхронизирует параметры этих виджетов с сгенерированным текстовым полем, которое также предоставляет виджет текстового поля (например, такие параметры, как "corners" или "mini").
  • Он обеспечивает специальную обработку для списков:
    • При фильтрации элементов списка виджет по умолчанию не будет скрывать элементы списка, помеченные как разделители, но
    • При фильтрации элементов списка виджет включает параметр hidedividers виджета списка, что приводит к автоматическому скрытию разделителей в категориях, где все элементы скрыты, благодаря новому расширению hidedividers.
    Вместе эти два поведения воспроизводят поведение фильтра списка jQuery Mobile 1.3.

Настройка

Чтобы сделать потомков элемента фильтруемыми, выполните следующие действия:

  1. Создайте элемент, который будет служить источником для фильтруемого виджета. Это может быть любой элемент, который генерирует сигнал change и имеет значение, которое можно получить с помощью плагина jQuery .val(). Обычно это текстовое поле. Виджет реагирует на сигнал change , читая значение поля ввода после небольшой задержки и итерируя по всем потомкам, чтобы определить, следует ли их отображать или скрывать в соответствии с функцией обратного вызова фильтра, предоставленной.
  2. Добавьте атрибут data-filter="true" к элементу, чьи потомки будут отфильтрованы.
  3. Добавьте атрибут data-input к элементу, чьи потомки будут отфильтрованы. Значение атрибута — строка, содержащая селектор jQuery, который вернёт элемент, используемый в качестве источника фильтруемого виджета.
  4. Добавьте дочерние элементы, которые будут отфильтрованы. Вы можете добавлять или удалять дочерние элементы в любое время, однако, когда вы добавляете или удаляете дочерние элементы, вы должны вызвать метод refresh на фильтруемом виджете, чтобы гарантировать, что новые потомки отображаются или скрываются в соответствии с последним введённым значением.

    Дочерние элементы могут иметь атрибут data-filtertext. В этом случае функция обратного вызова фильтра по умолчанию будет скрывать заданный дочерний элемент только в том случае, если значение атрибута data-filtertext не содержит введенную пользователем строку. Если атрибут data-filtertext отсутствует, дочерний элемент будет скрыт, если его текстовое содержимое не содержит введенной пользователем строки.

Приведённый ниже пример демонстрирует простую настройку фильтруемого виджета.
<form>
  <input type="text" data-type="search" id="filterable-input">
</form>
<form data-role="controlgroup" data-filter="true" data-input="#filterable-input">
  <label for="pizza">
    Pizza
    <input type="checkbox" id="pizza">
  </label>
  <label for="goulash">
    Goulash
    <input type="checkbox" id="goulash">
  </label>
  <label for="falafel">
    Falafel
    <input type="checkbox" id="falafel">
  </label>
  <label for="spring-rolls">
    Spring Rolls
    <input type="checkbox" id="spring-rolls">
  </label>
</form>

Режим "Показать"

Нормальное начальное состояние фильтруемого виджета — все потомки отображаются. В отличие от этого, фильтруемый виджет в режиме "Показать" изначально скрывает всех своих потомков. Однако, как только пользователь начинает фильтрацию, фильтруемый виджет отобразит только тех потомков, которые содержат введённый пользователем текст, независимо от того, находится ли фильтруемый виджет в режиме "Показать" или нет.

Чтобы включить режим "Показать", добавьте атрибут data-filter-reveal="true" к элементу, чьи потомки будут отфильтрованы.

Пример ниже иллюстрирует поведение фильтруемого виджета в режиме "Показать":

<form>
  <input type="text" data-type="search" id="filterable-input">
</form>
<form data-role="controlgroup" data-filter-reveal="true" data-filter="true" data-input="#filterable-input">
  <label for="pizza">
    Pizza
    <input type="checkbox" id="pizza">
  </label>
  <label for="goulash">
    Goulash
    <input type="checkbox" id="goulash">
  </label>
  <label for="falafel">
    Falafel
    <input type="checkbox" id="falafel">
  </label>
  <label for="spring-rolls">
    Spring Rolls
    <input type="checkbox" id="spring-rolls">
  </label>
</form>

Пользовательские фильтры

Параметр filterCallback фильтруемого виджета позволяет задать пользовательскую функцию обратного вызова. В примере ниже элементы фильтруются по их порядковому номеру, который можно указать с использованием соглашений о печати страниц, таких как "1,2" или "4-9", или оба ("1,2,4-9,12").

$.mobile.filterable.prototype.options.filterCallback = function( index, searchValue ) {
  var idx;
 
  if ( searchValue ) {
    searchValue = searchValue.split( "," );
    searchValue = $.map( searchValue, function( element ) {
      var ar = element.split( "-" );
        return ar.length === 1 ? parseInt( element ) :
          [ [ parseInt( ar[ 0 ] ), parseInt( ar[ 1 ] ) ] ];
    });
    for ( idx = 0 ; idx < searchValue.length ; idx++ ) {
      if ( ( $.type( searchValue[ idx ] ) === "number" &&
          index === searchValue[ idx ] ) ||
        ( $.type( searchValue[ idx ] ) === "array" &&
          index >= searchValue[ idx ][ 0 ] &&
          index <= searchValue[ idx ][ 1 ] ) ) {
        return false;
      }
    }
  }
 
  return !!searchValue;
};

Предоставление предварительно отрендеренной разметки

Вы можете улучшить время загрузки страницы, предоставив разметку, которую фильтруемый виджет обычно создаёт во время своей инициализации.

Предоставив эту разметку самостоятельно и указав это, установив атрибут data-enhanced="true", вы сообщите фильтруемому виджету пропустить эти манипуляции с DOM во время инициализации и предположить, что требуемая структура DOM уже присутствует.

При предоставлении такой предварительно отрендеренной разметки вы также должны установить все классы, которые обычно устанавливает фреймворк, и вы также должны установить все атрибуты данных, значения которых отличаются от значения по умолчанию, чтобы указать, что предварительно отрендеренная разметка отражает значение параметра виджета, отличное от значения по умолчанию.

Фильтруемый виджет выполняет фильтрацию по своим потомкам при инициализации, чтобы гарантировать, что начальный список отображаемых потомков соответствует начальному значению источника ввода. Установив атрибут data-enhanced="true", вы указываете фильтруемому виджету, что начальная фильтрация не должна выполняться. Это означает, что вы должны применить класс ui-screen-hidden к любым потомкам, которые должны быть изначально скрыты из-за начального значения поля поиска.

Примечание: Если элемент, чьи потомки должны быть отфильтрованы, также улучшен другим виджетом, например, listview или controlgroup, то вам необходимо предоставить предварительно отрендеренную разметку и для другого виджета, поскольку атрибут data-enhanced="true" повлияет на поведение инициализации и другого виджета.

В примере ниже предоставлена предварительно отрендеренная разметка для фильтруемого виджета. Атрибут data-filter-reveal="true" явно указан, поскольку присутствие класса ui-screen-hidden у всех потомков указывает на то, что они изначально скрыты. Виджет controlgroup, содержащий потомков, также предварительно отрендерен, поскольку атрибут data-enhanced="true" применим к виджету controlgroup в той же мере, как и к фильтруемому виджету.

<form>
  <input id="pre-rendered-filterable" data-type="search">
</form>
<div
  class="ui-controlgroup ui-controlgroup-vertical ui-corner-all"
  data-role="controlgroup"
  data-filter="true"
  data-input="#pre-rendered-filterable"
  data-filter-reveal="true"
  data-enhanced="true">
  <div class="ui-controlgroup-controls">
    <a href="index.html" class="ui-screen-hidden" data-role="button">General</a>
    <a href="settings.html" class="ui-screen-hidden" data-role="button">Settings</a>
    <a href="advanced.html" class="ui-screen-hidden" data-role="button">Advanced</a>
    <a href="notifications.html" class="ui-screen-hidden" data-role="button">Notifications</a>
  </div>
</div>

Параметры

children

Type: String or jQuery or Function() or Element
Default: "> li, > option, > optgroup option, > tbody tr, > .ui-controlgroup-controls > .ui-btn, > .ui-controlgroup-controls > .ui-checkbox, > .ui-controlgroup-controls > .ui-radio"
Предоставляет список дочерних элементов, которые будут обработаны во время фильтрации. Если в результате проверки значения этого параметра дочерние элементы не найдены, будут использованы дочерние элементы элемента, из которого создан этот виджет filterable.

Этот параметр также доступен как атрибут данных: data-children=".my-children".

Поддерживается несколько типов:
  • String: Селектор jQuery, который будет использоваться для выбора дочерних элементов.
  • jQuery: Объект jQuery, содержащий список элементов для фильтрации.
  • Function: Функция, которая возвращает объект jQuery, содержащий список элементов для фильтрации. Она будет вызываться без аргументов всякий раз, когда требуется выполнить фильтрацию.
  • Element: Элемент DOM. Это тривиальное применение фильтра.
Примеры кода:

Инициализация filterable с указанным параметром children:

$( ".selector" ).filterable({
  children: ".my-children"
});

Получение или установка параметра children после инициализации:

// Getter
var children = $( ".selector" ).filterable( "option", "children" );
 
// Setter
$( ".selector" ).filterable( "option", "children", ".my-children" );

classes

Type: Object
Default:
{}

Указывает дополнительные классы, которые нужно добавить к элементам виджета. Любые классы, указанные в разделе Тема, могут использоваться как ключи для переопределения их значения. Чтобы узнать больше об этом параметре, ознакомьтесь со статьей статьей о параметре classes.

Примеры кода:

Инициализация filterable с указанным параметром classes, изменение темы для класса ui-filterable:

$( ".selector" ).filterable({
  classes: {
    "ui-filterable": "highlight"
  }
});

Получение или установка свойства параметра classes после инициализации, здесь чтение и изменение темы для класса ui-filterable:

// Getter
var themeClass = $( ".selector" ).filterable( "option", "classes.ui-filterable" );
 
// Setter
$( ".selector" ).filterable( "option", "classes.ui-filterable", "highlight" );

defaults

Type: Boolean
Default: false
Установка этого параметра в true указывает на то, что другие параметры виджетов имеют значения по умолчанию, и заставляет код автоматического улучшения виджетов jQuery Mobile опускать шаг, на котором он извлекает значения параметров из атрибутов данных. Это может улучшить время запуска.

Этот параметр также доступен как атрибут данных: data-defaults="true".

Примеры кода:

Инициализация filterable с указанным параметром defaults:

$( ".selector" ).filterable({
  defaults: true
});

Получение или установка параметра defaults после инициализации:

// Getter
var defaults = $( ".selector" ).filterable( "option", "defaults" );
 
// Setter
$( ".selector" ).filterable( "option", "defaults", true );

disabled

Type: Boolean
Default: false
Отключает filterable, если установлен в true.

Этот параметр также доступен как атрибут данных: data-disabled="true".

Примеры кода:

Инициализация filterable с указанным параметром disabled:

$( ".selector" ).filterable({
  disabled: true
});

Получение или установка параметра disabled после инициализации:

// Getter
var disabled = $( ".selector" ).filterable( "option", "disabled" );
 
// Setter
$( ".selector" ).filterable( "option", "disabled", true );

enhanced

Type: Boolean
Default: false
Указывает, что разметка, необходимая для виджета filterable, была предоставлена как часть исходной разметки.

Этот параметр также доступен как атрибут данных: data-enhanced="true".

Примеры кода:

Инициализация filterable с указанным параметром enhanced:

$( ".selector" ).filterable({
  enhanced: true
});

Получение или установка параметра enhanced после инициализации:

// Getter
var enhanced = $( ".selector" ).filterable( "option", "enhanced" );
 
// Setter
$( ".selector" ).filterable( "option", "enhanced", true );

filterCallback

Type: Function( Number index, String searchValue )
Default: default callback
Функция, которая будет вызываться для определения того, считается ли элемент в списке дочерних элементов отфильтрованным. Она должна возвращать true, если элемент должен быть отфильтрован, и она должна возвращать false, если элемент должен быть показан. Функция вызывается один раз для каждого из элементов DOM, и ее контекст устанавливается в элемент DOM, для которого необходимо принять решение. Таким образом, ключевое слово this относится к элементу DOM, для которого необходимо решить, следует ли его показывать.

Значение этого атрибута по умолчанию - функция, которая будет проверять каждый дочерний элемент на наличие атрибута data-filtertext. Если такой атрибут найден, функция возвращает true, если строка, содержащаяся в параметре функции searchValue, не может быть найдена внутри значения атрибута data-filtertext. Если такого атрибута не найдено, текстовое содержимое дочернего элемента проверяется на наличие значения параметра функции searchValue, и функция возвращает true, если поиск завершается неудачей.

Для обратной совместимости с расширением фильтра listview jQuery Mobile 1.3 функция, предоставленная в качестве значения этого атрибута по умолчанию, никогда не будет скрывать разделители listview, однако, это поведение устарело начиная с jQuery Mobile 1.4.0 и будет удалено в jQuery Mobile 1.5.0.

Вы можете предоставить пользовательский обратный вызов, если вам нужно обрабатывать дочерние элементы особым образом.

filterPlaceholder

Type: String
Default: "Filter items..."
Этот параметр устарел в версии 1.4.0 и будет удален в версии 1.5.0.

Строка, которая будет использоваться в качестве значения атрибута placeholder для созданного текстового поля ввода.

Этот параметр также доступен как атрибут данных: data-filter-placeholder="Refine options...".

(устаревшая версия: 1.4.0)
Примеры кода:

Инициализация filterable с указанным параметром filterPlaceholder:

$( ".selector" ).filterable({
  filterPlaceholder: "Refine options..."
});

Получение или установка параметра filterPlaceholder после инициализации:

// Getter
var filterPlaceholder = $( ".selector" ).filterable( "option", "filterPlaceholder" );
 
// Setter
$( ".selector" ).filterable( "option", "filterPlaceholder", "Refine options..." );

filterReveal

Type: Boolean
Default: false
При установке в true все дочерние элементы скрываются, когда поисковая строка пуста.

Этот параметр также доступен как атрибут данных: data-filter-reveal="true".

Примеры кода:

Инициализация filterable с указанным параметром filterReveal:

$( ".selector" ).filterable({
  filterReveal: true
});

Получение или установка параметра filterReveal после инициализации:

// Getter
var filterReveal = $( ".selector" ).filterable( "option", "filterReveal" );
 
// Setter
$( ".selector" ).filterable( "option", "filterReveal", true );

filterTheme

Type: String
Default: null, inherited from parent
Этот параметр устарел в версии 1.4.0 и будет удален в версии 1.5.0.

Устанавливает цветовую схему (палитру) для созданного текстового поля ввода. Он принимает одну букву от a до z, которая сопоставляется с палитрами, включенными в вашу тему.

Возможные значения: буква палитры (a-z).

Если виджет collapsibleset, selectmenu, controlgroup или listview создан для элемента и его параметры синхронизируются с параметрами созданного текстового поля ввода, то значение этого параметра, если оно установлено, имеет приоритет перед значением параметра theme, извлеченным из виджета.

Этот параметр также доступен как атрибут данных: data-filter-theme="b".

(устаревшая версия: 1.4.0)
Примеры кода:

Инициализация filterable с указанным параметром filterTheme:

$( ".selector" ).filterable({
  filterTheme: b
});

Получение или установка параметра filterTheme после инициализации:

// Getter
var filterTheme = $( ".selector" ).filterable( "option", "filterTheme" );
 
// Setter
$( ".selector" ).filterable( "option", "filterTheme", b );

input

Type: String or jQuery or Element
Default: null
Предоставляет элемент, который будет служить источником ввода для поисковых строк.

Этот параметр также доступен как атрибут данных: data-input="#input-for-filterable".

Поддерживается несколько типов:
  • String: Селектор jQuery, который будет использоваться для получения элемента, который будет служить источником ввода.
  • jQuery: Объект jQuery, содержащий элемент, который будет служить источником ввода.
  • Element: Элемент, который будет служить источником ввода.
Примеры кода:

Инициализация filterable с указанным параметром input:

$( ".selector" ).filterable({
  input: "#input-for-filterable"
});

Получение или установка параметра input после инициализации:

// Getter
var input = $( ".selector" ).filterable( "option", "input" );
 
// Setter
$( ".selector" ).filterable( "option", "input", "#input-for-filterable" );

Методы

destroy()Возвращает: jQuery (только для плагинов)

Полностью удаляет функциональность фильтрации. Это вернет элемент в состояние до инициализации.
  • Этот метод не принимает аргументы.
Примеры кода:

Вызов метода destroy:

$( ".selector" ).filterable( "destroy" );

disable()Возвращает: jQuery (только для плагинов)

Отключает фильтр.
  • Этот метод не принимает аргументы.
Примеры кода:

Вызов метода disable:

$( ".selector" ).filterable( "disable" );

enable()Возвращает: jQuery (только для плагинов)

Включает фильтр.
  • Этот метод не принимает аргументы.
Примеры кода:

Вызов метода enable:

$( ".selector" ).filterable( "enable" );

option( optionName )Возвращает: Объект

Возвращает значение, текущее для указанного optionName.
  • optionName
    Тип: Строка
    Имя опции для получения.
Примеры кода:

Вызов метода:

var isDisabled = $( ".selector" ).filterable( "option", "disabled" );

option()Возвращает: Объект

Возвращает объект, содержащий пары ключ/значение, представляющие текущий хэш опций filterable.
  • Эта сигнатура не принимает аргументы.
Примеры кода:

Вызов метода:

var options = $( ".selector" ).filterable( "option" );

option( optionName, value )Возвращает: jQuery (только для плагинов)

Устанавливает значение опции filterable, связанной с указанным optionName.
  • optionName
    Тип: Строка
    Имя опции для установки.
  • value
    Тип: Объект
    Значение для установки опции.
Примеры кода:

Вызов метода:

$( ".selector" ).filterable( "option", "disabled", true );

option( options )Возвращает: jQuery (только для плагинов)

Устанавливает одну или несколько опций для filterable.
  • options
    Тип: Объект
    Карта пар опция-значение для установки.
Примеры кода:

Вызов метода:

$( ".selector" ).filterable( "option", { disabled: true } );

refresh()Возвращает: jQuery (только для плагинов)

Обновляет виджет filterable.

Если вы изменяете виджет filterable через JavaScript (например, добавляя новых или удаляя старых дочерних элементов), вам необходимо вызвать метод refresh() для обновления визуального оформления.

  • Этот метод не принимает аргументы.
Примеры кода:

Вызов метода refresh:

$( ".selector" ).filterable( "refresh" );

События

beforefilter( event )Тип: filterablebeforefilter

Срабатывает перед началом фильтрации виджетом списка дочерних элементов.
  • event
    Тип: Событие

Примечание: Объект ui пуст, но включен для соответствия другим событиям.

Примеры кода:

Инициализация filterable с указанным обратным вызовом beforefilter:

$( ".selector" ).filterable({
  beforefilter: function( event, ui ) {}
});

Привязка обработчика событий к событию filterablebeforefilter:

$( ".selector" ).on( "filterablebeforefilter", function( event, ui ) {} );

create( event, ui )Тип: filterablecreate

Срабатывает при создании filterable.
  • event
    Тип: Событие
  • ui
    Тип: Объект

Примечание: Объект ui пуст, но включен для соответствия другим событиям.

Примеры кода:

Инициализация filterable с указанным обратным вызовом create:

$( ".selector" ).filterable({
  create: function( event, ui ) {}
});

Привязка обработчика событий к событию filterablecreate:

$( ".selector" ).on( "filterablecreate", function( event, ui ) {} );

filter( event, ui )Тип: filterablefilter

Срабатывает после того, как виджет выполнил фильтрацию списка дочерних элементов. Параметр ui содержит список обработанных дочерних элементов.
  • event
    Тип: Событие
  • ui
    Тип: Объект
    • items
      Тип: jQuery
      Объект jQuery-коллекции, содержащий элементы, по которым был выполнен фильтр.
Примеры кода:

Инициализация filterable с указанным обратным вызовом filter:

$( ".selector" ).filterable({
  filter: function( event, ui ) {}
});

Привязка обработчика событий к событию filterablefilter:

$( ".selector" ).on( "filterablefilter", function( event, ui ) {} );

© The jQuery Foundation and other contributors
Licensed under the MIT License.
https://api.jquerymobile.com/filterable

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API