Skip to content

Commit 089620c

Browse files
committed
netteForms.js: fixed getValue for radio list [Closes nette#73]
1 parent cde467a commit 089620c

File tree

3 files changed

+23
-25
lines changed

3 files changed

+23
-25
lines changed

src/assets/netteForms.js

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -41,27 +41,21 @@ Nette.addEvent = function(element, on, callback) {
4141
* Returns the value of form element.
4242
*/
4343
Nette.getValue = function(elem) {
44-
var i, len;
44+
var i;
4545
if (!elem) {
4646
return null;
4747

4848
} else if (!elem.tagName) { // RadioNodeList, HTMLCollection, array
49-
var multi = elem[0] && !!elem[0].name.match(/\[\]$/),
50-
res = [];
49+
return elem[0] ? Nette.getValue(elem[0]) : null;
5150

52-
for (i = 0, len = elem.length; i < len; i++) {
53-
if (elem[i].type in {checkbox: 1, radio: 1} && !elem[i].checked) {
54-
continue;
55-
} else if (multi) {
56-
res.push(elem[i].value);
57-
} else {
58-
return elem[i].value;
51+
} else if (elem.type === 'radio') {
52+
var elements = elem.form.elements; // prevents problem with name 'item' or 'namedItem'
53+
for (i = 0; i < elements.length; i++) {
54+
if (elements[i].name === elem.name && elements[i].checked) {
55+
return elements[i].value;
5956
}
6057
}
61-
return multi ? res : null;
62-
63-
} else if (elem.name && !elem.form.elements.namedItem(elem.name).tagName) { // multi element
64-
return Nette.getValue(elem.form.elements.namedItem(elem.name));
58+
return null;
6559

6660
} else if (elem.type === 'file') {
6761
return elem.files || elem.value;
@@ -75,22 +69,27 @@ Nette.getValue = function(elem) {
7569
return index < 0 ? null : options[index].value;
7670
}
7771

78-
for (i = 0, len = options.length; i < len; i++) {
72+
for (i = 0; i < options.length; i++) {
7973
if (options[i].selected) {
8074
values.push(options[i].value);
8175
}
8276
}
8377
return values;
8478

85-
} else if (elem.name && elem.name.match(/\[\]$/)) { // multi element with single option
86-
return Nette.getValue([elem]);
79+
} else if (elem.name && elem.name.match(/\[\]$/)) { // multiple elements []
80+
var elements = elem.form.elements[elem.name].tagName ? [elem] : elem.form.elements[elem.name],
81+
values = [];
82+
83+
for (i = 0; i < elements.length; i++) {
84+
if (elements[i].type !== 'checkbox' || elements[i].checked) {
85+
values.push(elements[i].value);
86+
}
87+
}
88+
return values;
8789

8890
} else if (elem.type === 'checkbox') {
8991
return elem.checked;
9092

91-
} else if (elem.type === 'radio') {
92-
return elem.checked && elem.value;
93-
9493
} else if (elem.tagName.toLowerCase() === 'textarea') {
9594
return elem.value.replace("\r", '');
9695

@@ -215,9 +214,8 @@ Nette.validateForm = function(sender) {
215214
*/
216215
Nette.isDisabled = function(elem) {
217216
if (elem.type === 'radio') {
218-
elem = elem.form.elements.namedItem(elem.name).tagName ? [elem] : elem.form.elements.namedItem(elem.name);
219-
for (var i = 0; i < elem.length; i++) {
220-
if (!elem[i].disabled) {
217+
for (var i = 0, elements = elem.form.elements; i < elements.length; i++) {
218+
if (elements[i].name === elem.name && !elements[i].disabled) {
221219
return false;
222220
}
223221
}

tests/netteForms/.jshintrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"regexp" : true, // Prohibit `.` and `[^...]` in regular expressions.
3030
"regexdash" : false, // Tolerate unescaped last dash i.e. `[-...]`.
3131
"scripturl" : true, // Tolerate script-targeted URLs.
32-
"shadow" : false, // Allows re-define variables later in code e.g. `var x=1; x=2;`.
32+
"shadow" : true, // Allows re-define variables later in code e.g. `var x=1; x=2;`.
3333
"supernew" : false, // Tolerate `new function () { ... };` and `new Object;`.
3434
"undef" : true, // Require all non-global variables be declared before they are used.
3535

tests/netteForms/spec/Nette.validateRuleSpec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ describe('Nette.getValue & validateRule', function() {
210210
form = doc.forms[0],
211211
el = form.input;
212212

213-
expect(Nette.getValue(el)).toBe(false);
213+
expect(Nette.getValue(el)).toBe(null);
214214
expect(Nette.validateRule(el, 'filled')).toBe(false);
215215
expect(Nette.validateRule(el, 'blank')).toBe(true);
216216
expect(Nette.validateRule(el, 'equal', ['f', 'm'])).toBe(false);

0 commit comments

Comments
 (0)