Программный запуск событий в Javascript для IE с помощью jQuery

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

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

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

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


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

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

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

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

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


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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
8 930
6

Ответы 6

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

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

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

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

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

У меня проблема в том, что моя компания хочет строго использовать валидаторы ASP. До этого момента у меня не было проблем с этим, но я думаю, что мне придется подумать об использовании проверки jQuery вместо этого, поскольку мое текущее решение не работает.

Dan Herbert 04.10.2008 06:11

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

Поскольку jQuery не является технологией Microsoft, а скрытое поле __EVENTTARGET доступно только для веб-форм ASP.NET и только тогда, когда есть обработчик событий, связанный с элементом на странице, я считаю. ИМО, вся модель обратной передачи, основанная на «событиях», не очень хорошо подходит для Интернета, и я ожидаю, что она исчезнет, ​​когда MVC получит известность.

tvanfosson 20.08.2009 15:46

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

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

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

Блестяще. Спасибо за лучшее решение.

Paul 02.08.2012 13:11

Это обычная проблема с 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();
}

Хотя это не дает прямого ответа на вопрос выше, это решает другую проблему с Datepicker-IE :)

Raghav 16.09.2011 09:10

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

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

Обновлять: Я отправил проблему в MS (связь).

Куда вы положили этот код? Эта проблема ломает мне голову! Мое событие проверки сейчас вообще не запускается.

Andez 16.05.2013 17:59

зарегистрирован в ClientScriptManager.RegisterStartupScript(...)

thorn̈ 16.05.2013 18:02

Хм, я добавил следующий код. Ни на что не влияет - ошибка все равно возникает. Это решение .NET 3.5 SP1 под SharePoint 2010. ClientScriptManager cm = Page.ClientScript; строковый ключ = "GRR"; if (! cm.IsStartupScriptRegistered (key)) {string script = "window.ValidatorHookupEvent = function (control, eventType, body) {$ (control) .bind (eventType.slice (2), new Function (\" event \ " , тело)); };"; cm.RegisterStartupScript (this.GetType (), ключ, скрипт, истина); }

Andez 16.05.2013 18:13

ОК +1, это работает, и событие запускается, как и ожидалось, спасибо :-)

Andez 16.05.2013 18:50

Другие вопросы по теме