Статичный предотвращает другую единицу компиляции от externing, что переменная так, чтобы компилятор мог просто "встроить" значение переменной, где это используется и не создает устройство хранения данных памяти для него.
В Вашем втором примере, компилятор не может предположить, что некоторый другой исходный файл не будет экстерн это, таким образом, это должно будет на самом деле сохранить то значение в памяти где-нибудь.
Кажется, это своего рода ошибка, но добавление этой строки в объявление datepicker должно решить ее:
onSelect: function() {}
Не похоже, что вы делаете что-то неправильно, поскольку код ValidatorOnChange
генерируется для вас; что-то не так в том, как он создает свой объект vals
, который в конечном итоге оказывается равным нулю на ie8.
Это было запрошено до , и решение отменяет onSelect
функция с функцией no-op.
Это не единственная проблема валидатора. Вот примерно похожая проблема с функцией автозаполнения.
Я действительно не знаю, в чем проблема, но я заметил, что у вас нет набора ValidationGroup, и оба ваших валидатора имеют это значение. Вы можете попробовать установить ValidationGroup = "sh" в текстовом поле и посмотреть, поможет ли это.
Исправление ...
onSelect: function () {}
.. похоже, не работает, если проблема связана с CustomValidator, который полагается на обработчик побочных событий servewr для проверки ввода.
Здесь упоминается еще пара других исправлений ...
http://dev.jqueryui.com/ticket/4071
Проблема заключается в том, что обработка событий IE отличается от других браузеров и код проверки на стороне клиента, поставляемый ASP Net, не реагирует должным образом на ситуацию, не предусмотренную его авторами.
При выборе даты, блок сбора данных инициирует событие изменения в элементе INPUT
, но валидатор ASP.Net принимает событие щелчка вместо элемента A
и пытается найти валидаторы в элементе A
, а не в элементе INPUT
. Это можно наблюдать путем проверки события .srcElement
внутри функции валидатора ValidatorOnChange
. В браузерах, отличных от IE, тип event.type 'change' и event.target правильно является INPUT
.
В то время как функция noneop onSelect: function() { }
предотвращает ошибку, переопределяя .change()
, встроенную по умолчанию onSelect
, она также предотвращает срабатывание валидаторов. Вот обходной путь для обоих:
onSelect: function() {
this.fireEvent && this.fireEvent('onchange') || $(this).change();
}
Это использует обычный триггер .change()
, за исключением IE, где необходимо использовать .fireEvent
, чтобы объект события был связан с изменением, а не щелчком мыши.
Это обычная проблема для jQuery datepickers и элементов управления проверкой ASP. Как вы говорите, неправильный элемент перекрестно запускает процедуру проверки javascript ASP NET, а затем код M $ выдает ошибку, потому что триггерный элемент в подпрограмме не определен.
Я решил эту проблему иначе, чем все, кого я видел - решив, что M $ следовало бы написать свой код более надежно, и, следовательно, повторно объявив часть кода валидатора M $, чтобы справиться с неопределенным элементом. Все остальное, что я видел, по сути, является обходным путем на стороне jQuery и сокращает возможные функциональные возможности (например, использование события щелчка вместо изменения).
Бит, который терпит неудачу, - это
for (i = 0; i < vals.length; i++) {
ValidatorValidate(vals[i], null, event);
}
, который выдает ошибку при попытке получить длину для неопределенных 'vals'.
Я только что добавил
if (vals) {
for (i = 0; i < vals.length; i++) {
ValidatorValidate(vals[i], null, event);
}
}
, и она готова. Окончательный код, который повторно объявляет всю нарушающую функцию, приведен ниже. Я помещаю его как сценарий, включаемый в внизу моей главной страницы или страницы (так что это происходит после объявлений по умолчанию и заменяет более раннюю версию).
Да, это нарушит совместимость снизу вверх, если 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();
}
изменить jquery.ui.datepicker.js строка 1504
'" href="#" >' + printDate.getDate() + '</a>')
с тестом
'" href="javascript:DP_jQuery_' + dpuuid + '.datepicker._selectDay(\'#' +
inst.id + '\',' + printDate.getMonth() + ',' + printDate.getFullYear() + ', this);" >' + printDate.getDate() + '</a>')
работает нормально!