I have the following function defined and run on DOMContentLoaded
(among others, not relevant here):
function dependentControls() {
const dependers = [...document.querySelectorAll('[data-depends-on]')]
for (const depender of dependers) {
let dependency = document.getElementById(depender.dataset.dependsOn)
if (dependency) {
let dependencyDetails = {
prop: null,
state: null
}
switch (dependency.type) {
case 'checkbox':
{
dependencyDetails.prop = 'checked'
dependencyDetails.state = false
break // this break exits the current for loop iteration
}
case 'text':
{
dependencyDetails.prop = 'value'
dependencyDetails.state = ''
break // this break exits the current for loop iteration
}
default:
console.log('default case')
}
console.log("switch...end") // this line is never reached
depender.disabled = !dependency[dependencyDetails.prop]
dependency.addEventListener('change', () => {
console.log('dependancy changed')
depender.disabled = dependency[dependencyDetails.prop] === dependencyDetails.state
})
}
}
console.log('for...end')
}
document.addEventListener('DOMContentLoaded', dependentControls);
<div>
<input type="checkbox" id="fooBar" />
<label for="fooBar">dependency</label>
</div>
<hr />
<div>
<label for="fooBaz">depender</label>
<input type="text" id="fooBaz" data-depends-on="fooBar" value="depender" />
</div>
This is the relevant part of the transpiled code:
function _toConsumableArray(arr) {
if (Array.isArray(arr)) {
for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
arr2[i] = arr[i];
}
return arr2;
} else {
return Array.from(arr);
}
}
var dependentControls = function dependentControls() {
var dependers = _toConsumableArray(document.querySelectorAll('[data-depends-on]'));
var _iteratorNormalCompletion5 = true;
var _didIteratorError5 = false;
var _iteratorError5 = undefined;
try {
var _loop5 = function _loop5() {
var depender = _step5.value;
var dependency = document.getElementById(depender.dataset.dependsOn);
if (dependency) {
var dependencyDetails = {
prop: 'checked',
state: false
};
switch (dependency.type) {
case 'checkbox':
{
dependencyDetails.prop = 'checked';
dependencyDetails.state = false;
return "break";
}
case 'text':
{
dependencyDetails.prop = 'value';
dependencyDetails.state = '';
return "break";
}
default:
}
console.log("switch...end"); // this line is never reached
depender.disabled = !dependency[dependencyDetails.prop];
dependency.addEventListener('change', function() {
depender.disabled = dependency[dependencyDetails.prop] === dependencyDetails.state;
});
}
};
_loop4: for (var _iterator5 = dependers[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
var _ret2 = _loop5();
switch (_ret2) {
case "break":
break _loop4;
default:
if (_typeof(_ret2) === "object") return _ret2.v;
}
}
} catch (err) {
_didIteratorError5 = true;
_iteratorError5 = err;
} finally {
try {
if (!_iteratorNormalCompletion5 && _iterator5.return != null) {
_iterator5.return();
}
} finally {
if (_didIteratorError5) {
throw _iteratorError5;
}
}
}
console.log("for...end");
}
document.addEventListener('DOMContentLoaded', dependentControls);
<div>
<input type="checkbox" id="fooBar" />
<label for="fooBar">dependency</label>
</div>
<hr />
<div>
<label for="fooBaz">depender</label>
<input type="text" id="fooBaz" data-depends-on="fooBar" value="depender" />
</div>
This is my .babelrc
:
{
"presets": [
[ "@babel/preset-env", {
"targets": {
"browsers": [ "last 2 versions", "ie >= 11" ]
}
}]
]
}
I'm using Babel 7 to transpile the code and the latest webpack to bundle it. When I paste this code in the console and call the function, the problem does not occur. When I paste this code in http://babeljs.io/repl and paste the resulting code in the console, it also works.
By the looks of it, this has been reported in April already, with noone commenting on the issue so far:
https://github.com/babel/babel/issues/7765
Nonetheless I've also filed it: