这也是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 width: 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);