Chosen: поддержка обязательных атрибутов html5?

Созданный на 4 мар. 2012  ·  80Комментарии  ·  Источник: harvesthq/chosen

Когда selected инициализируется на входе select, он добавляет [style = " display: none "] к тегу select и создает различные необходимые теги div, как показано ниже.

<select name="country" id="country" style="display: none; " class="chzn-done">
    <option selected="selected" value=""></option>
    ...
</select>

Это нормально, но у нас возникнет проблема, если я добавлю атрибут html5 'required' в свой тег select, который создает следующую разметку после инициализации selected:

<select name="country" id="country" required="required" style="display: none; " class="chzn-done">
<option selected="selected" value=""></option>
...
</select>

Проблема возникает, когда пользователь отправляет форму, не выбирая значение. Пользователю кажется, что браузер ничего не делает. Фактически, он отображает сообщение об ошибке для пользователя, чтобы выбрать значение, но поскольку CSS инструктирует браузер не отображать элемент select, сообщение об ошибке также не появляется.

Это происходит в Chrome, я не уверен в поведении других браузеров.

Я не копал достаточно глубоко, чтобы предложить решение, но это проблема, поскольку мы начинаем включать атрибуты html5 в наши формы.

Feature Request

Самый полезный комментарий

+1

Может ли кто-нибудь исправить это? Это довольно старая проблема и очень важная функциональность в настоящее время. Спасибо.

Все 80 Комментарий

Я тоже недавно заметил эту проблему.
Обязательный не поддерживается во всех браузерах, поэтому я создал резервный вариант, чтобы перебирать элементы формы при отправке и проверять, есть ли там какое-то значение, когда присутствует «требуется».
Проблема все еще существует в Chrome, потому что скрытый выбор не имеет значения и не предупреждает пользователя в соответствии с документами webkit:
http://trac.webkit.org/wiki/Styling%20Form%20Controls

«Сообщение проверки состоит из четырех элементов div с псевдоклассами и некоторых узлов для текста сообщения. Вы можете настроить внешний вид, изменив стиль этих псевдоклассов».

Я думаю, что лучший способ справиться с этим - выбрать создание дополнительной разметки для их визуализированного выбора с аналогичными классами, чтобы они были стилизованы по умолчанию в браузере, или потенциально добавлять псевдоэлементы к элементам, которые не прошли проверку с помощью используя соответствующие неудачные условия в CSS, например: invalid.

На данный момент похоже, что ваш единственный вариант - иметь запасной вариант на уровне DOM, такой как мое решение javascript. Я могу предоставить его здесь, если это будет полезно, но на самом деле это запасной вариант, а не способ исправить выбранный фреймворк.

Каков статус по этой проблеме? У меня точно такая же проблема с последней версией Firefox (14.0.1)

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

У меня такая же проблема. Мне было бы любопытно узнать ваше запасное решение.

Спасибо

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

  • Если элемент формы недействителен (ничего не выбрано), браузеры поднимут небольшой флажок, показывающий позицию ошибки, с сообщением о необходимости заполнения этого поля. При выборе в Firefox этот флаг сообщения находится в нижнем левом углу окна браузера.
  • Для недопустимых полей формы не определен стиль. По умолчанию в Firefox (это зависит от браузеров, но все они делают что-то похожее) вы получаете эффект красного свечения вокруг каждого недопустимого поля формы. Выбранные поля выбора ничего не получают.

Первый пункт является более проблемным. Можно ли это исправить, используя другой метод скрытия элемента select? Замена « display: none » в скрытом элементе select на «position: absolute; visibility: hidden;» становится довольно близко - хотя это будет больше зависеть от окружающего CSS ...

Однако это не работает для Webkit. Кажется, что флаг ошибки наследует стили поля выбора в webkit (Chrome), поэтому, если вы установите непрозрачность: .5, флаг также будет иметь непрозрачность .5 (как один пример). облом.

Еще одно - Opera работает правильно как есть, но если я изменю ее на CSS, основанный на приведенной выше позиции, то она не будет работать правильно. Вот это боль.

Извините за спам. Я думаю, что понял! Если вы заключите элемент select в диапазон и используете этот CSS в оболочке (и удалите display: none в элементе select):

width: 0px;
height: 0px;
overflow: hidden;
display: inline-block;
position: absolute;

