Asp.net 并替换早期版本)
是的,如果M$决定在将来更改其验证程序代码,这确实会破坏兼容性。但是有人希望他们能修复它,然后我们就可以完全摆脱这个补丁了Asp.net 并替换早期版本),asp.net,jquery,jquery-ui,Asp.net,Jquery,Jquery Ui,是的,如果M$决定在将来更改其验证程序代码,这确实会破坏兼容性。但是有人希望他们能修复它,然后我们就可以完全摆脱这个补丁了 // Fix issue with datepicker and ASPNET validators: redeclare MS validator code with fix function ValidatorOnChange(event) { if (!event) { event = window.event; } Pag
// Fix issue with datepicker and ASPNET validators: redeclare MS validator code with fix
function ValidatorOnChange(event) {
if (!event) {
event = window.event;
}
Page_InvalidControlToBeFocused = null;
var targetedControl;
if ((typeof (event.srcElement) != "undefined") && (event.srcElement != null)) {
targetedControl = event.srcElement;
}
else {
targetedControl = event.target;
}
var vals;
if (typeof (targetedControl.Validators) != "undefined") {
vals = targetedControl.Validators;
}
else {
if (targetedControl.tagName.toLowerCase() == "label") {
targetedControl = document.getElementById(targetedControl.htmlFor);
vals = targetedControl.Validators;
}
}
var i;
if (vals) {
for (i = 0; i < vals.length; i++) {
ValidatorValidate(vals[i], null, event);
}
}
ValidatorUpdateIsValid();
}
//修复datepicker和ASPNET验证程序的问题:使用修复程序重新声明MS验证程序代码
函数ValidatorOnChange(事件){
如果(!事件){
event=window.event;
}
Page_InvalidControlToBeFocused=null;
var目标控制;
if((typeof(event.srcmelement)!=“undefined”)&&(event.srcmelement!=null)){
targetedControl=event.src元素;
}
否则{
targetedControl=event.target;
}
var VAL;
if(typeof(targetedControl.Validators)!=“未定义”){
VAL=targetedControl.Validators;
}
否则{
if(targetedControl.tagName.toLowerCase()=“标签”){
targetedControl=document.getElementById(targetedControl.htmlFor);
VAL=targetedControl.Validators;
}
}
var i;
if(VAL){
对于(i=0;i
更改jquery.ui.datepicker.js第1504行
'" href="#" >' + printDate.getDate() + '</a>')
”“href=“#”>”+printDate.getDate()+”)
与
href=“javascript:DP\u jQuery”+dpuuid+'.datepicker.\u selectDay(\'\35;'+
inst.id+“\”,“+printDate.getMonth()+”,“+printDate.getFullYear()+”,this);“>”+printDate.getDate()+”)
测试正常 以上提供的解决方案只能防止错误发生 在日期选择器上:
onSelect : function(dateText, inst){ inst.input.trigger('cValidate')
并将事件绑定到日历输入元素
.bind('cValidate', function (event) { window.ValidatorOnChange(event); });
这将使用正确的事件参数(输入字段)触发validatorchanged事件。基于上述答案,并为我的上述评论提供更多详细信息
显然,在IE9+和其他浏览器中,现在应该使用
dispatchEvent
触发更改事件。()
日期选择器中的OnSelect
函数实际上有两个参数:
mytextbox.datepicker({
defaultDate: null,
numberOfMonths: 1,
dateFormat: DisplayDateFormat,
onSelect: function (value, source) {
}
});
document.getElementById()
检索textbox,我认为这是不必要的,因为源对象的id与textbox相同。仔细检查后发现,源是一个对象,而不是textbox元素。我发现以下代码解决了问题:
mytextbox.datepicker({
defaultDate: null,
numberOfMonths: 1,
dateFormat: DisplayDateFormat,
onSelect: function (value, source) {
var ctrl = document.getElementById(source.id);
if ("dispatchEvent" in ctrl) {
// IE9
var evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
ctrl.dispatchEvent(evt);
} else if ("fireEvent" in ctrl) {
// IE7/IE8
ctrl.fireEvent("onchange");
} else {
$(ctrl).change();
}
}
});
更新:这种方法似乎不再有效-不确定原因。它阻止抛出错误,但不会触发更改事件。原因
根bug(我认为它可能是一个特性,或者是一个已知IE bug的解决方法?)存在于ASP.Net的ValidatorHookupEvent
:
var func;
if (navigator.appName.toLowerCase().indexOf('explorer') > -1) {
func = new Function(functionPrefix + " " + ev);
}
else {
func = new Function("event", functionPrefix + " " + ev);
}
因此,在默认情况下,没有其他onchange
注册,这将设置输入的onchange
与
function() { ValidatorOnChange(event); }
在IE和
function(event) { ValidatorOnChange(event); }
在其他浏览器中。因此,如果您正在使用IE,传递给ValidatorOnChange
的事件将是window.event
(因为window
是全局对象)
建议的解决办法
如果你不想随便使用ASP.Net脚本,那么我认为最好的处理方法是检测并替换坏掉的事件处理程序。与这里的其他建议一样,我提供了一个onSelect
以包含在日期选择器
选项中
onSelect: function(dateStr, datePicker) {
// http://stackoverflow.com/questions/1704398
if (datePicker.input[0].onchange.toString().match(/^[^(]+\(\)\s*{\s*ValidatorOnChange\(event\);\s*}\s*$/)) {
datePicker.input[0].onchange = ValidatorOnChange;
}
datePicker.input.trigger("change");
}
我正在全球范围内应用这项技术
$.datepicker.setDefaults({
onSelect: function(dateStr, datePicker) {
etc.
}
});
好的,2年前,在更旧的jQuery UI版本中,它确实起作用了。那么有人得到了最新版本的jQuery UI的解决方案了吗?下面提到的rdworth的解决方案是为jQuery UI 1.8工作的,使用jQuery 1.8修复根本原因更好:onSelect:function(){$(this).change();}显然,在IE9+和其他浏览器中,现在应该使用dispatchEvent触发更改事件。请看这篇文章:我只在IE11上遇到了这个问题,这个解决方案对我很有效。我将jQueryUIV1.11.3与jQueryV1.10.2一起使用
mytextbox.datepicker({
defaultDate: null,
numberOfMonths: 1,
dateFormat: DisplayDateFormat,
onSelect: function (value, source) {
}
});
mytextbox.datepicker({
defaultDate: null,
numberOfMonths: 1,
dateFormat: DisplayDateFormat,
onSelect: function (value, source) {
var ctrl = document.getElementById(source.id);
if ("dispatchEvent" in ctrl) {
// IE9
var evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
ctrl.dispatchEvent(evt);
} else if ("fireEvent" in ctrl) {
// IE7/IE8
ctrl.fireEvent("onchange");
} else {
$(ctrl).change();
}
}
});
var func;
if (navigator.appName.toLowerCase().indexOf('explorer') > -1) {
func = new Function(functionPrefix + " " + ev);
}
else {
func = new Function("event", functionPrefix + " " + ev);
}
function() { ValidatorOnChange(event); }
function(event) { ValidatorOnChange(event); }
onSelect: function(dateStr, datePicker) {
// http://stackoverflow.com/questions/1704398
if (datePicker.input[0].onchange.toString().match(/^[^(]+\(\)\s*{\s*ValidatorOnChange\(event\);\s*}\s*$/)) {
datePicker.input[0].onchange = ValidatorOnChange;
}
datePicker.input.trigger("change");
}
$.datepicker.setDefaults({
onSelect: function(dateStr, datePicker) {
etc.
}
});