0

このような既存のWebページを変更しようとしています

<script type="text/javascript" src="s1.js"></script>

s1.jsには次のようなものがあります

window.onDomReady = DomReady;

function DomReady(fn)
{
    if(document.addEventListener)
    {
        document.addEventListener("DOMContentLoaded", fn, false);
    }
    else
    {
        document.onreadystatechange = function(){chState(fn);};
    }
}

function chState(fn)
{
    if(document.readyState == "interactive" || document.readyState == "complete")
        fn();
}


window.onDomReady(addHndlrs);

function addHndlrs()
{
    var forms = document.getElementsByTagName("form");
    for(var i = 0; i < forms.length; i++) 
    {
        var form = forms[i];
        if(form.addEventListener)
        {
            form.addEventListener("submit", DoValidate, false);
        }
        else if (form.attachEvent)
        {
            form.attachEvent("onsubmit", DoValidate);
        } 

        Other stuff.

    }

フォームで [送信] をクリックすると、DoValidate が呼び出されます。

このページを変更して、最初の送信ハンドラーの後に呼び出される別の送信ハンドラーを追加しようとしています。

上記のコードをコピーし、関数名を変更してs2.jsに入れました。

window.onDomReady = DReady;

function DReady(fn)
{
    if(document.addEventListener)
    {
        document.addEventListener("DOMContentLoaded", fn, false);
    }
    else
    {
        document.onreadystatechange = function(){Chk1State(fn);};
    }
}

function Chk1State(fn)
{
    if(document.readyState == "interactive" || document.readyState == "complete")
        fn();
}

window.onDomReady(myready);

function myready()
{
    var forms = document.getElementsByTagName("form");
    for(var i = 0; i < forms.length; i++) 
    {
        var form = forms[i];
        if(form.addEventListener) 
        {
            form.addEventListener("submit", mynewhandler, false);
        }
        else if (form.attachEvent) 
        {
            form.attachEvent("onsubmit", mynewhandler);
        }
    }

}

フォームhtmlに、それへの参照を追加しました

<script type="text/javascript" src="s1.js"></script>
<script type="text/javascript" src="s2.js"></script>

私の新しい送信ハンドラーは呼び出されません。firebug でデバッグしました。DReady が呼び出され、DOM Ready ハンドラが登録されていることがわかります。ただし、myready が呼び出されることはないため、送信ハンドラーが登録されることはありません。

ここで何が欠けていますか?s1.js と s2.js のインクルードの順序を変更しようとしましたが、それは役に立たないようです。s1.jsを変更せずにこれを行いたい

4

1 に答える 1

4

あなたが提供したコードは問題ないようです!Chrome 25、FireFox 19、IE 10 をチェックインしました。

通常、実行時にコードを (ソース ファイルではなく) 変更する方が簡単だと思います。JavaScript が動的に型付けされているおかげで、関数を独自の関数で上書きし、次のクロージャーを介しDoValidateて元の関数を渡すことができます。DoValidates2.js

var originalValidate = DoValidate;
DoValidate = function () {
    originalValidate();
    alert("my handler");
};
于 2013-03-07T10:34:45.690 に答える