Изменить функцию onclick с помощью jQuery

У меня есть кнопка, в которой есть событие onclick, которое было установлено на серверной части из .NET. Рядом с ним флажок

<button class="img_button" onclick="if(buttonLoader(this)){WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions('uxBtnRelease', '', true, '', 'somepage.aspx?oupid=5&fp=true', false, true))} return false;" type="button">Release</button>
<input type="checkbox" checked="checked" id="myCheckbox">

Когда флажок установлен, необходимо изменить значение строки запроса в URL-адресе внутри функции onclick кнопки.

Пока у меня есть это, и идея правильная, но я продолжаю получать ошибки при запуске: «Uncaught SyntaxError: Unexpected token ILLEGAL»

var defaultReleaseOnClick=null;
$("#myCheckbox").click(function(){
    var $releaseBtn = $(".img_button");
    if(defaultReleaseOnClick==null) defaultReleaseOnClick=$releaseBtn.attr("onclick");

    var newOnClickString =  defaultReleaseOnClick.toString().replace(/&fp=[a-z]+'/i,"&fp="+this.checked);
    $releaseBtn.removeAttr("onclick").click(eval(newOnClickString));
});

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

Любые идеи?

Я создал демонстрацию здесь: http://jsbin.com/asiwu4/edit.


person CBarr    schedule 10.02.2011    source источник
comment
Функция, установленная сервером, уже известна? Затем просто предотвратите событие щелчка по умолчанию и выполните известное событие щелчка с отрегулированным значением. Если нет, то ваше решение кажется лучшим (не очень хорошим, но оно работает).   -  person jerone    schedule 11.02.2011


Ответы (3)


Почему бы вам не использовать атрибут data-*? Например:

<button ... onclick="doStuff(this);" data-url="something.aspx"></button>

Теперь в вашей функции doStuff() (или в том, что у вас есть в атрибуте onclick) вы читаете атрибут data-url и в своем событии checkbox.click соответствующим образом меняете его. Таким образом, вам не придется иметь дело с изменением кода JavaScript с помощью регулярных выражений, чего я бы никому не рекомендовал.

Начиная с jQuery 1.4.3 вам даже не придется иметь дело с jQuery.attr для чтения атрибутов data-*, но вы можете использовать jQuery.data, который будет автоматически извлекать данные для вас (вы также можете установить это таким образом).

Простой пример:

<input type="submit" id="button" data-url="google.com">
<input type="checkbox" id="checkbox"> 

$('#button').click(function() {
    alert($(this).data('url')); 
});

$('#checkbox').click(function() {
    $('#button').data('url', 'bing.com');
});

http://jsfiddle.net/dSEpR/

Другое предложение: Почитайте о ненавязчивом JavaScript с помощью jQuery, технике, которая значительно облегчила мне жизнь веб-разработчика :)

person fresskoma    schedule 10.02.2011

Не могли бы вы обновить скрытый элемент формы с новым значением fp?

<input type='hidden' name='fp' value='whatever' />

Таким образом, ваш код для публикации формы может быть немного более общим.

person Community    schedule 10.02.2011

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

person CBarr    schedule 14.02.2011