Вы получите сообщение об ошибке и при этом не прервете поток страницы. Единственная проблема заключается в том, что вам нужно оставить поле видимым, чтобы увидеть сообщение об ошибке, потому что Firefox и WebKit скроют это сообщение, если вы этого не сделаете. Это заставляет поле выбора получать вкладки через форму.

Способом обойти это может быть переключение отображения с none на inline-block при отправке (или «недопустимом» событии), а затем обратно на определенные события ввода (например, нажатие мыши или нажатие клавиши).

Также существует небольшая проблема с позиционированием, которую можно решить, заставив позицию находиться непосредственно под выбранным окном.

Было бы неплохо увидеть какую-то встроенную поддержку для этого, если это вообще возможно.

Я написал патч здесь: https://github.com/adcSTUDIO/chosen

Он может быть недостаточно надежным для включения, но не стесняйтесь его протестировать.

Спасибо @CaptainN! Я проверю это!

@CaptainN , у меня все заработало - спасибо за эти изменения. Однако знаете ли вы, как разрешить ширине всплывающих окон с ошибками превышать ширину самих полей выбора? На некоторых из моих меньших элементов select сообщение об ошибке очень тонкое, что не совсем хорошо выглядит, а на некоторых может даже быть трудночитаемым.

Если нет, ничего страшного, вы уже помогли тонне с этим. Спасибо еще раз!

@caderade Я не знаю, как решить эту проблему. Я попробовал overflow: visible и еще пару вещей, и он все еще не виден. Я попробую еще несколько вещей, но это похоже на проблему с Firefox, которая может не иметь обходного пути (с этими флагами, как правило, довольно сложно справиться с, наряду с этим свечением, которое я еще не нашел способ полностью стилизовать).

@CaptainN : Очень хорошо.

У меня он неплохо работает в Firefox 17 и Chrome 23.

В IE 8 + 9 (который вообще не поддерживает проверку формы HTML5) при изменении значения поля я получаю ошибку JavaScript из-за использования неизвестного селектора :valid . Таким образом, сценарий прерывается, и форма никак не искажается, чего я ожидал в IE. : smirk: Но лучше не поднимать ошибку. Любая идея?

Какая досада. Я действительно полагаю, что jQuery защитит меня больше! Придется добавить проверку IE или что-то в этом роде ...

Кевин Н.

@CaptainN У меня

Похоже, что jQuery имеет встроенную поддержку псевдоселектора и систему перехватов, поэтому плагины могут добавлять свои собственные, и если они не находят их, они передают их базовой реализации - поэтому: required и: valid выдает ошибку в IE (и, возможно, в некоторых версиях Safari), если они не были полифилированы. Я посмотрю, смогу ли я использовать альтернативный вид проверки вместо использования псевдоселекторов. Похоже, я могу просто проверить attr ("required") для замены: required - мне, вероятно, придется выполнить какое-то определение функции для: valid, хотя - может быть, проверить свойство .oninvalid?

Хорошо, у меня есть новый патч, который исправляет ошибку IE (и должен исправить ее также в любых других браузерах). Этот патч меняет несколько вещей (вы ничего не заметите). Вот мои заметки:

  • соответствует стилю кодирования обработчиков событий, присутствующих в версии jquery (привязка вместо включения и т. д.)
  • Я не могу заставить версию прототипа скрыть элемент select при проверке - похоже, что событие изменения элемента формы каким-то образом подавляется (иначе работает) - я думаю, что это ошибка, но не та, которую я представил. Необходимо дальнейшее расследование.
  • Есть некоторые незначительные особенности позиционирования недопустимого элемента, которые иногда могут нуждаться в ручном вмешательстве пользователя через CSS (проблема возникает только при использовании необходимой функции).
  • поля выбора с короткой шириной заканчиваются сглаженными необходимыми флагами в браузере (также проблема с элементами выбора vanilla, если вы устанавливаете ширину через css). Я не могу найти обходной путь (дайте мне знать, если вы это сделаете!) Может быть, рассмотрите его с Mozilla, так как это произойдет и с ванильными коробками. Кроме того, может быть, проверить их расширения css? https://developer.mozilla.org/en-US/docs/CSS/CSS_Reference/Mozilla_Extensions?redirectlocale=en-US&redirectslug=CSS_Reference%2FMozilla_Extensions (я ничего не нашел с первого взгляда)
  • Я не могу заставить uglifyjs работать в Windows (поэтому сборки .min.js не обновляются в моем репо) - завтра я попробую сборку из OSX.

