[ Index ] |
|
Code source de Kupu-1.3.5 |
1 /* BeforeUnload form processing */ 2 if (!window.beforeunload) (function() { 3 var BeforeUnloadHandler = function() { 4 var self = this; 5 6 this.message = "Your form has not been saved. All changes you have made will be lost"; 7 if (window._) { 8 this.message = _("Your form has not been saved. All changes you have made will be lost"); 9 }; 10 this.forms = []; 11 this.chkId = []; 12 this.chkType = new this.CheckType(); 13 this.handlers = [this.isAnyFormChanged]; 14 this.submitting = false; 15 16 this.execute = function(event) { 17 if (self.submitting) return; 18 if (!event) event = window.event; 19 20 for (var i = 0; i < self.handlers.length; i++) { 21 var fn = self.handlers[i]; 22 var message = message || fn.apply(self); 23 } 24 if (message===true) message = self.message; 25 if (message===false) message = undefined; 26 if (event && message) event.returnValue = message; 27 return message; 28 } 29 this.execute.tool = this; 30 } 31 var Class = BeforeUnloadHandler.prototype; 32 33 // form checking code 34 Class.isAnyFormChanged = function() { 35 for (var i=0; i < this.forms.length; i++) { 36 var form = this.forms[i]; 37 if (this.isElementChanged(form)) { 38 return true; 39 } 40 } 41 return false; 42 } 43 Class.addHandler = function(fn) { 44 this.handlers.push(fn); 45 } 46 Class.onsubmit = function() { 47 var tool = window.onbeforeunload && window.onbeforeunload.tool; 48 tool.submitting = true; 49 } 50 Class.addForm = function(form) { 51 for (var i = 0; i < this.forms.length; i++) { 52 if (this.forms[i]==form) return; 53 } 54 this.forms.push(form); 55 form.onsubmit = this.onsubmit; 56 var elements = form.getElementsByTagName('input'); 57 for (var j = 0; j < elements.length; j++) { 58 var ele = elements[j]; 59 if (ele.type=='hidden') { 60 ele.setAttribute('originalValue', ele.defaultValue); 61 } 62 } 63 } 64 Class.addForms = function() { 65 for (var i = 0; i < arguments.length; i++) { 66 var element = arguments[i]; 67 if (!element) continue; 68 if (element.tagName=='FORM') { 69 this.addForm(element); 70 } 71 else { 72 var forms = element.getElementsByTagName('form'); 73 for (var j = 0; j < forms.length; j++) { 74 this.addForm(forms[j]); 75 } 76 } 77 } 78 } 79 Class.removeForms = function() { 80 for (var i = 0; i < arguments.length; i++) { 81 var element = arguments[i]; 82 if (!element) continue; 83 if (element.tagName=='FORM') { 84 for (var j = 0; j < arguments.length; j++) { 85 if (this.forms[j] == element) { 86 this.forms.splice(j--, 1); 87 element.onsubmit=null; 88 } 89 } 90 } else { 91 var forms = element.getElementsByTagName('form'); 92 for (var j = 0; j < forms.length; j++) { 93 this.removeForms(forms[j]); 94 } 95 } 96 } 97 } 98 99 Class.CheckType = function() {}; 100 var c = Class.CheckType.prototype; 101 c.checkbox = c.radio = function(ele) { 102 return ele.checked != ele.defaultChecked; 103 } 104 c.password = c.textarea = c.text = function(ele) { 105 return ele.value != ele.defaultValue; 106 } 107 // hidden: cannot tell on Mozilla without special treatment 108 c.hidden = function(ele) { 109 var orig = ele.getAttribute("originalValue"); 110 return orig && (ele.value != orig); 111 } 112 113 c['select-one'] = function(ele) { 114 for (var i=0 ; i < ele.length; i++) { 115 var opt = ele.options[i]; 116 if ( opt.selected != opt.defaultSelected) { 117 if (i===0 && opt.selected) continue; /* maybe no default */ 118 return true; 119 } 120 } 121 return false; 122 } 123 124 c['select-multiple'] = function(ele) { 125 for (var i=0 ; i < ele.length; i++) { 126 var opt = ele.options[i]; 127 if ( opt.selected != opt.defaultSelected) { 128 return true; 129 } 130 } 131 return false; 132 } 133 134 Class.chk_form = function(form) { 135 var elements = form.elements; 136 for (var i=0; i < elements.length; i++ ) { 137 var element = elements[i]; 138 if (this.isElementChanged(element)) { 139 return true; 140 } 141 } 142 return false; 143 } 144 145 Class.isElementChanged = function(ele) { 146 var method = ele.id && this.chkId[ele.id]; 147 if (!method && ele.type && ele.name) 148 method = this.chkType[ele.type]; 149 if (!method && ele.tagName) 150 method = this['chk_'+ele.tagName.toLowerCase()]; 151 152 return method? method.apply(this, [ele]) : false; 153 }; 154 155 window.onbeforeunload = new BeforeUnloadHandler().execute; 156 })();
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sun Feb 25 15:30:41 2007 | par Balluche grâce à PHPXref 0.7 |