easy ui 1.4的NumberBox,失去焦点后不能再次输入小数点

这也是1.4版本的bug,现在1.4.1也发布了,经验证,该问题在新版本中已经解决了

在网上找到的解决办法,地址:http://www.jeasyui.com/forum/index.php?topic=3659.msg8388

在easy ui的js里,添加下面的js代码:

  1 /**
  2  * The Patch for jQuery EasyUI 1.4
  3  */
  4 (function($){
  5     var plugin = $.fn._size;
  6     $.fn._size = function(options, parent){
  7         if (typeof options != 'string'){
  8             return this.each(function(){
  9                 parent = parent || $(this).parent();
 10                 if (parent.length){
 11                     plugin.call($(this), options, parent);
 12                 }
 13             });
 14         } else if (options == 'unfit'){
 15             return this.each(function(){
 16                 var p = $(this).parent();
 17                 if (p.length){
 18                     plugin.call($(this), options, parent);
 19                 }
 20             });
 21         } else {
 22             return plugin.call(this, options, parent);
 23         }
 24     }
 25 })(jQuery);
 26 
 27 (function($){
 28     $.map(['validatebox','textbox','filebox','searchbox',
 29             'combo','combobox','combogrid','combotree',
 30             'datebox','datetimebox','numberbox',
 31             'spinner','numberspinner','timespinner','datetimespinner'], function(plugin){
 32         if ($.fn[plugin]){
 33             if ($.fn[plugin].defaults.events){
 34                 $.fn[plugin].defaults.events.click = function(e){
 35                     if (!$(e.data.target).is(':focus')){
 36                         $(e.data.target).trigger('focus');
 37                     }
 38                 };
 39             }
 40         }
 41     });
 42     $.fn.combogrid.defaults.height = 22;
 43     $(function(){
 44         $(document).bind('mousewheel', function(e){
 45             $(e.target).trigger('mousedown.combo');
 46         });
 47     });
 48 })(jQuery);
 49 
 50 (function($){
 51     function setMe(target){
 52         var state = $.data(target, 'textbox');
 53         var opts = state.options;
 54         state.textbox.find('.textbox-addon .textbox-icon').each(function(index){
 55             $(this).attr('tabindex', '-1');
 56         });
 57         $(target).textbox('textbox').unbind('focus.textbox').bind('focus.textbox', function(e){
 58             var tb = $(target).next();
 59             if (tb.hasClass('textbox-focused')){return;}
 60             if ($(this).val() != opts.value){
 61                 $(this).val(opts.value);
 62             }
 63             $(this).removeClass('textbox-prompt');
 64             tb.addClass('textbox-focused');
 65         });
 66     }
 67 
 68     var plugin = $.fn.textbox;
 69     $.fn.textbox = function(options, param){
 70         if (typeof options != 'string'){
 71             return this.each(function(){
 72                 plugin.call($(this), options, param);
 73                 setMe(this);
 74             });
 75         } else {
 76             return plugin.call(this, options, param);
 77         }
 78     };
 79     $.fn.textbox.methods = plugin.methods;
 80     $.fn.textbox.defaults = plugin.defaults;
 81     $.fn.textbox.parseOptions = plugin.parseOptions;
 82 })(jQuery);
 83 
 84 (function($){
 85     function setMe(target){
 86         var addon = $(target).next().find('.textbox-addon');
 87         addon.find('.spinner-arrow-up,.spinner-arrow-down').attr('tabindex','-1');
 88     }
 89 
 90     var plugin = $.fn.spinner;
 91     $.fn.spinner = function(options, param){
 92         if (typeof options != 'string'){
 93             return this.each(function(){
 94                 plugin.call($(this), options, param);
 95                 setMe(this);
 96             });
 97         } else {
 98             return plugin.call(this, options, param);
 99         }
100     };
101     $.fn.spinner.methods = plugin.methods;
102     $.fn.spinner.defaults = plugin.defaults;
103     $.fn.spinner.parseOptions = plugin.parseOptions;
104 })(jQuery);
105 
106 (function($){
107     $.extend($.fn.form.methods, {
108         clear: function(jq){
109             return jq.each(function(){
110                 var target = this;
111                 $('input,select,textarea', target).each(function(){
112                     var t = this.type, tag = this.tagName.toLowerCase();
113                     if (t == 'text' || t == 'hidden' || t == 'password' || tag == 'textarea'){
114                         this.value = '';
115                     } else if (t == 'file'){
116                         var file = $(this);
117                         if (!file.hasClass('textbox-value')){
118                             var newfile = file.clone().val('');
119                             newfile.insertAfter(file);
120                             if (file.data('validatebox')){
121                                 file.validatebox('destroy');
122                                 newfile.validatebox();
123                             } else {
124                                 file.remove();
125                             }
126                         }
127                     } else if (t == 'checkbox' || t == 'radio'){
128                         this.checked = false;
129                     } else if (tag == 'select'){
130                         this.selectedIndex = -1;
131                     }
132                 });
133                 
134                 var t = $(target);
135                 var plugins = ['textbox','combo','combobox','combotree','combogrid','slider'];
136                 for(var i=0; i<plugins.length; i++){
137                     var plugin = plugins[i];
138                     var r = t.find('.'+plugin+'-f');
139                     if (r.length && r[plugin]){
140                         r[plugin]('clear');
141                     }
142                 }
143                 $(target).form('validate');
144             });
145         }
146     });
147     $.extend($.fn.form.defaults, {
148         onSubmit:function(){
149             $(this).find('.textbox-text:focus').blur();
150             return $(this).form('validate');
151         }
152     });
153 })(jQuery);
154 
155 (function($){
156     function setSize(target, param){
157         var opts = $.data(target, 'linkbutton').options;
158         if (param){
159             $.extend(opts, param);
160         }
161         if (opts.width || opts.height || opts.fit){
162             var btn = $(target);
163             var parent = btn.parent();
164             var isVisible = btn.is(':visible');
165             if (!isVisible){
166                 var spacer = $('<div style="display:none"></div>').insertBefore(target);
167                 var style = {
168                     position: btn.css('position'),
169                     display: btn.css('display'),
170                     left: btn.css('left')
171                 };
172                 btn.appendTo('body');
173                 btn.css({
174                     position:'absolute',
175                     display:'inline-block',
176                     left:-20000
177                 });
178             }
179             btn._size(opts, parent);
180             var left = btn.find('.l-btn-left');
181             left.css('margin-top', 0);
182             left.css('margin-top', parseInt((btn.height()-left.height())/2)+'px');
183             if (!isVisible){
184                 btn.insertAfter(spacer);
185                 btn.css(style);
186                 spacer.remove();
187             }
188         }
189     }
190 
191     var plugin = $.fn.linkbutton;
192     $.fn.linkbutton = function(options, param){
193         if (typeof options != 'string'){
194             return this.each(function(){
195                 plugin.call($(this), options, param);
196                 setSize(this);
197             });
198         } else {
199             return plugin.call(this, options, param);
200         }
201     };
202     $.fn.linkbutton.methods = plugin.methods;
203     $.fn.linkbutton.defaults = plugin.defaults;
204     $.fn.linkbutton.parseOptions = plugin.parseOptions;
205     $.extend($.fn.linkbutton.methods, {
206         resize: function(jq, param){
207             return jq.each(function(){
208                 setSize(this, param);
209             })
210         }
211     })
212 })(jQuery);
213 
214 (function($){
215     var plugin = $.fn.dialog;
216     $.fn.dialog = function(options, param){
217         var result = plugin.call(this, options, param);
218         if (typeof options != 'string'){
219             this.each(function(){
220                 var opts = $(this).panel('options');
221                 if (isNaN(parseInt(opts.height))){
222                     $(this).css('height', '');
223                 }
224                 var onResize = opts.onResize;
225                 opts.onResize = function(w, h){
226                     onResize.call(this, w, h);
227                     if (isNaN(parseInt(opts.height))){
228                         $(this).css('height', '');
229                     }
230                     var shadow = $.data(this, 'window').shadow;
231                     if (shadow){
232                         var cc = $(this).panel('panel');
233                         shadow.css({
234                              cc._outerWidth(),
235                             height: cc._outerHeight()
236                         });
237                     }
238                 }
239                 if (opts.closed){
240                     var pp = $(this).panel('panel');
241                     pp.show();
242                     $(this).panel('resize');
243                     pp.hide();
244                 }
245             });
246         }
247         return result;
248     };
249     $.fn.dialog.methods = plugin.methods;
250     $.fn.dialog.parseOptions = plugin.parseOptions;
251     $.fn.dialog.defaults = plugin.defaults;
252 })(jQuery);
253 
254 (function($){
255     function createTab(container, pp, options) {
256         var state = $.data(container, 'tabs');
257         options = options || {};
258         
259         // create panel
260         pp.panel({
261             border: false,
262             noheader: true,
263             closed: true,
264             doSize: false,
265             iconCls: (options.icon ? options.icon : undefined)
266         });
267         
268         var opts = pp.panel('options');
269         $.extend(opts, options, {
270             onLoad: function(){
271                 if (options.onLoad){
272                     options.onLoad.call(this, arguments);
273                 }
274                 state.options.onLoad.call(container, $(this));
275             }
276         });
277         
278         var tabs = $(container).children('div.tabs-header').find('ul.tabs');
279         
280         opts.tab = $('<li></li>').appendTo(tabs);    // set the tab object in panel options
281         opts.tab.append(
282                 '<a href="javascript:void(0)" class="tabs-inner">' +
283                 '<span class="tabs-title"></span>' +
284                 '<span class="tabs-icon"></span>' +
285                 '</a>'
286         );
287         
288         $(container).tabs('update', {
289             tab: pp,
290             options: opts
291         });
292     }
293     function addTab(container, options) {
294         var opts = $.data(container, 'tabs').options;
295         var tabs = $.data(container, 'tabs').tabs;
296         if (options.selected == undefined) options.selected = true;
297         
298         var pp = $('<div></div>').appendTo($(container).children('div.tabs-panels'));
299         tabs.push(pp);
300         createTab(container, pp, options);
301         
302         opts.onAdd.call(container, options.title, tabs.length-1);
303         
304         $(container).tabs('resize');
305         if (options.selected){
306             $(container).tabs('select', tabs.length-1);
307         }
308     }
309     $.extend($.fn.tabs.methods, {
310         add: function(jq, options){
311             return jq.each(function(){
312                 addTab(this, options);
313             })
314         }
315     })
316 })(jQuery);
317 
318 (function($){
319     $.extend($.fn.menubutton.methods, {
320         enable: function(jq){
321             return jq.each(function(){
322                 $(this).data('menubutton').options.disabled = false;
323                 $(this).linkbutton('enable');
324             });
325         }
326     });
327 })(jQuery);
328 
329 (function($){
330     var onAfterRender = $.fn.datagrid.defaults.view.onAfterRender;
331     $.extend($.fn.datagrid.defaults.view, {
332         updateRow: function(target, rowIndex, row){
333             var opts = $.data(target, 'datagrid').options;
334             var rows = $(target).datagrid('getRows');
335             
336             var oldStyle = _getRowStyle(rowIndex);
337             $.extend(rows[rowIndex], row);
338             var newStyle = _getRowStyle(rowIndex);
339             var oldClassValue = oldStyle.c;
340             var styleValue = newStyle.s;
341             var classValue = 'datagrid-row ' + (rowIndex % 2 && opts.striped ? 'datagrid-row-alt ' : ' ') + newStyle.c;
342             
343             function _getRowStyle(rowIndex){
344                 var css = opts.rowStyler ? opts.rowStyler.call(target, rowIndex, rows[rowIndex]) : '';
345                 var classValue = '';
346                 var styleValue = '';
347                 if (typeof css == 'string'){
348                     styleValue = css;
349                 } else if (css){
350                     classValue = css['class'] || '';
351                     styleValue = css['style'] || '';
352                 }
353                 return {c:classValue, s:styleValue};
354             }
355             function _update(frozen){
356                 var fields = $(target).datagrid('getColumnFields', frozen);
357                 var tr = opts.finder.getTr(target, rowIndex, 'body', (frozen?1:2));
358                 var checked = tr.find('div.datagrid-cell-check input[type=checkbox]').is(':checked');
359                 tr.html(this.renderRow.call(this, target, fields, frozen, rowIndex, rows[rowIndex]));
360                 tr.attr('style', styleValue).removeClass(oldClassValue).addClass(classValue);
361                 if (checked){
362                     tr.find('div.datagrid-cell-check input[type=checkbox]')._propAttr('checked', true);
363                 }
364             }
365             
366             _update.call(this, true);
367             _update.call(this, false);
368             $(target).datagrid('fixRowHeight', rowIndex);
369         },
370         onAfterRender: function(target){
371             onAfterRender.call($.fn.datagrid.defaults.view, target);
372             setTimeout(function(){
373                 var opts = $(target).datagrid('options');
374                 opts.pageNumber = opts.pageNumber || 1;
375             },0);
376         }
377     });
378     
379     $.fn.datagrid.defaults.loader = function(param, success, error){
380         var opts = $(this).datagrid('options');
381         if (!opts.url) return false;
382         if (opts.pagination && opts.pageNumber == 0){
383             opts.pageNumber = 1;
384             param.page = 1;
385         }
386         if (param.page == 0){
387             return false;
388         }
389         $.ajax({
390             type: opts.method,
391             url: opts.url,
392             data: param,
393             dataType: 'json',
394             success: function(data){
395                 success(data);
396             },
397             error: function(){
398                 error.apply(this, arguments);
399             }
400         });
401     };
402 })(jQuery);
403 (function($){
404     function indexOfArray(a,o){
405         for(var i=0,len=a.length; i<len; i++){
406             if (a[i] == o) return i;
407         }
408         return -1;
409     }
410     function endEdit(target, index){
411         var state = $.data(target, 'datagrid');
412         var opts = state.options;
413         var updatedRows = state.updatedRows;
414         var insertedRows = state.insertedRows;
415         
416         var tr = opts.finder.getTr(target, index);
417         var row = opts.finder.getRow(target, index);
418         if (!tr.hasClass('datagrid-row-editing')) {
419             return;
420         }
421         
422         if (!$(target).datagrid('validateRow', index)){return}
423         
424         var changed = false;
425         var changes = {};
426         tr.find('div.datagrid-editable').each(function(){
427             var field = $(this).parent().attr('field');
428             var ed = $.data(this, 'datagrid.editor');
429             var t = $(ed.target);
430             var input = t.data('textbox') ? t.textbox('textbox') : t;
431             input.triggerHandler('blur');
432             var value = ed.actions.getValue(ed.target);
433             if (row[field] != value){
434                 row[field] = value;
435                 changed = true;
436                 changes[field] = value;
437             }
438         });
439         if (changed){
440             if (indexOfArray(insertedRows, row) == -1){
441                 if (indexOfArray(updatedRows, row) == -1){
442                     updatedRows.push(row);
443                 }
444             }
445         }
446         opts.onEndEdit.call(target, index, row, changes);
447         
448         tr.removeClass('datagrid-row-editing');
449         
450         destroyEditor(target, index);
451         $(target).datagrid('refreshRow', index);
452         
453         opts.onAfterEdit.call(target, index, row, changes);
454     }
455     function destroyEditor(target, index){
456         var opts = $.data(target, 'datagrid').options;
457         var tr = opts.finder.getTr(target, index);
458         tr.children('td').each(function(){
459             var cell = $(this).find('div.datagrid-editable');
460             if (cell.length){
461                 var ed = $.data(cell[0], 'datagrid.editor');
462                 if (ed.actions.destroy) {
463                     ed.actions.destroy(ed.target);
464                 }
465                 cell.html(ed.oldHtml);
466                 $.removeData(cell[0], 'datagrid.editor');
467                 
468                 cell.removeClass('datagrid-editable');
469                 cell.css('width','');
470             }
471         });
472     }
473     
474     $.extend($.fn.datagrid.methods, {
475         endEdit: function(jq, index){
476             return jq.each(function(){
477                 endEdit(this, index);
478             })
479         }
480     })
481 })(jQuery);
482 
483 (function($){
484     function setGrid(target){
485         var opts = $.data(target, 'propertygrid').options;
486         $(target).datagrid('options').onBeforeEdit = function(index, row){
487             if (opts.onBeforeEdit.call(target, index, row) == false){return false;}
488             var dg = $(this);
489             var col = dg.datagrid('getColumnOption', 'value');
490             col.editor = row.editor;            
491         }
492     }
493 
494     var plugin = $.fn.propertygrid;
495     $.fn.propertygrid = function(options, param){
496         if (typeof options == 'string'){
497             return plugin.call(this, options, param);
498         } else {
499             return this.each(function(){
500                 plugin.call($(this), options, param);
501                 setGrid(this);
502             });
503         }
504     };
505     $.fn.propertygrid.defaults = plugin.defaults;
506     $.fn.propertygrid.methods = plugin.methods;
507     $.fn.propertygrid.parseOptions = plugin.parseOptions;
508 })(jQuery);
509 
510 (function($){
511     $.fn.numberbox.defaults.filter = function(e){
512         var opts = $(this).numberbox('options');
513         var s = $(this).numberbox('getText');
514         if (e.which == 45){    //-
515             return (s.indexOf('-') == -1 ? true : false);
516         }
517         var c = String.fromCharCode(e.which);
518         if (c == opts.decimalSeparator){
519             return (s.indexOf(c) == -1 ? true : false);
520         } else if (c == opts.groupSeparator){
521             return true;
522         } else if ((e.which >= 48 && e.which <= 57 && e.ctrlKey == false && e.shiftKey == false) || e.which == 0 || e.which == 8) {
523             return true;
524         } else if (e.ctrlKey == true && (e.which == 99 || e.which == 118)) {
525             return true;
526         } else {
527             return false;
528         }
529     }
530 })(jQuery);
531 
532 (function($){
533     var FILE_INDEX = 0;
534     function buildFileBox(target){
535         var state = $.data(target, 'filebox');
536         var opts = state.options;
537         var id = 'filebox_file_id_' + (++FILE_INDEX);
538         $(target).addClass('filebox-f').textbox($.extend({}, opts, {
539             buttonText: opts.buttonText ? ('<label for="' + id + '">' + opts.buttonText + '</label>') : ''
540         }));
541         $(target).textbox('textbox').attr('readonly','readonly');
542         state.filebox = $(target).next().addClass('filebox');
543         state.filebox.find('.textbox-value').remove();
544         opts.oldValue = "";
545         var file = $('<input type="file" class="textbox-value">').appendTo(state.filebox);
546         file.attr('id', id).attr('name', $(target).attr('textboxName')||'');
547         file.css('visibility', 'visible');
548         file.change(function(){
549             $(target).filebox('setText', this.value);
550             opts.onChange.call(target, this.value, opts.oldValue);
551             opts.oldValue = this.value;
552         });
553         var btn = $(target).filebox('button');
554         if (btn.length){
555             if (btn.linkbutton('options').disabled){
556                 file.attr('disabled', 'disabled');
557             } else {
558                 file.removeAttr('disabled');
559             }            
560         }
561     }
562 
563     var plugin = $.fn.filebox;
564     $.fn.filebox = function(options, param){
565         if (typeof options != 'string'){
566             return this.each(function(){
567                 plugin.call($(this), options, param);
568                 buildFileBox(this);
569             });
570         } else {
571             return plugin.call(this, options, param);
572         }
573     };
574     $.fn.filebox.methods = plugin.methods;
575     $.fn.filebox.defaults = plugin.defaults;
576     $.fn.filebox.parseOptions = plugin.parseOptions;
577 })(jQuery);
578 
579 (function($){
580     function forNodes(data, callback){
581         var nodes = [];
582         for(var i=0; i<data.length; i++){
583             nodes.push(data[i]);
584         }
585         while(nodes.length){
586             var node = nodes.shift();
587             if (callback(node) == false){return;}
588             if (node.children){
589                 for(var i=node.children.length-1; i>=0; i--){
590                     nodes.unshift(node.children[i]);
591                 }
592             }
593         }
594     }
595     function findNodeBy(target, param, value){
596         var data = $.data(target, 'tree').data;
597         var result = null;
598         forNodes(data, function(node){
599             if (node[param] == value){
600                 result = attachProperties(node);
601                 return false;
602             }
603         });
604         return result;
605     }
606     function getNode(target, nodeEl){
607         return findNodeBy(target, 'domId', $(nodeEl).attr('id'));
608     }
609     function attachProperties(node){
610         var d = $('#'+node.domId);
611         node.target = d[0];
612         node.checked = d.find('.tree-checkbox').hasClass('tree-checkbox1');
613         return node;
614     }
615     $.fn.tree.methods.getChildren = function(jq, nodeEl){
616         var target = jq[0];
617         var nodes = [];
618         var n = getNode(target, nodeEl);
619         var data = n ? (n.children||[]) : $.data(target, 'tree').data;
620         forNodes(data, function(node){
621             nodes.push(attachProperties(node));
622         });
623         return nodes;
624     }
625 })(jQuery);
原文地址:https://www.cnblogs.com/zzgblog/p/4087234.html