@CaptainN Что касается вашей проблемы с UglifyJS, убедитесь, что вы установили версию 1, поскольку версия 2 не является BC. # 915 обновляет файл packages.json

Как переключить версию с помощью npm?

@CaptainN npm install uglify-js@1 чтобы принудительно установить IIRC версии 1 (но я не эксперт по узлам ). Другое решение - проверить мою ветку и запустить npm install с обновленным файлом packages.json.

Мне удалось собрать uglified версии на моем рабочем Mac (может быть, у него более старая версия uglify-js?). Теперь они обновлены в моем репо.

В настоящее время я использую только разновидность jQuery. Больше нет ошибок скрипта в IE8 / 9. : +1: за то, что скоро увидим эту функцию в апстриме.

Мы тоже сталкиваемся с этой проблемой. Есть ли обходной путь, кроме отключения проверки HTML5?
@CaptainN исправил это из того, что я читал. Поэтому я попробовал его файл selected.jquery.js в главной ветке. Но это дает js-ошибку msie undefined.

Я думал, что исправил это. Эта вилка появилась недавно, и, возможно, ее нужно обновить. Я посмотрю, смогу ли я добраться до этого на этой неделе, и изучу ошибку IE.

Я синхронизировал этот восходящий поток и не видел сообщений об неопределенных ошибках в IE. Попробуйте еще раз мое репо и дайте мне знать, если вы все еще видите эту проблему. (извините, это заняло так много времени)

Спасибо!

: +1:

Может ли кто-нибудь подвести итог для меня? Есть ли вилка или патч, готовый к производству?

Вместе с этим есть запрос на вытягивание - # 900, который потянет мою вилку adcSTUDIO / Chosen.

Вместо того, чтобы скрывать исходное поле выбора - когда требуется выбор и когда возникает ошибка, патч помещает поле выбора под полем выбора Выбрано, так что встроенное сообщение об ошибке HTML5 появляется в правильном месте. Изменить: я, вероятно, должен отметить, что если поле не помечено как «обязательное» и никогда не становится недействительным, существующее поведение сохраняется.

Этот запрос на перенос не добавляет никаких дополнительных функций, кроме отображения встроенных уведомлений об ошибках HTML5.

Спасибо, Кевин!

29.07.2013 Кевин Ньюман [email protected]

Вместе с этим есть запрос на вытягивание - # 900 https://github.com/harvesthq/chosen/issues/900, который потянет мою вилку adcSTUDIO / Chosen.

Вместо того, чтобы скрывать исходное поле выбора - когда требуется выбор,
и при возникновении ошибки патч помещает поле выбора под
поле выбора Выбрано, чтобы встроенное сообщение об ошибке HTML5 отображалось в
правильное расположение.

Этот запрос на перенос не добавляет никаких дополнительных функций, кроме
отображение встроенных уведомлений об ошибках HTML5.

-
Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/harvesthq/chosen/issues/515#issuecomment -21750086
.

Урс Брам
Веб-сайты macht

lic. Фил. я

Theaterplatz 2
3011 Берн
Тел. Büro: +41 31 311 73 61
Тел. Мобильный и Combox: +41 76 327 01 51
http://www.ursbraem.ch

Приват:
Beundenfeldstr. 50
3013 Берн
Т +41 31 301 41 90

Привет,
Я только что получил последнюю версию (1.0), но проблема все еще не устранена. Когда выбранный элемент добавляется в поле выбора с обязательным атрибутом, в Firefox всплывающая подсказка «выберите элемент из списка» появляется в верхнем левом углу экрана. В Chrome вообще ничего не происходит. Запрос на вытягивание не интегрирован с версией 1.0? Как я могу скачать этот патч? Извините, я больше не знаком с Github, заранее спасибо!

Не думаю, что мои изменения были объединены. Моя вилка, наверное, тоже нуждается в обновлении - это было давно.

Ах, это очень плохо. Есть идеи, есть ли он в главном конвейере ветвления? Есть какие-нибудь предложения, как заставить это работать тем временем?

