Программно запускаемые события в Javascript для IE с использованием jQuery - PullRequest
9 голосов
/ 03 октября 2008

Когда событие запускается пользователем в IE, ему присваивается объект window.event. Единственный способ узнать, что вызвало событие, - это получить доступ к объекту window.event (насколько я знаю)

Это вызывает проблему в валидаторах ASP.NET, если событие запускается программно, например, при запуске события через jQuery. В этом случае объект window.event хранит последнее инициированное пользователем событие.

Когда событие onchange запускается программным способом для текстового поля, к которому присоединен валидатор ASP.NET, проверка прерывается, потому что он смотрит на элемент, который вызвал последнее событие, а не на тот элемент, который валидатор для.

Кто-нибудь знает способ обойти это? Это кажется проблемой, которую можно решить, но, глядя в онлайн, большинство людей просто находят способы игнорировать проблему, а не решать ее.


Чтобы объяснить, что я конкретно делаю:
Я использую плагин выбора времени jQuery в текстовом поле, с которым также связаны 2 валидатора ASP.NET. Когда время изменилось, я использую панель обновления для отправки обратно на сервер, чтобы динамически выполнять некоторые действия, поэтому мне нужно вызвать событие onchange, чтобы инициировать обратную передачу для этого текстового поля.

Средство выбора времени jQuery работает путем создания скрытого неупорядоченного списка, который становится видимым при щелчке по текстовому полю. При щелчке по одному из элементов списка событие «изменение» запускается программным способом для текстового поля с помощью метода jQuery change().

Поскольку триггером для события был элемент списка, IE видит элемент списка как источник события, а не текстовое поле, как это должно быть.

Я не слишком обеспокоен тем, что этот валидатор ASP.NET работает, как только текстовое поле изменяется, мне просто нужно обработать событие "change", чтобы мое текстовое поле вызывалось для события обратной передачи. Проблема в том, что валидатор генерирует исключение в IE, которое останавливает запуск любого события.

Firefox (и я предполагаю, что другие браузеры) не имеют этой проблемы. Только IE из-за другой модели событий. Кто-нибудь сталкивался с этим и видел, как это исправить?


Я обнаружил, что об этой проблеме сообщили в нескольких других местах, но они не предлагают решений:

Ответы [ 6 ]

7 голосов
/ 16 декабря 2008

У меня была такая же проблема. Решено с помощью этой функции:

jQuery.fn.extend({
    fire: function(evttype){ 
        el = this.get(0);
        if (document.createEvent) {
            var evt = document.createEvent('HTMLEvents'); 
            evt.initEvent(evttype, false, false); 
            el.dispatchEvent(evt); 
        } else if (document.createEventObject) { 
            el.fireEvent('on' + evttype); 
        }
        return this;
    }
});

Так что мой обработчик события onSelect для datepicker выглядит так:

if ($.browser.msie) {
    datepickerOptions = $.extend(datepickerOptions, { 
        onSelect: function(){
            $(this).fire("change").blur();
        }
    });
}
4 голосов
/ 25 января 2012

Я решил проблему с патчем:

    window.ValidatorHookupEvent = function(control, eventType, body) {
        $(control).bind(eventType.slice(2), new Function("event", body));
    };

Обновление: Я отправил вопрос в MS ( ссылка ).

2 голосов
/ 25 мая 2010

Это эндемическая проблема с датчиками jQuery и средствами проверки ASP. Как вы говорите, неправильный элемент вызывает перекрестную запуск подпрограммы проверки подлинности JavaScript NET NET, а затем M $ -код выдает ошибку, потому что запускающий элемент в подпрограмме не определен.

Я решил эту проблему иначе, чем кто-либо другой, которого я видел, - решив, что M $ должен был написать свой код более надежно, и, следовательно, переопределил часть кода валидатора M $, чтобы справиться с неопределенным элементом. Все остальное, что я видел, по сути является обходным путем на стороне jQuery и исключает возможную функциональность (например, использование события click вместо change).

Неудачный бит

   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();
}
2 голосов
/ 05 октября 2008

Рассмотрите возможность установки значения скрытого поля _EVENTTARGET, прежде чем инициировать событие с помощью JavaScript. Вам нужно будет установить для него идентификатор на стороне сервера (замените подчеркивание на $ в идентификаторе клиента), чтобы сервер это понял. Я делаю это по нажатию кнопок, которые я имитирую, чтобы серверная сторона могла определить, какой метод OnClick следует запускать при отправке результата - Ajax или нет, на самом деле не имеет значения.

2 голосов
/ 04 октября 2008

Из того, что вы описываете, эта проблема, вероятно, является результатом уникальной модели всплытия событий, которую IE использует для JS.

Мой единственный реальный ответ - отказаться от валидаторов ASP.NET и использовать вместо этого плагин для проверки форм jQuery. Тогда ваше текстовое поле может быть просто обычным элементом управления ASP Webforms, и когда содержимое меняется и происходит обратная передача, все хорошо. Кроме того, вы сохраняете больше проблем на стороне клиента отдельно от кода сервера.

Мне никогда не удавалось смешивать элементы управления клиента Webform (например, элементы проверки формы) с внешними библиотеками JS, такими как jQuery. Я обнаружил, что лучший путь - это просто следовать одному или другому, но не смешивать и сочетать.

Не тот ответ, который вы, вероятно, ищете.

Если вы хотите использовать плагин для проверки формы jQuery, то этот Проверка формы jQuery

0 голосов
/ 29 ноября 2008

Вот так я решил проблему с симларом. Написал обработчик onSelect () для средства выбора даты. текст ссылки В этой функции она называется __doPostBack ('textboxcontrolid', ''). Это вызвало частичную обратную передачу текстового поля на сервер, который по очереди вызывал валидаторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...