0

フォームが送信されたときに情報をキャプチャすることを目的としたJavaScriptのボルトオンビットを書いています。Webページに複数のフォームがあり、そのいずれも/一部/すべてにonsubmitハンドラーがすでに定義されている可能性があるシナリオに対応する必要があります。また、ボルトオンコードを呼び出した後、元のハンドラーを起動する必要があります。

2つのフォームでテストケースを設定しました。1つ目はonsubmitハンドラーがなく、2つ目は単純なアラートボックスです。

以下のコードを試しましたが、既存のハンドラーをform2からform1にコピーしたようです。

window.onload=pageinit;

function pageinit()
{
    for (var x=0; x < document.forms.length; x++) {
            var origSubmit=document.forms[x].onsubmit;
            if (typeof origSubmit != 'function') {
                    document.forms[x].onsubmit=dosubmit;
            } else {
                    document.forms[x].onsubmit = function (event) {
                            dosubmit(event);
                            return origSubmit(event);
                    }
            }
    }
}

function dosubmit(ev)
{
  alert('bolt-on invoked from ' + ev.target.name);  
}

何か案は?

TIA

4

2 に答える 2

1

origSubmit問題はあなたの変数かもしれないと思います。そこで作成した関数では「閉じられ」ますが、forループによって変更されます。

試す:

function pageinit()
{
    for (var x=0; x < document.forms.length; x++) {
            var origSubmit=document.forms[x].onsubmit;
            if (typeof origSubmit != 'function') {
                    document.forms[x].onsubmit=dosubmit;
            } else {
                    document.forms[x].onsubmit = createSubmitHandler(origSubmit);
            }
    }
}

function dosubmit(ev)
{
  alert('bolt-on invoked from ' + ev.target.name);  
}


function createSubmitHandler(origSubmit) 
{
  return function(event) {
    dosubmit(event);
    return origSubmit(event);
  }
}
于 2010-12-13T14:37:59.370 に答える
1

私はあなたがやりたいことを本当に理解していませんが、あなたはループ定義の問題で典型的な機能を持っています:

関数が呼び出されたときdocument.forms[x].onsubmit(明らかにループが終了した後)、origSubmit各ハンドラーで同じ関数()を指しdocument.forms[document.forms.length - 1].onsubmitます。origSubmitJavaScriptにはブロックスコープではなく関数スコープしかないため、の値を「キャプチャ」する必要があります。

 for (var x=0; x < document.forms.length; x++) {
            var origSubmit=document.forms[x].onsubmit;
            if (typeof origSubmit != 'function') {
                    document.forms[x].onsubmit=dosubmit;
            } else {
                    document.forms[x].onsubmit = (function(func) {
                        return function (event) {
                                dosubmit(event);
                                return func(event);
                               }
                    }(origSumbit));
            }
    }

ダミーのクロージャ、例5も参照してください。

于 2010-12-13T14:38:45.620 に答える