📄 form.js
字号:
/* Copyright (c) 2004-2006, The Dojo Foundation All Rights Reserved. Licensed under the Academic Free License version 2.1 or above OR the modified BSD license. For more information on Dojo licensing, see: http://dojotoolkit.org/community/licensing.shtml*/dojo.provide("dojo.widget.Form");dojo.require("dojo.widget.*");dojo.require("dojo.widget.HtmlWidget");dojo.widget.defineWidget("dojo.widget.Form", dojo.widget.HtmlWidget, { /* summary: Widget for easily moving data to/from form description: gets and sets data to and from js-object. With this it's easy to create forms to application. Just create empty form, then set it's values with this and after user pushes submit, getValues and send them as json-notation to server. Note: not all Form widgets are supported ATM usage: <form dojoType="Form" id="myForm"> Name: <input type="text" name="name" /> </form> myObj={name: "John Doe"}; dojo.widget.byId('myForm').setValues(myObj); myObj=dojo.widget.byId('myForm').getValues(); */ isContainer: true, templateString: "<form dojoAttachPoint='containerNode' dojoAttachEvent='onSubmit:onSubmit'></form>", formElements: [], // ignoreNullValue: // if true, then only fields that has data is set to form // if false, fields that does not have corresponding object, is set to empty ignoreNullValues: false, postCreate: function(args,frag){ for (var key in args) { if (key == "dojotype") continue; var attr= document.createAttribute(key); attr.nodeValue=args[key]; this.containerNode.setAttributeNode(attr); } }, _createRepeaters: function (/*object*/obj, /*widget*/widget) { for(var i=0; i<widget.children.length; ++i) { if (widget.children[i].widgetType == "RepeaterContainer") { var rIndex=widget.children[i].index; var rIndexPos=rIndex.indexOf("%{index}"); rIndex=rIndex.substr(0,rIndexPos-1); var myObj = this._getObject(obj, rIndex); if (typeof(myObj) == "object" && myObj.length == 0) { myObj=new Array(); } var rowCount = widget.children[i].getRowCount(); for (var j=0,len=rowCount; j<len; ++j) { widget.children[i].deleteRow(0); } for (var j=0; j<myObj.length; j++) { widget.children[i].addRow(false); } } if (widget.children[i].isContainer) { this._createRepeaters(obj, widget.children[i]); } } }, _createFormElements: function() { if(dojo.render.html.safari) { // bug in safari (not registering form-elements) this.formElements=[]; var elems = ["INPUT", "SELECT", "TEXTAREA"]; for (var k=0; k < elems.length; k++) { var list = this.containerNode.getElementsByTagName(elems[k]); for (var j=0,len2=list.length; j<len2; j++) { this.formElements.push(list[j]); } } // fixed in safari nightly } else { this.formElements=this.containerNode.elements; } }, onSubmit: function(/*event*/e) { e.preventDefault(); }, submit: function() { this.containerNode.submit(); }, _getFormElement: function(/*form elements name*/name) { if(dojo.render.html.ie) { for(var i=0, len=this.formElements.length; i<len; i++) { var element = this.formElements[i]; if (element.name == name) { return element; } // if } // for } else { var elem = this.formElements[name]; if (typeof(elem) != "undefined") { return elem; } } return null; }, _getObject: function(/*object*/obj, /*string*/searchString) { var namePath = []; namePath=searchString.split("."); var myObj=obj; var name=namePath[namePath.length-1]; for(var j=0, len=namePath.length;j<len;++j) { var p=namePath[j]; if (typeof(myObj[p]) == "undefined") { myObj[p]={}; } myObj=myObj[p]; } return myObj; }, _setToContainers: function (/*object*/obj,/*widget*/widget) { for(var i=0, len=widget.children.length; i<len; ++i) { var currentWidget=widget.children[i]; if (currentWidget.widgetType == "Repeater") { for(var j=0,len=currentWidget.getRowCount(); j<len; ++j) { currentWidget._initRow(j); } } if (currentWidget.isContainer) { this._setToContainers (obj, currentWidget); continue; } switch(currentWidget.widgetType) { case "Checkbox": currentWidget.setValue(currentWidget.inputNode.checked); break; case "DropdownDatePicker": currentWidget.setValue(currentWidget.getValue()); break; case "Select": //widget.children[i].setValue(myObj[name]); continue; break; case "ComboBox": //widget.children[i].setSelectedValue(myObj[name]); continue; break; default: break; } } }, setValues: function(/*object*/obj) { this._createFormElements(); this._createRepeaters(obj,this); for(var i=0, len=this.formElements.length; i<len; i++) { var element = this.formElements[i]; if (element.name == '') {continue}; var namePath = new Array(); namePath=element.name.split("."); var myObj=obj; var name=namePath[namePath.length-1]; for(var j=1,len2=namePath.length;j<len2;++j) { var p=namePath[j - 1]; if(typeof(myObj[p]) == "undefined") { myObj=undefined; break; }; myObj=myObj[p]; } if (typeof(myObj) == "undefined") { continue; } if (typeof(myObj[name]) == "undefined" && this.ignoreNullValues) { continue; } var type=element.type; if (type == "hidden" || type == "text" || type == "textarea" || type == "password") { type = "text"; } switch(type) { case "checkbox": element.checked=false; if (typeof(myObj[name]) == 'undefined') continue; for (var j=0,len2=myObj[name].length; j<len2; ++j) { if(element.value == myObj[name][j]) { element.checked=true; } } break; case "radio": element.checked=false; if (typeof(myObj[name]) == 'undefined') {continue}; if (myObj[name] == element.value) { element.checked=true; } break; case "select-multiple": element.selectedIndex=-1; for (var j=0,len2=element.options.length; j<len2; ++j) { for (var k=0,len3=myObj[name].length;k<len3;++k) { if (element.options[j].value == myObj[name][k]) { element.options[j].selected=true; } } } break; case "select-one": element.selectedIndex="0"; for (var j=0,len2=element.options.length; j<len2; ++j) { if (element.options[j].value == myObj[name]) { element.options[j].selected=true; } else { // element.options[j].selected=false; } } break; case "text": var value=""; if (typeof(myObj[name]) != 'undefined') { value = myObj[name]; } element.value=value; break; default: dojo.debug("Not supported type ("+type+")"); break; } } this._setToContainers(obj,this); }, getValues: function() { this._createFormElements(); var obj = { }; for(var i=0,len=this.formElements.length; i<len; i++) { // FIXME: would be better to give it an attachPoint: var elm = this.formElements[i]; var namePath = []; if (elm.name == '') { continue;} namePath=elm.name.split("."); var myObj=obj; var name=namePath[namePath.length-1]; for(var j=1,len2=namePath.length;j<len2;++j) { var nameIndex = null; var p=namePath[j - 1]; var nameA=p.split("["); if (nameA.length > 1) { if(typeof(myObj[nameA[0]]) == "undefined") { myObj[nameA[0]]=[ ]; } // if nameIndex=parseInt(nameA[1]); if(typeof(myObj[nameA[0]][nameIndex]) == "undefined") { myObj[nameA[0]][nameIndex]={}; } } else if(typeof(myObj[nameA[0]]) == "undefined") { myObj[nameA[0]]={} } // if if (nameA.length == 1) { myObj=myObj[nameA[0]]; } else { myObj=myObj[nameA[0]][nameIndex]; } // if } // for if ((elm.type != "select-multiple" && elm.type != "checkbox" && elm.type != "radio") || (elm.type=="radio" && elm.checked)) { if(name == name.split("[")[0]) { myObj[name]=elm.value; } else { // can not set value when there is no name } } else if (elm.type == "checkbox" && elm.checked) { if(typeof(myObj[name]) == 'undefined') { myObj[name]=[ ]; } myObj[name].push(elm.value); } else if (elm.type == "select-multiple") { if(typeof(myObj[name]) == 'undefined') { myObj[name]=[ ]; } for (var jdx=0,len3=elm.options.length; jdx<len3; ++jdx) { if (elm.options[jdx].selected) { myObj[name].push(elm.options[jdx].value); } } } // if name=undefined; } // for return obj; }});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -