2

サーバー側の言語としてVB.NETを使用してASP.NET3.5で作業しています。クライアント側の言語としてjQuery1.5.2を介してJavaScriptを使用しています。このページでプロトタイプ/名前空間のセットアップを行おうとしています。このページは、MultiViewを使用したカスタムログオンページです。ポリシーログオンビューとパスワードを忘れたビューがあります。ActiveViewIndexをと呼ばれる非表示フィールドに保存していますcurrentView

このプロジェクトでは、UpdatePanelで部分的なポストバックを使用していますが、JSは部分的なポストバックで更新されません。

そうは言っても、ActiveViewIndexがサーバー側で変更されるのを待つ方法が必要です。そうすればinit()、それぞれのビューに対して関数を呼び出すことができます。これは可能ですか?

私のクライアントサイドコード:

グローバルJS


var page = 
{                   
    currentView : getContentElement( "currentView" ),
    
    init : function () 
    { 
        log( "initializing page" );
                            
        if ( this.currentView === "forgotpassword" ) { forgotPassword.init(); }
        else { policyLogon.init(); }    
    }
}; 

page.init();

ポリシーログオンビューJS


var policyLogon = 
{                       
    panel              : getContentElement( "pnlLogonInfo", "div" ),
    submitButton       : getContentElement( "btnLogon", this.panel ),
    textInputs         : $( "input[ type=text ]", this.panel ),
    policyNumber       : getContentElement( "txtPolicyNumber", this.textInputs ),
    policyNumberError  : getContentElement( "lblPolicyNumberError", this.panel ),
    password           : getContentElement( "txtPassword", this.textInputs ),
    passwordError      : getContentElement( "lblPasswordError", this.panel ),
    forgotPasswordLink : getContentElement( "lbtnForgotPassword", this.panel ),
                    
    init : function () 
    { 
        log( "initializing policy logon" );
                        
        var that = this;

        // Other event handlers created here [redacted to keep example code short].

        that.forgotPasswordLink.on("click", function () 
        {
            // Code to wait for PostBack should go here.

            page.init();
        });

        that.policyNumber.focus();              
    }
};

パスワードを忘れたビューJS


var forgotPassword = 
{
                            
    // Local vars, set up the same way as Policy Logon, just different elements.
    // [redacted to keep example code short]
                        
    init : function () 
    { 
        log( "initializing forgot password" );
                            
        var that = this;
    
        // Other event handlers created here [redacted to keep example code short].
    
        that.policyNumber.focus();                      
    }    
};


getContentElement()質問とは何かに対する先制攻撃として、getContentElement()ネストされたマスターページのために作成しなければならなかった関数であり、使用しているマスターページに基づいて要素を異なる方法で呼び出す必要があります。次のようになります。

function getContentElement ( id, context ) 
{ 
    var publicPrefix = csMasterPrefix + csContentPrefix,
        securePrefix = cpMasterPrefix + publicPrefix + cpContentPrefix,
        publicId = "#" + publicPrefix + id,
        secureId = "#" + securePrefix + id;
    
    return ( context )
        ? ( isSecurePage ) ? $( secureId, context ) : $( publicId, context )
        : ( isSecurePage ) ? $( secureId ) : $( publicId );
}
4

2 に答える 2

0

page.init()をすぐに呼び出すのではなく、本体のonLoadにバインドする必要があります。

$(document).ready() { page.init() }

このとき、サーバーからDOMが返され、ActiveIndexItemも設定されています。

于 2011-04-25T21:28:41.050 に答える
0

わかりました...それで私は私の質問に答えましたが、特別なことは何もしませんでした。setIntervalを使用して、page.currentViewプロパティを継続的にチェックできると思いました。page.waitForViewChangeまた、継続的に保存するのではなく、最初に設定する場合を除いて、常に未定義になります。

グローバルJSを次のように変更しました:

var page = 
{                               
    currentView : undefined,
    intervalId  : undefined,

    init : function () 
    { 
        log( "init() fired" );

        this.currentView = getContentElement( "currentView" ).val();
        log( "current view is [" + this.currentView + "]" );

        if ( this.currentView === "forgotpassword" ) { forgotPassword.init(); }
        else { policyLogon.init(); }

        clearInterval( this.intervalId );
        this.intervalId = undefined;
        this.currentView = undefined;
    },

    waitForViewChange : function ( viewToWaitFor ) 
    { 
        log ( "waitForViewChange() fired" );

        this.currentView = getContentElement( "currentView" ).val();
        if ( this.currentView === viewToWaitFor ) { this.init(); }          
    }
};

次に、ポリシーログオンビューJSforgotPasswordLink.clickで、イベントを次のように変更しました。

this.forgotPasswordLink.on
(
    "click", 

    function () 
    {     
        page.intervalId = setInterval
        ( 
            'page.waitForViewChange( "forgotpassword" )',
            300 
        ); 
    }
);
于 2011-04-26T00:12:30.847 に答える