2012-02-10 16 views
1

自動フォーム提出コードを設定しました。基本的にフォームが送信されると、javascriptはそれを処理し、すべての入力などを検索し、ajax経由でフォームのアクションattrにデータを送信します。フォームの属性からのJavascriptコールバック

$j('body').delegate('form', 'submit', function(e) { 
    e.preventDefault(); 
    if($j(this).prop('data-callback', true)) 
     asf.forms.processForm($j(this).attr('name'), $j(this).attr('data-callback')); 
    else 
     asf.forms.processForm($j(this).attr('name')); 
}); 

ただし、コールバックを含める必要があります。コードをグローバルにする必要があるので、各フォームの仕様をコード化することはできません。だから私はそうのようなコールバック関数名を指定して属性を追加することを考えた:

<form action="" method="" data-callback="posts.addPost()"> 

問題は、私はjavascriptの内部にその機能を起動する方法を知らないです。何か案は? 私はajaxレスポンス内でこのコールバックを行うことを意味するすべてのフォーム情報にアクセスする必要があるため、onsubmitを使用できません。

おかげ

+0

私が正しくあなたを理解していれば、あなたが(これをevalの($ jを使用することができます).attr( "data-callback"))それはあなたが必要としていたものですか? –

+0

http://stackoverflow.com/questions/11165707/passing-a-javascript-function-through-inline-data-attributes – braks

答えて

2

evalに頼ることなく、これを達成するために、私はあなたがすべてのあなたの「フォームのコールバック」を記憶示唆しますオブジェクトで、そのよう:

var formCallbacks = { 
    'posts.addPost': function() { 
    // ... 
    }, 
    // ... 
}; 

があなたのdata-callbackメカニズムを使用して、応答ハンドラにコールバックをアップになります。

function(args, callbackName) { 
    formCallbacks[callbackName](); 
    // ... 
} 
10

私はevalは悪であることを知っているが、それは唯一の合理的な解決策と思われる:あなたはdata-callback属性(例えばdata-callback="posts.addPost")にのみメソッド名を入れる場合

eval($(form).attr('data-callback')); 

それはせずに、それを呼び出すことが可能ですevalの:

var methodName = $(form).attr('data-callback'); 
var parts = methodName.split('.'); 
var method = window; 

$(parts).each(function(){ 
    method = method[this]; 
}); 

method(); 
+0

は夢のように動作します、ありがとう。私は非評価方法のために行った –

+0

解決策だけでなく、私はそれをそのようにしました: 関数実行(コード){ \t var res = new Function( 'return' + code + '|| false'); \t return res(); \t } run($(form).attr( 'data-callback')); –

+0

これはほぼ同じです。 [this](http://stackoverflow.com/questions/4183591/new-function-with-variable-parameters)を参照してください – Krzysztof

関連する問題