Вы здесь

Почему значение раскрытого фильтра, присваиваемое из скрипта, может игнорироваться через раз?

-1

Имеется представление, отображаемое как Geolocation Common Map. Включен dynamic mode по boundary filter, то есть при каждом движении/зуме карты пользователем, новые границы карты через js записываются в раскрытый boundary filter, и представление автоматически обновляется через AJAX. Это всё пока стандартная функциональность модуля Geolocation, которая работает как часы.
Есть необходимость отображать на карте разные объекты (=типы материалов) в зависимости от текущего зума: при совсем мелком масштабе должны отображаться страны, при более крупном - города, при совсем крупном - индивидуальные здания (это всё разные типы материалов, содержащие поле типа Geolocation).
Добавляю новый раскрытый фильтр по типу материала и добавляю следующий код прямо в geolocation-common-map.js, сразу после кода, который заполняет поля раскрытого boundary-фильтра значениями из объекта googleMap:

$('select[name="content_type[]"] option', exposedForm)
  .removeAttr('selected')
  .filter(
    geolocationMap.googleMap.getZoom() < 6 ? '[value="countries"]' :
    geolocationMap.googleMap.getZoom() < 11 ? '[value="cities"]' : '[value="artefacts"],[value="events"]'
    )
  .attr('selected', true);

А дальше начинается странное: при перемещении/масштабировании карты через раз отображаются либо типы материалов, корректно выбранные моим скриптом сообразно текущему зуму, либо тип материала, установленный по умолчанию независимо от зума. Причем, когда зум переходит границу между типами отображаемых материалов (например, страны/города), то всё всегда отображается корректно, то есть если дергать масштаб туда-сюда между 5 и 6, то каждый раз корректно отображаются то страны, то города. Но если сдвинуть карту (масштаб не меняется) или сменить масштаб в пределах текущего диапазона (например сменить масштаб с 6 на 7, когда уже отображаются города и дальше должны тоже отображаться города), то сразу начинается вышеописанная работа через раз.
В процессе отладки установлено, что мой код честно вызывается каждый раз, зум определяется корректно каждый раз и поле раскрытого фильтра корректно обновляется каждый раз. То есть такое впечатление, что поле формы зачем-то через раз инициализируется в значение по умолчанию уже ПОСЛЕ того, как мой скрипт отрабатывает. Причем сбрасывается только мой фильтр "тип материала", встроенный boundary-фильтр не сбрасывается.
Вопрос опытным: это какая-то специфическая особенность модуля Geolocation, или я наткнулся на какую-то известную (всем кроме меня) фичу механизма раскрытых фильтров и/или AJAX'а? Куда дальше копать?

Версия Drupal: 
8.x
Вопрос задан 04.09.2017 - 13:19

Замена .attr('selected', true) на .prop('selected', true) решила проблему ;)
Так до конца и не понял, почему оно работало через раз, но это уже представляет чисто академический интерес...

Комментарий оставлен 05.09.2017 - 14:59

Это я прочел, непонятно почему через раз оно работало.

Комментарий оставлен 06.09.2017 - 07:52

Ответы