Я понятия не имею, планируют ли они интегрировать это в мастер, но что вы можете сделать, так это использовать мою вилку и синхронизировать ее с мастером, и это даст вам обновление на сегодняшний день, извлеченное из их репо, с примененными моими изменениями (при условии, что никаких конфликтов) - или просто воспользуйтесь моей несколько устаревшей вилкой. К сожалению, в ближайшее время у меня не будет времени обновить вилку.

Вот моя вилка, кстати: https://github.com/adcSTUDIO/chosen

Спасибо, Кевин.


Ярон Гез
Главный архитектор программного обеспечения
MedAdaptics - http://medadaptics.com
(781) 767-7434

В среду, 27 ноября 2013 г., в 12:35 Кевин Ньюман [email protected] написал :

Вот моя вилка, кстати: https://github.com/adcSTUDIO/chosen

-
Ответьте на это письмо напрямую или просмотрите его на Gi tHubhttps: //github.com/harvesthq/chosen/issues/515#issuecomment -29403732
.

@CaptainN Вы открыли пиар своими изменениями? Я не вижу ссылки на пиар в этом обсуждении. И если нет PR для его проверки, маловероятно, что ваш форк будет рассмотрен (разработчики проверяют представленные вклады, что уже требует времени, поэтому они не будут пытаться найти неотправленные вклады)

Есть PR # 900 - это немного беспорядок - я, вероятно, мог бы в какой-то момент переустановить его и убрать его, если это поможет.

<выбрать обязательный> поддержка атрибутов для выбранного плагина

Привет!
Все очень и очень просто, и не нужно 2 года, чтобы это обсуждать :)
@CaptainN @yaronguez @stof @kenearley

Чтобы добавить правильное отображение сообщения об ошибке браузера с выбранным для <выбрать обязательный>, когда пользователь не выбирает какой-либо параметр,

  1. Удалить параметр display: none для тега select из кода JS плагина.
  2. Оберните тег <select> в обертку <div> , затем добавьте CSS position: relative; для этого <div> в вашем CSS.
  3. Добавить позицию: абсолютная; клипса: rect (0,0,0,0); чтобы скрыть тег <select> в JS-коде плагина.

Если вы не хотите тратить время на редактирование кода плагина, просто добавьте что-нибудь вроде setAttribute ('style', 'display: visible; position: absolute; clip: rect (0,0,0,0)'); после инициализации выбранного плагина.

Пример:

 function InitChosen () {
  $ ('select.chzn'). each (function (index) {
  $ (this) .chosen ({
  disable_search_threshold: 5,
  no_results_text: "Ничего не найдено!"
  });
  this.setAttribute ('стиль', 'отображение: видимое; положение: абсолютное; клип: прямоугольник (0,0,0,0)');
  });
 }

Это все. Ааааа а теперь ... ДИСКО! :)
** Для браузеров, поддерживающих атрибут «обязательный».

Хром

--2

Fire Fox

--1

@Aharito Разве мы не

Спасибо @Aharito, он отлично работает с выбранной версией v1.1.0, просто замените $('select.chzn') на $('.chosen-select') .

Я подумал, что попробовал этот трюк с clip: rect, и обнаружил в нем некоторую проблему. Может быть, с более старым браузером? Думаю, если сейчас он работает, это здорово.

Я думаю, что в моем решении могут быть проблемы с вкладками (я не помню, это было давно) - я уменьшил влияние, применив патч только к полям, которые представляют требуемый атрибут.

Мы стандартизировали это для всех вызовов $().chosen()

$.fn.oldChosen = $.fn.chosen
$.fn.chosen = function(options) {
  var select = $(this)
    , is_creating_chosen = !options || _.isObject(options)

  if (is_creating_chosen && select.css('position') === 'absolute') {
    // if we are creating a chosen and the select already has the appropriate styles added
    // we remove those (so that the select hasn't got a crazy width), then create the chosen
    // then we re-add them later
    select.removeAttr('style')
  }

  var ret = select.oldChosen(options)

  if (is_creating_chosen) {
    // https://github.com/harvesthq/chosen/issues/515#issuecomment-33214050
    // only do this if we are initializing chosen (no params, or object params) not calling a method
    select.attr('style','display:visible; position:absolute; clip:rect(0,0,0,0)');
  }
  return ret
}

