Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit a8498d2

Browse files
committed
fixup! refactor selected attr / prop setting
1 parent 14f8ce3 commit a8498d2

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

src/ng/directive/select.js

+17-14
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,16 @@
44

55
var noopNgModelController = { $setViewValue: noop, $render: noop };
66

7-
function setOptionAsSelected(optionEl) {
8-
optionEl.prop('selected', true); // needed for IE
9-
optionEl.attr('selected', true);
7+
function setOptionSelectedStatus(optionEl, value) {
8+
optionEl.prop('selected', value); // needed for IE
9+
if (value) {
10+
optionEl.attr('selected', value);
11+
} else {
12+
// Technically, setting the property to null / false is enough to unselect the option
13+
// However, screenreaders might react to the selected attribute instead, see
14+
// https://github.com/angular/angular.js/issues/14419
15+
optionEl.removeAttr('selected');
16+
}
1017
}
1118

1219
/**
@@ -49,14 +56,14 @@ var SelectController =
4956
var unknownVal = self.generateUnknownOptionValue(val);
5057
self.unknownOption.val(unknownVal);
5158
$element.prepend(self.unknownOption);
52-
setOptionAsSelected(self.unknownOption);
59+
setOptionSelectedStatus(self.unknownOption, true);
5360
$element.val(unknownVal);
5461
};
5562

5663
self.updateUnknownOption = function(val) {
5764
var unknownVal = self.generateUnknownOptionValue(val);
5865
self.unknownOption.val(unknownVal);
59-
setOptionAsSelected(self.unknownOption);
66+
setOptionSelectedStatus(self.unknownOption, true);
6067
$element.val(unknownVal);
6168
};
6269

@@ -71,7 +78,7 @@ var SelectController =
7178
self.selectEmptyOption = function() {
7279
if (self.emptyOption) {
7380
$element.val('');
74-
setOptionAsSelected(self.emptyOption);
81+
setOptionSelectedStatus(self.emptyOption, true);
7582
}
7683
};
7784

@@ -107,7 +114,7 @@ var SelectController =
107114
// Make sure to remove the selected attribute from the previously selected option
108115
// Otherwise, screen readers might get confused
109116
var currentlySelectedOption = $element[0].options[$element[0].selectedIndex];
110-
if (currentlySelectedOption) currentlySelectedOption.removeAttribute('selected');
117+
if (currentlySelectedOption) setOptionSelectedStatus(jqLite(currentlySelectedOption), false);
111118

112119
if (self.hasOption(value)) {
113120
self.removeUnknownOption();
@@ -117,7 +124,7 @@ var SelectController =
117124

118125
// Set selected attribute and property on selected option for screen readers
119126
var selectedOption = $element[0].options[$element[0].selectedIndex];
120-
setOptionAsSelected(jqLite(selectedOption));
127+
setOptionSelectedStatus(jqLite(selectedOption), true);
121128
} else {
122129
if (value == null && self.emptyOption) {
123130
self.removeUnknownOption();
@@ -617,12 +624,8 @@ var selectDirective = function() {
617624
// So we only modify the selected property if neccessary.
618625
// Note: this behavior cannot be replicated via unit tests because it only shows in the
619626
// actual user interface.
620-
if ((shouldBeSelected && !currentlySelected)) {
621-
setOptionAsSelected(jqLite(option));
622-
} else if ((!shouldBeSelected && currentlySelected)) {
623-
option.selected = shouldBeSelected;
624-
// Remove attribute to not confuse screen readers
625-
option.removeAttribute('selected');
627+
if (shouldBeSelected !== currentlySelected) {
628+
setOptionSelectedStatus(jqLite(option), shouldBeSelected);
626629
}
627630

628631
});

0 commit comments

Comments
 (0)