fix call stack overflow on form focusing. fixes #38.

This commit is contained in:
Christopher Jeffrey 2014-03-30 03:51:54 -05:00
parent 1bdba0dad0
commit d624fe0c45
1 changed files with 20 additions and 4 deletions

View File

@ -4382,6 +4382,10 @@ Form.prototype.__proto__ = Box.prototype;
Form.prototype.type = 'form';
Form.prototype._refresh = function() {
// XXX Possibly remove this if statement and refresh on every focus.
// Also potentially only include *visible* focusable elements.
// This would remove the need to check for _selected.visible in previous()
// and next().
if (!this._children) {
var out = [];
@ -4394,9 +4398,17 @@ Form.prototype._refresh = function() {
}
};
Form.prototype._visible = function() {
return !!this._children.filter(function(el) {
return el.visible;
}).length;
};
Form.prototype.next = function() {
this._refresh();
if (!this._visible()) return;
if (!this._selected) {
this._selected = this._children[0];
if (!this._selected.visible) return this.next();
@ -4419,6 +4431,8 @@ Form.prototype.next = function() {
Form.prototype.previous = function() {
this._refresh();
if (!this._visible()) return;
if (!this._selected) {
this._selected = this._children[this._children.length - 1];
if (!this._selected.visible) return this.previous();
@ -4439,11 +4453,13 @@ Form.prototype.previous = function() {
};
Form.prototype.focusNext = function() {
this.next().focus();
var next = this.next();
if (next) next.focus();
};
Form.prototype.focusPrevious = function() {
this.previous().focus();
var previous = this.previous();
if (previous) previous.focus();
};
Form.prototype.resetSelected = function() {
@ -4452,12 +4468,12 @@ Form.prototype.resetSelected = function() {
Form.prototype.focusFirst = function() {
this.resetSelected();
this.next().focus();
this.focusNext();
};
Form.prototype.focusLast = function() {
this.resetSelected();
this.previous().focus();
this.focusPrevious();
};
Form.prototype.submit = function() {