@ghiculescu Это не решает проблему табуляции или сдвига табуляции в выделении, не так ли?

@DASPRiD нет .

как насчет этого как возможного решения прикрытия.

он не идеален, но на самом деле он предотвращает появление исходного выбора, передавая фокус следующему выбранному диалоговому окну, но, возможно, это еще один шаг ближе

«selected-select» - это просто селектор для выбранных мной элементов с определенным классом, я не уверен, охватывает ли «фокус щелчка» все соответствующие события, на которые я должен подключиться, но, может быть, кто-нибудь может сказать, чего еще не хватает?

также возможно, что я неправильно понял что-то в выбранной структуре html и обнаружил ("a") слишком либеральным, у кого-нибудь есть больше опыта?

$(".chosen-select").on("click focus",function(event){
    $(this).next(".chosen-container").find("a").trigger(event.type);
});

ох, и обязательно " display: visible " должен быть " display: block " или что-то в этом роде? причина видимость: видимый действителен, но дисплей: видимый, я уверен, что нет

я обнаружил, что если у вас есть несколько элементов выбора рядом друг с другом в одном и том же контейнере, это перемещает их все в неправильное место, поэтому position: absolute заставляет сообщение проверки отображаться в неправильном положении.

Я решил это, отсоединив и снова прикрепив к выбранному контейнеру, например,

$(".chosen-select").each(function(){
    $(this).next(".chosen-container").prepend($(this).detach());
});

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

однако, если кто-нибудь решит это каким-либо образом, мне очень интересно узнать.

Хорошо, так что в дополнение к тому, что я пробовал раньше, я обнаружил, что выбранные события используются, и решил, что когда я сделаю какое-либо событие для теперь скрытого выбора, я могу захватить его и запустить выбранное событие, чтобы открыть его.

я думаю, это прекрасно работает.

$(".chosen-select").each(function(){
    //    take each select and put it as a child of the chosen container
    //    this mean it'll position any validation messages correctly
    $(this).next(".chosen-container").prepend($(this).detach());

    //    apply all the styles, personally, I've added this to my stylesheet
    $(this).attr("style","display:block!important; position:absolute; clip:rect(0,0,0,0)");

    //    to all of these events, trigger the chosen to open and receive focus
    $(this).on("click focus keyup",function(event){
        $(this).closest(".chosen-container").trigger("mousedown.chosen");
    });
});

Я думаю, что это лучшая версия, которая у меня есть. К счастью, это решает проблему перехода вперед, все еще существует обратное табуляция, вы не можете переходить назад через selected-select, потому что, когда вы переходите в элемент select, вы сразу же снова переключаетесь на выбранный контейнер, что означает, что вы ' re попал в ловушку только для того, чтобы перейти вперед.

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

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

К сожалению, я не смог заставить работать код от @christhomas . Я вызываю его в функции отправки без видимых результатов (также без ошибок).

Хорошие новости: новая функция от @ghiculescu работает как удовольствие, поскольку я все еще могу использовать выбранный файл CDN и просто использовать функцию в моем файле js.

@DASPRiD @charettes, что вы имеете в виду, вкладка не работает с измененной функцией? Кажется, у меня работает

Достаточно просто добавить tabindex: -1 к фрагменту select to @ghiculescu , решив проблему табуляции.

Пример: http://jsfiddle.net/hq7b426j/

Теперь я видел проблему! Ваше дополнение отлично работает @andreialecu

Между прочим, требовалось еще одно дополнение. На iPhone или других неподдерживаемых устройствах скрипка не работает должным образом. Chosen отключается на iPhone и оставляет <select> без изменений, а код в скрипте выше скроет его, не оставляя возможности взаимодействовать с выбранным элементом.

Эта скрипка исправляет это (добавляя проверку display: none):
http://jsfiddle.net/hq7b426j/1/

Ах, это даже лучше !! Спасибо! Я все еще тестирую, но опубликую, если что-нибудь еще появится

@CaptainN, расскажите, пожалуйста, у меня

