Является ли HTMLMediaElement.muted = true переносимым?

#javascript #html #dom #html5-video #standards

#javascript #HTML #dom #html5-видео #стандарты

Вопрос:

Я попытался отключить звук, только чтобы узнать setAttribute , что он вообще не работает под Firefox 80.0.1 и Chrome 85.0.4183.102 . Насколько я знаю, это стандартный способ установки логического атрибута.

 video.setAttribute("muted", "muted");
  

На удивление, video.muted = true работает. Я не уверен, что он вообще переносим, поскольку он не использует стандартную функцию SetAttribute , а значение не является канонической копией muted .

Комментарии:

1. .setAttribute() устанавливает его на узле DOM, не обязательно на экземпляре.

Ответ №1:

muted Атрибут сопоставляется с .defaultMuted IDL, а не напрямую со .muted свойством.

Для .muted свойства сначала устанавливается это .defaulMuted значение, но последующее изменение .defaultMuted значения не приведет к изменению .muted значения.

Это означает, что при синтаксическом анализе атрибут установит начальное значение .muted , но затем изменение атрибута не произойдет.

 const vid = document.getElementById("vid");
console.log( "defaultMuted:", vid.defaultMuted ); // true (because it has the attribute)
vid.removeAttribute( "muted" ); // set defaultMuted to false
console.log("### removed Attribute");
console.log( "has attribute:", vid.getAttribute( "muted" ) !== null );
console.log( "defaultMuted:", vid.defaultMuted ); // false (no attribute anymore)
console.log( "muted:", vid.muted ); // true (still muted anyway)
vid.defaultMuted = true; // set back the attribute through IDL
console.log("### set defaultMuted to true");
console.log( "has attribute:", vid.getAttribute( "muted" ) !== null ); // "" (which is a truthy value for booleans, would have been `null` if unset)  
 <video controls id="vid" muted></video>  

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

Комментарии:

1.Извините, я не понимаю. Я понимаю defaultMuted , что отражает muted в соответствии со стандартом. Но как это связано с removeAttribute настройкой defaultMuted not muted ?

2. Ваш комментарий тоже трудно понять; P Если вы действительно понимаете, что .defaultMuted свойство отражает muted атрибут, вы, конечно, понимаете, что удаление этого логического атрибута приведет .defaultMuted к false . Я имею в виду, что здесь означает «отражает».

3. Я имел в виду, что любой из них должен работать, верно?

4. С какой целью? Ни один из них не изменит .muted свойство после первоначального синтаксического анализа.

5. Для меня defaultMuted это похоже на прокси и muted является реальным. reflects это односторонняя связь, верно? Почему мы не можем установить muted напрямую?