Как заменить имя функции с помощью JavaScript и распознать его как функцию? - PullRequest
2 голосов
/ 25 августа 2010

Я пытаюсь заменить обработчик события 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, но похоже, что оно будет гораздо более элегантным и гибким, если я смогу заставить его работать ...

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

Ответы [ 3 ]

3 голосов
/ 25 августа 2010

Значение атрибута оборачивается в функцию при разборе 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>
0 голосов
/ 25 августа 2010

Если вы просто пытаетесь вставить функциональность в событие 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 голосов
/ 25 августа 2010

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

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

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

...