Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 并替换早期版本)_Asp.net_Jquery_Jquery Ui - Fatal编程技术网

Asp.net 并替换早期版本)

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

是的,如果M$决定在将来更改其验证程序代码,这确实会破坏兼容性。但是有人希望他们能修复它,然后我们就可以完全摆脱这个补丁了

//  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
函数实际上有两个参数:

  • 与日期选择器关联的文本框的值
  • id属性与textbox匹配的对象

    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.
        }
    });