在分析eayui的validatebox的源代码中发现,该验证框架不支持删除验证的方法,在api中可以看见有个destroy方法,这个方法不是用来删除验证的,而是把元素和验证都一块删除,所以不符合逻辑。
为此我写了一个删除验证的方法:
/* *@param elemId 元素的id *删除easyui已有的验证 */ function delRules(elemId){ var v = $("#"+elemId)[0] ; if($.data(v,'validatebox')){ $.data(v,'validatebox').options={}; $.data(v,'validatebox').tip=null; $("#"+elemId).removeClass('validatebox-invalid'); } }
调用改函数的方法
function delyanzheng(){ /*destroy把元素和验证都一块删除,所以不符合逻辑 $("#addValidate").validatebox('destroy'); */ delRules('addValidate'); }
验证框架的小箭头样式比较有意思以后可以用下。
css代码为:
.validatebox-tip{ position:absolute; width:200px; height:auto; display:none; z-index:9900000; } .validatebox-tip-content{ display:inline-block; position:absolute; top:0px; left:10px; padding:3px 5px; border:1px solid #CC9933; background:#FFFFCC; z-index:9900001; font-size:12px; } .validatebox-tip-pointer{ background:url('images/validatebox_pointer.gif') no-repeat left top; display:inline-block; width:10px; height:19px; position:absolute; left:1px; top:0px; z-index:9900002; }
效果图为:
上面的方法只能算是流氓编码,现在给出基于easyui的真正扩展方法的写法
$.extend($.fn.validatebox.methods, { remove:function(jq,param){ var f = param?param:false; if(f){ //动态combo var v = $.data(jq[0], 'combo').combo.find('input.combo-text')[0]; }else{ var v = jq[0] ; } if($.data(v,'validatebox')){ var tip = $.data(v, 'validatebox').tip; if (tip){ tip.remove(); } $(v).removeClass('validatebox-invalid'); $(v).removeClass('validatebox-text'); $(v).unbind('.validatebox'); $(v).removeData('validatebox'); } } });
使用方法如下:
如果删除的是普通的即非combo的使用此方法:
$("#addValidate2").validatebox('remove');
如果删除的是combo的极其子对象的使用此方法
$("#addValidate2").validatebox('remove',true);
至于参数true的含义,看我扩展的方法立马就知道了
上面的方式忘记了删除项切换和下拉列表的监听,下面的验证是最终版
$.extend($.fn.validatebox.methods, {
remove : function(jq, param) {
//console.error("ddd",$.data(jq[0], 'combo').combo);
var f = param ? param : false;
if (f) {
//动态combo
var v = $.data(jq[0], 'combo').combo.find('input.combo-text')[0];
var opts = $.data(jq[0], 'combo').options;
delete (opts.validType);
//主体面板
var panel = $.data(jq[0], 'combo').panel.find('div.combobox-item');
//console.error("items",panel.length);
//找到下拉箭头
var arrow = $.data(jq[0], 'combo').combo.find('.combo-arrow');
//删除所有的监听
arrow.unbind('.validatebox');
} else {
var v = jq[0];
}
if ($.data(v, 'validatebox')) {
//console.error("ddd11111",$.data(v,'validatebox').options);
var tip = $.data(v, 'validatebox').tip;
if (tip) {
tip.remove();
}
$(v).removeClass('validatebox-invalid');
$(v).removeClass('validatebox-text');
$(v).unbind('.validatebox');
$(v).die('focus');
$(v).removeData('validatebox');
}
}
});
$.extend($.fn.validatebox.methods, { remove : function(jq, param) { //console.error("ddd",$.data(jq[0], 'combo').combo); var f = param ? param : false; if (f) { //动态combo var v = $.data(jq[0], 'combo').combo.find('input.combo-text')[0]; var opts = $.data(jq[0], 'combo').options; delete (opts.validType); //主体面板 var panel = $.data(jq[0], 'combo').panel.find('div.combobox-item'); //console.error("items",panel.length); //找到下拉箭头 var arrow = $.data(jq[0], 'combo').combo.find('.combo-arrow'); //删除所有的监听 arrow.unbind('.validatebox'); } else { var v = jq[0]; } if ($.data(v, 'validatebox')) { //console.error("ddd11111",$.data(v,'validatebox').options); var tip = $.data(v, 'validatebox').tip; if (tip) { tip.remove(); } $(v).removeClass('validatebox-invalid'); $(v).removeClass('validatebox-text'); $(v).unbind('.validatebox'); $(v).die('focus'); $(v).removeData('validatebox'); } } });