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

インラインのものを再入力する(または知ることさえ)必要なく、自分のものを前に追加できると便利です。

次の関数がこれを行います。

$(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)thisthis
  • prependHandler知る必要がある場合に備えて、成功したかどうかをテストできるように true または false を返します。
  • 複数の要素を選択するセレクターを渡すことはできますが、 を.get(0)内部的に使用するとprependHandler、最初に選択された要素の操作に制限されます。
  • もう少し考えればprependHandler、上記の制限を克服するために jQuery プラグインとして組み立てることができますが、単一の要素であるため問題なく動作します。
于 2012-04-30T23:40:28.720 に答える
1

クリック メソッドのバインドを解除し、代わりにやりたいことを再バインドできるはずです。

$('#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 に答える