function dynamicForm(container) { this.container = typeof (container) === 'string' ? document.getElementById(container) : container; } dynamicForm.prototype = { _keyValueSplitter: '=', _itemSplitter: ',', _attrKey: 'data-skey', _chkTypes: ['checkbox', 'radio'], _isInType: function (a, el) { var etype = el.type.toLowerCase(); var i = a.length; while (i--) { if (a[i] === etype) { return true; } } return false; }, _addElement: function (array, tag, types) { var el, nodes = this.container.getElementsByTagName(tag); for (var i = 0, l = nodes.length; i < l; i++) { el = nodes[i]; if (!types || (types && this._isInType(types, el))) { array.push(el); } } }, _getElements: function () { var ret = []; this._addElement(ret, 'input', ['text'].concat(this._chkTypes)); this._addElement(ret, 'textarea'); this._addElement(ret, 'select'); return ret; }, /*擷取所有元素的值*/ getValues: function () { var elArray = this._getElements(), ret = [], el, key, isChk; for (var i = 0, l = elArray.length; i < l; i++) { el = elArray[i]; key = el.getAttribute(this._attrKey); if (key) { isChk = this._isInType(this._chkTypes, el); if ((!isChk && el.value) || (isChk && el.checked)) ret.push(key + this._keyValueSplitter + encodeURIComponent(el.value)); } } return ret.join(this._itemSplitter); }, _setValues: function (val, elArray, callback) { if (!(val || val.length)) return; var elen = elArray.length, valArray = val.split(this._itemSplitter), keyValue; for (var i = 0, l = valArray.length; i < l; i++) { keyValue = valArray[i].split(this._keyValueSplitter); callback.call(this, elArray, elen, keyValue); } }, /*為所有元素賦值(可用於修改頁面)*/ setValues: function (val) { if (!(val || val.length)) return; this._setValues(val, this._getElements(), this._setElementValue); }, _setElementValue: function (elArray, elen, keyValue) { var el, key = keyValue[0], val = decodeURIComponent(keyValue[1]), hasSet; for (var i = 0; i < elen; i++) { el = elArray[i]; if (el.getAttribute(this._attrKey) == key) { if (this._isInType(this._chkTypes, el)) { if (val == el.value) hasSet = el.checked = true; } else if (val) { el.value = val; hasSet = true; } if (hasSet) { elArray.splice(i, 1); break; } } } }, /*用於顯示到頁面(唯讀)*/ showTo: function (val, tag) { if (!(val || val.length)) return; var ret = []; this._addElement(ret, tag); this._setValues(val, ret, this._showToElement); }, _showToElement: function (elArray, elen, keyValue) { var el, key = keyValue[0], val = decodeURIComponent(keyValue[1]), hasSet; for (var i = 0; i < elen; i++) { el = elArray[i]; if (el.getAttribute(this._attrKey) == key) { el.innerHTML = val; elArray.splice(i, 1); break; } } } }; |