- From: Michał Gołębiowski via GitHub <sysbot+gh@w3.org>
- Date: Fri, 28 Aug 2015 17:10:50 +0000
- To: www-dom@w3.org
mzgol has just created a new issue for https://github.com/whatwg/dom: == DOMTokenList#toggle: don't treat everything non-undefined as true == According to the 3rd & 4th step at https://dom.spec.whatwg.org/#dom-domtokenlist-toggle, `DOMTokenList#toggle` treats every non-`false` value of the second argument as `true`. In particular: ```js var div = document.createElement('div'); div.classList.add('a'); // <div class="a'></div> div.classList.toggle('a', undefined); // <div class="a'></div> div.classList.toggle('a', undefined); // <div class="a'></div> ``` So, according to the spec, these should be `div.classList.contains('a')` results after the first & second `toggle invocation: ``` 1: true 2: true ``` This is because `force` is passed and is not `false` so the first sub-step of the 3rd step doesn't apply. Now, these are the results in popular browsers: Chrome 44, Safari 8, Edge: ``` 1: false 2: false ``` Firefox 40, IE 11: ``` 1: false 2: true ``` Now, if you change `undefined` to `null` in both those cases, all browsers return: ``` 1: false 2: false ``` This indicates all browsers cast the `force` value to a boolean and only some of them make an exception for `undefined`, treating it as an argument not passed. IMO the Firefox & IE 11 behavior is the most sensible one. This allows to proxy the `toggle` method without checking the number of arguments passed: ```js function proxyClassListToggle(node, value, force) { // I don't want to do this if (typeof force === 'boolean') { node.classList.toggle(value, force); } else { node.classList.toggle(value); } } proxyClassListToggle(node, 'a'); ``` In any case, the currently specced behavior is not matching reality and is surprising (I'd certainly not expect `undefined` to be treated as `true`). See https://github.com/whatwg/dom/issues/64
Received on Friday, 28 August 2015 17:10:52 UTC