1

我有以下无法更改的内联代码是由外国人插件输出的。包含onclick触发submit事件的处理程序:

<input type='button' id='gform_next_button_12_188' 
class='button gform_next_button' value='Next' tabindex='3' 
onclick='jQuery("#gform_target_page_number_12").val("2"); jQuery("#gform_12").trigger("submit",[true]); '/> 

我想在提交表单之前运行一些例程,我尝试了这个:

$("#gform_12").submit(function(e){

    // this code is not running ...

});

它失败了,即提交表单时我的代码没有运行。有什么建议吗?

基于给出的答案的最终解决方案

var inline_onclick_code_on_next = $(".gform_next_button").first().attr("onclick");
$(".gform_next_button").removeAttr("onclick");
$(".gform_next_button").bind("click", function() {
    myClass.autosave_on_click(inline_onclick_code_on_next);
});

myClass = {
    errorMessage : "",
    autosave_on_click: function (inline_onclick_code){
        my_gravity_form_saving_running = 1;
        myClass.saveData(); // this code must put my_gravity_form_saving_running = 0 when all data be saved
        countdown_max_loop = 10; // seconds
        var countdown = window.setInterval(function(){
            if (countdown_max_loop-- == 0 || my_gravity_form_saving_running == 0){
                clearInterval(countdown);
                eval (inline_onclick_code);
            }
        }, 1000);
    }
}
4

3 回答 3

1

您应该能够取消绑定 click 方法,然后重新绑定您想要执行的操作:

$('#gform_next_button_12_188')
   .unbind('click')
   .bind('click', function() {
       // your stuff
       // submit stuff that was there
   });

编辑:试试这个来覆盖 onclick 属性:

$('#gform_next_button_12_188')
  .attr('onclick', '')
  .bind('click', function() {
      // your stuff
      // submit stuff that was there
  });
于 2012-04-30T22:27:53.223 回答
1

尝试从元素中取消绑定单击事件,然后指定您自己的。

$('#gform_next_button_12_188').unbind('click').removeAttr('onclick');
$('#gform_next_button_12_188').bind('click', function() {
    // do magic stuff

    // do the rest
    jQuery("#gform_target_page_number_12").val("2");
    jQuery("#gform_12").trigger("submit",[true]); 
});

编辑:

添加了 removeAttr,谢谢@gdoron

于 2012-04-30T22:29:03.193 回答
1

无需重新输入(甚至不知道)内联内容即可预先添加您的内容会很方便。

以下函数将执行此操作:

$(function(){
    function prependHandler(selector, event, fn) {
        try {
            if (event.split(' ').length > 1) {
                event = event.split(' ')[0];
            }
            var $el = $(selector),
                inline_handler = $el.get(0)['on' + event];
            $el.on(event, function() {
                fn.call(this); //invoke your own magic stuff
                inline_handler.call(this); //invoke original inline magic stuff
            }).get(0)['on' + event] = null;
            return true;
        }
        catch (e) {
            return false;
        }
    }

    //call as follows:
    prependHandler("#gform_next_button_12_188", 'click', function() {
        alert('my functionality'); //specify your own magic stuff here
    });
});

小提琴

笔记:

  • prependHandler中,我们用于.call(this)确保this(对目标元素的引用)this在原始处理程序和前置处理程序中可用,以防需要。
  • prependHandler返回 true 或 false 以允许您测试它是否成功,以防您需要知道。
  • 虽然您可以传入一个选择多个元素的选择器,但使用.get(0)内部限制prependHandler只能处理第一个选定元素。
  • 稍微考虑一下,您可以将框架prependHandler作为一个 jQuery 插件来克服上述限制,但它可以正常工作,因为它是在单个元素上。
于 2012-04-30T23:40:28.720 回答