@ vidhyaprakash85 Я не понимаю, что вы имеете в виду. Я сделал форк довольно давно и написал запрос на перенос (# 900), но репозитории сейчас не синхронизированы, а мой форк очень устарел. Вы можете найти его здесь, если это поможет: https://github.com/adcSTUDIO/chosen

я уже использую https://github.com/harvesthq/chosen, как это сделать :(

@andreialecu ваш код отлично работает! Благодарность!!!

Спасибо @christhomas, ваш код отлично поработал: dancer:

Ни @christhomas, ни @ghiculescu у меня не работали с использованием многогруппового выбора. пока оставим это на проверку сервера.

Когда я попробовал патч @ghiculescu , он работал, за исключением того, что прокрутка отображалась все время под полем выбора.
Когда я попробовал патч @christhomas, всплывающее окно появилось без открытия окна поиска.

Мне пришлось изменить скрипт @ghiculescu , чтобы я мог дважды назвать

target.find('select')
        .chosen('destroy')
        .chosen({disable_search_threshold: 10})

В противном случае во втором путешествии был удален стиль, добавленный в первом:

$.fn.oldChosen = $.fn.chosen
$.fn.chosen = function(options) {
  var select = $(this)
    , is_creating_chosen = !!options

    var style = 'display:visible; position:absolute; clip:rect(0,0,0,0);'

        if (is_creating_chosen && select.css('position') === 'absolute' && select.attr('style') != style) {
            // if we are creating a chosen and the select already has the appropriate styles added
            // we remove those (so that the select hasn't got a crazy width), then create the chosen
            // then we re-add them later
            select.removeAttr('style')
        }

        var ret = select.oldChosen(options)

        // only act if the select has display: none, otherwise chosen is unsupported (iPhone, etc)
        if (is_creating_chosen && select.css('display') === 'none') {
            // https://github.com/harvesthq/chosen/issues/515#issuecomment-33214050
            // only do this if we are initializing chosen (no params, or object params) not calling a method
            select.attr('style', style);
            select.attr('tabindex', -1);
        }
        return ret
}

Я просто добавил это дополнительное условие к первому, если: && select.attr('style') != style

@doganmeh Отлично работает в Chrome и на мобильных устройствах (с Chrome), но протестирован в Firefox 53.0, где он не работает

Даже этот http://jsfiddle.net/hq7b426j/1/ не работает в Firefox 53.0

Хммм, но это больше похоже на проблему Firefox, потому что, если вы нажмете кнопку больше раз, вы увидите, что Firefox пытается отобразить сообщение (но оно никогда не отображается полностью)

Я использовал это решение. Это очень просто и отлично работает:

<style>
    select.submitted:invalid + .chosen-container{
        border-color: red !important;
    }
</style>
$('#yourSelector').chosen({
                no_results_text: "yourText",
                disable_search_threshold: 9,
                search_contains: true
                //your parameters
    }).on('invalid', function(){
        $(this).addClass('submitted');
    });

кажется, что это не работает, если вы выбрали несколько вариантов:
http://jsfiddle.net/jeromax/o5a8aogh/

Я починил это.

`
$ .fn.oldChosen = $ .fn.chosen
$ .fn.chosen = function (options) {
var select = $ (это),
is_creating_chosen = !! варианты;

if (is_creating_chosen && select.css ('position') === 'absolute') {
// если мы создаем selected, а в select уже добавлены соответствующие стили
// мы удаляем их (чтобы выделенная область не имела сумасшедшей ширины), затем создаем выбранную
// затем мы повторно добавляем их позже
select.removeAttr ('стиль');
}

var ret = select.oldChosen (параметры)

// действовать только в том случае, если для выбора есть display: none, иначе выбранный вариант не поддерживается (iPhone и т. д.)
if (is_creating_chosen && select.css ('display') === 'none') {
// https://github.com/harvesthq/chosen/issues/515#issuecomment -33214050
// делаем это только в том случае, если мы инициализируем selected (без параметров или параметров объекта), а не вызываем метод

  $(this).each(function(index){
      if($(this)[0].multiple==true){
          $(this).attr('style','display:visible; width:0px; height:0px; margin-top:25px; position:absolute; clip:rect(0,0,0,0)');
      }else{
          $(this).attr("style","display:visible; position:absolute; clip:rect(0,0,0,0)");
      }
  })

select.attr ('tabindex', -2);

}
возвратиться
}
`

+1

Может ли кто-нибудь исправить это? Это довольно старая проблема и очень важная функциональность в настоящее время. Спасибо.

Не работает в последней версии.

Кажется, это нарушает проверку формы angular.js при использовании angular-selected.

Сейчас 2018 год, и у нас все еще та же проблема. Это черт возьми, как стандарты HTML не могут работать должным образом и интегрироваться с внешними плагинами. Безумные времена :)

