Я пытаюсь заменить обработчик события JavaScript onclick в ASP.NET, который добавляется в элемент управления кнопки при использовании элементов управления проверки. Вот что выводится в HTML из ASP.NET в этом сценарии:

<input type="image" name="ibSubmit1" id="ibSubmit1" src="button-green-submit.gif" onclick="showProgress1();WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ibSubmit1&quot;, &quot;&quot;, true, &quot;Group1&quot;, &quot;&quot;, false, false))" style="border-width:0px;" />

Я выглядел довольно пристально, и, к сожалению, кажется, что нет способа изменить функциональную серверную часть, прежде чем она будет внедрена в страницу.

Поскольку я разрабатываю элемент управления и хочу, чтобы он был неинвазивным и самодостаточным, и мне интересно получить параметр validationGroup объекта WebForm_PostBackOptions, кажется, что самым простым решением было бы использование JavaScript заменить имя функции WebForm_DoPostBackWithOptions моей пользовательской функцией-оболочкой и оставить всю остальную информацию о параметрах нетронутой - тогда я могу извлечь интересующую меня информацию, вызвать мои пользовательские функции и затем переадресовать вызов в WebForm_DoPostBackWithOptions.

ПРИМЕЧАНИЕ. Я использую jQuery для создания своей пользовательской функции, поэтому, если есть более простой способ сделать это с помощью jQuery, я рассмотрю этот вариант.

Вот код, который я пытался заменить обработчиком события onclick (не работает):

    $('[onclick*=WebForm_DoPostBackWithOptions]').each(function() {
        var txt = this.onclick;
        txt = txt + '';
        txt = txt.replace('WebForm_DoPostBackWithOptions','ml_DoPostBackWithOptions');
        this.onclick = eval(txt);
    });

Используя alert (), я убедился, что текст корректно изменяется, однако независимо от того, использую ли я функцию eval (), обработчик onclick, похоже, не распознает его как JavaScript.

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

Примечание. Если у моего элемента управления есть способ опрашивать страницу, он может найти все кнопки, которые будет отправлять обратно (независимо от того, какого типа они кнопки), чтобы я мог получить свойство на стороне сервера, это тоже то, что я буду рассматривать.

2
NightOwl888 25 Авг 2010 в 15:17

3 ответа

Лучший ответ

Значение атрибута оборачивается в функцию при разборе HTML, поэтому было бы сложно вернуть исходную строку. Вы можете получить строковое представление функции, но тогда вам придется разобрать код внутри функции.

Почему бы просто не переопределить вызываемую функцию? Поместите это в конце страницы:

<script type="text/javascript">

(function(){

  // keep the original
  var previous = WebForm_DoPostBackWithOptions;

  WebForm_DoPostBackWithOptions = function(options) {
    // do what you want with the options here
    // then call the original
    previous(options);
  }

})();

</script>
3
Guffa 25 Авг 2010 в 19:31

Как правило, в ASP.NET, чтобы отключить это для кнопки, вы делаете:

И это передается клиентскому клиенту onclick, а возвращаемое значение false; предотвращает реализацию по умолчанию. Вот как это сделать с сервера; от клиента, вам нужно полностью стереть клик и переопределить его.

Я не знаю, что я понимаю, что вы пытаетесь сделать ... почему вы делаете это таким образом? Вы делаете это, чтобы передать дополнительные данные? Если это так, есть другие способы реализации ...

0
Brian Mains 25 Авг 2010 в 11:28

Если вы просто пытаетесь вставить функциональность в событие click, то вы можете использовать функцию click () jQuery. Он добавляет вызов функции в начало события click и затем позволяет выполнить поведение по умолчанию, в данном случае отправка формы:

 $(function() {
    $('[onclick*=WebForm_DoPostBackWithOptions]').click(function(event) {  

        //call your custom functions here and then do nothing, the 
        //default click event will still occur. If you don't want it to
        //propagate, call event.preventDefault();

        var txt = this.onclick;
        txt = txt + '';
        txt = txt.replace('WebForm_DoPostBackWithOptions','ml_DoPostBackWithOptions');
        setTimeout(txt,0);

        //event.preventDefault();  
        //or
        //event.stopPropagation();  
    });
 });

Обратите внимание, что в приведенном вами примере showProgress1(); будет вызван дважды.

0
Daniel Dyson 25 Авг 2010 в 12:01