Атрибут веб-компонентаChangedCallback не вызывается для атрибута DISABLED

Как мой пользовательский элемент/веб-компонент может обнаружить изменение атрибута DISABLED?

static get observedAttributes() {
    return ['checked', 'disabled', 'value'];
}

Мой атрибутChangedCallback() не вызывается?

Вау, спасибо за быстрый ответ! Я могу предоставить SSCCE, но вы предоставили мне достаточно доказательств, чтобы перейти к более широкой картине. Мой первоначальный вопрос сводился к ошибке школьника от моего имени (забыть Disabled = "false" все равно означает DISABLED) stackoverflow.com/questions/78138609/… но в этом коде я не получаю атрибут AttachChangedCallback на Переключить :-( в любом случае я задам более серьезный вопрос: почему FF правильно останавливает события CLICK в ShadowRoot, но почему все все еще всплывают события INPUT из ОТКЛЮЧЕННОГО веб-компонента

McMurphy 20.05.2024 10:39
github.com/whatwg/html/issues/5886
Kaiido 20.05.2024 10:42

Хорошая ссылка! Буду читать. Измените свой код на свойство .disable=true вместо setAttrinute("disabled", "blah"), и вы поймете, что я имею в виду.

McMurphy 20.05.2024 10:46

Но зачем .disabled здесь что-то делать? Мой элемент не извлекает ничего для ввода или любого другого элемента, который имел бы такой атрибут IDL.

Kaiido 20.05.2024 10:50

Я не понимаю :-( Вы хотите сказать, что «setAttribute(»disabled») вполне разумно, а .disabled — глупо?

McMurphy 20.05.2024 15:54

Не "глупый", но, наверное, ввёл в заблуждение. .disabled, точно так же, как «официальные» отключенные атрибуты существуют только для некоторых элементов (в основном элементов управления формой). Например, при <div> он вернет undefined, и его установка ничего не даст, но при <input> он вернет логическое значение, и его установка установит атрибут. Ваш пользовательский элемент здесь похож на div, он не знает об этом атрибуте IDL.

Kaiido 21.05.2024 00:07

Но у моего компонента ЕСТЬ элемент ввода флажка

McMurphy 21.05.2024 00:15

Во-первых, вы этого не показываете, поэтому мы не можем говорить об одном и том же, потому что я не медиум. И затем, «имеет» ли он его, поскольку один из его дочерних элементов является входными данными, или он сам «является» им, как в случае, когда вы объявляете его класс с помощью extends HTMLInputElement, а затем используете is? Если первое, то это все равно как div. Обратите внимание, что последнее не будет работать в Safari.

Kaiido 21.05.2024 00:20

Это первое. Спасибо. Обратите внимание, что FireFox ведет себя правильно, не позволяя событиям щелчка выходить из теневого DOM, если мой компонент отключен. Как ни странно, и Chrome, и FireFox позволяют событиям ввода подэлементов всплывать и предоставляют полный метод ComposedPath(). Я скоро обновлю stackoverflow.com/questions/78138609/….

McMurphy 21.05.2024 01:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
10
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете объявить disabled как свойство получения/установки в своем веб-компоненте.

Для элементов, у которых по умолчанию нет свойства disabled:
https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled

<my-element disabled  ></my-element>
<script>
  function log(...args) {
    console.info(...args)
  }
  customElements.define('my-element',
    class extends HTMLElement {
      static get observedAttributes(){
        return ["disabled"];
      }
      attributeChangedCallback(name, oldValue, newValue){
       log("attributeChanged",name,oldValue,newValue)
      }
      connectedCallback() {
        log("connectedCallback");
        this.disabled  = !this.disabled;
      };
      get disabled(){
        log("GET disabled", this.hasAttribute("disabled"));
        return this.hasAttribute("disabled");
      }
      set disabled(v){
        log("SET disabled", v);
        this.toggleAttribute("disabled",v);
      }
    });
</script>

Сеттер немного сбит. Это должно выглядеть так: set disabled(v) { this.toggleAttribute('disabled', v); }.

connexo 13.06.2024 07:42

Другие вопросы по теме