Это также нарушает выбранный плагин Drupal. См. Https://www.drupal.org/project/chosen/issues/2705891

Не удалось найти никакого подходящего решения, кроме обходного пути:

<div class="form__select">
  <select class="chosen">
    <!-- options -->
  </select>
</div>
.form__select {
    position: relative;
}

.form__select .chosen {
    display: block !important;
    height: 0;

    position: absolute;
    left: 35px;
    bottom: 0;

    outline: none;
    border-color: white;

    pointer-events: none;
}

Если вы используете Chosen для всех элементов select , вы можете использовать этот CSS, чтобы сделать его видимым (в DOM), но без непрозрачности, без высоты и абсолютного положения.

Эти селекторы CSS нацелены на недопустимые элементы выбора, при этом один из них нацелен на multiple добавляя 15px margin-top чтобы центрировать его на элементах множественного выбора.

select:invalid {
    height: 0px !important;
    opacity: 0 !important;
    position: absolute !important;
    display: flex !important;
}

select:invalid[multiple] {
   margin-top: 15px !important;
}

Демо: http://jsfiddle.net/tripflex/2zdeu9oc/

НО ДЕЙСТВИТЕЛЬНО ... это уже должно обрабатываться библиотекой Chosen.JS

Вот мой обходной путь, если он нужен:

// Initialise Chosen
$(function () {
    $('select').chosen();
});

// Place the original input behind the Chosen input, matching the height and width so that the warning appears in the correct position
$('select').on('chosen:ready', function () {
    const height = $(this).next('.chosen-container').height();
    const width = $(this).next('.chosen-container').width();

    $(this).css({
            'position': 'absolute',
            'height': height,
            'width': width,
            'opacity': 0
        })
        .show();
});

@jonathanbull, можете ли вы показать это в контексте? Я попробовал ваше решение, но оно не сработало.

@AndrewSouthpaw Это мой код, исправления у меня отлично работают :)

$("#select").val([]); // disable default selection by browser
$('#select').on('chosen:ready', function(evt, params, chosen) {
    $(this).css({'position': 'absolute', 'height': 0, 'opacity': 0}).show();
});
$("#select").chosen();

Я использую немного другой код (на основе кода здесь):

$('.chosen-select').on("chosen:ready", function (evt, data) {
  $(this)
    .addClass('chosen_hidden')
    .attr('tabindex', '-1')
    .prependTo(data.chosen.container)
    .show()
  })
  .chosen({width: '100%'})
.chosen_hidden {
  position: absolute;
  top: 0;
  bottom: 0;
  max-height: 100%; // required for IE 10
  // **not required** opacity: 0;
}

Он не обрабатывает действие «уничтожить», но правильно позиционирует сообщение об ошибке и, похоже, работает в Firefox и Chromiun. Поскольку исходный селектор не скрыт, граница выделения ошибки видна. Обновление : с max-height он также работает в IE. Другое обновление : добавьте tabindex -1, чтобы убедиться, что он не получает фокус. (при этом все еще можно фокусировать и получать сообщения об ошибках).

Был открытый PR, который решает эту проблему, но я думаю, что он потерялся, так как другой поток, на который он нацелен, был закрыт. См. № 2594

@jhedstrom хотел бы, чтобы это слилось. Вы знаете, поддерживается ли эта библиотека?

Я использовал что-то похожее на решение @eloyesp выше и поделился этим здесь:

https://github.com/harvesthq/chosen/pull/2594#issuecomment -714806139

Спасибо @jhedstrom за то, что указал мне в правильном направлении!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги
bleepcoder.com использует общественно лицензированную информацию GitHub для предоставления решений разработчикам по всему миру. Мы не аффилированы с GitHub, Inc. или любым другим разработчиком, использующим GitHub для своих проектов. Мы не размещаем видео или изображения на наших серверах. Все права принадлежат их соответствующим владельцам.
Источник для этой страницы: Источник

Популярные языки программирования
Популярные проекты GitHub
Больше проектов GitHub

© 2024 bleepcoder.com - Contact
Made with in the Dominican Republic.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.