在PostBack之后保持jQuery对象中原始值的元素

| 我将ASP.NET 3.5与残酷的UpdatePanel,“ 0”和JavaScript对象文字结合使用。 我使用ѭ0来保留事件处理程序,该事件处理程序确实在PostBack之后被触发,符合预期。 问题出在
init()
上存储在对象文字属性中的jQuery对象中,它们保留了ASP.NET PostBack之前的值。 这是我的JavaScript: 外国足协
SFAIC = 
{
    masterPages: { cs: \"CS_\", cp: \"CP_\" },
    contentPages: { cs: \"CSContent_\", cp: \"CPContent_\" },

    isSecurePage  : false,

    $body         : undefined,
    $container    : undefined,
    $updatePanel  : undefined,

    $textBox      : undefined,
    $errorLabel   : undefined
};
SFAIC.init()
SFAIC.init = function () 
{ 
    log( \"--> SFAIC.init() fired\" );

    var self = this; 

    self.$body        = $( \"body\" );
    self.$container   = self.$body.find( \"#container\" );
    self.$updatePanel = self.getCSMasterElement( \"UpdatePanel1\", self.$container );
    self.$textBox     = self.getContentElement( \"TextBox1\" );
    self.$errorLabel  = self.getContentElement( \"ErrorLabel1\" );

    self.$updatePanel.delegate( self.$textBox.selector, \"blur\", function () 
    { 
       self.validateRequired( self.$textBox, self.$errorLabel ); 
    });

    self.$textBox.focus();
};
SFAIC.validateRequired()
SFAIC.validateRequired = function ( $element, $errorLabel ) 
{
    if ( $element.val().length === 0 ) { $errorLabel.text( \"Required\" ); }
    else { $errorLabel.text( \"\" ); }
};
鉴于以上所述,当触发“ 6”时,会将“ 7”分配给其jQuery对象。我想这就是我的困惑。我以为,当您调用
.val()
时,它将立即返回该元素中的值。如果您调用服务器并更改控件的值,然后又返回呈现元素的更改值,则jQuery对象似乎不知道该更改? 我在这里错了吗? 我需要做些什么来保持对元素的实时引用,以便在页面回发后可以获取当前值? 根据@DaveLong编辑请求: SFAIC.getCSMasterElement()
SFAIC.getCSMasterElement = function ( id, $context ) 
{ 
    return SFAIC.getElement( SFAIC.masterPages.cs, id, $context ); 
};
SFAIC.getCPMasterElement()
SFAIC.getCPMasterElement = function ( id, $context ) 
{ 
    return SFAIC.getElement( SFAIC.masterPages.cp, id, $context ); 
};
SFAIC.getContentElement()
SFAIC.getContentElement = function ( id, $context ) 
{ 
    return SFAIC.getElement
    ( 
        ( SFAIC.isSecurePage ) ? SFAIC.contentPages.cp : SFAIC.contentPages.cs, 
        id, 
        $context 
    ); 
};
SFAIC.getElement()
SFAIC.getElement = function ( page, id, $context ) 
{
    selector = SFAIC.getElementIdSelector( page, id );

    return ( selector ) 
        ? ( $context && $context.length ) 
            ? $context.find( selector ) 
            : SFAIC.$body.find( selector )
        : undefined;
};
SFAIC.getElementIdSelector()
SFAIC.getElementIdSelector = function ( page, id ) 
{ 
    var prefix = SFAIC.getElementPrefix( page );
    return ( prefix && id ) ? \"#\" + prefix + id : undefined;
};
SFAIC.getElementPrefix()
SFAIC.getElementPrefix = function ( page ) 
{   
    switch ( page ) 
    {
        case SFAIC.masterPages.cs : return SFAIC.masterPages.cs;
        case SFAIC.masterPages.cp : return SFAIC.masterPages.cp + SFAIC.masterPages.cs;
        case SFAIC.contentPages.cs : return SFAIC.masterPages.cs + SFAIC.contentPages.cs;
        case SFAIC.contentPages.cp : return SFAIC.masterPages.cp + SFAIC.masterPages.cs + SFAIC.contentPages.cs + SFAIC.contentPages.cp;                
    }
};
    
已邀请:
UpdatePanel从DOM中删除整个目标,并将其替换为响应中的新标记。不是您的var持有旧值,而是他们持有对原始标记的引用。您需要\“重新初始化\”才能获得对DOM中新节点的引用。     
也许您应该在ajax updatepanel请求完成时重新初始化对象
<script type=\"text/javascript\" language=\"javascript\">
     Sys.WebForms.PageRequestManager.getInstance().add_endRequest(ReInitiate); 
     function ReInitiate(sender, args)
     {
        //re-initialize the objects 
        //add code here 
     } 
</script>
干杯, 尼丁     
对于它的价值,我想出的解决方案是Paul Irish基于Markup的,不引人注目的全面DOM就绪执行的定制版本以及@NitinJS \ / @ Ethan \的答案。 在我的JavaScript的底部,我添加了:
UTIL = {

    fire : function(func, funcname) {

        var namespace = SFAIC;
        funcname = (funcname === undefined) ? \"init\" : funcname;

        if (func !== \"\" && 
            namespace[func] && 
            typeof namespace[func][funcname] == \"function\") { 

            namespace[func][funcname](); 

        }

    },

    loadEvents : function() {

        var bodyId = document.body.id;

        UTIL.fire(\"common\");
        UTIL.fire(bodyId);

    }

};

// Fire events on initial page load.
UTIL.loadEvents();

// Fire events for partial postbacks.
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(UTIL.loadEvents);
在MasterPage的aspx中,我将body标记修改为:
<body id=\"<%=bodyId%>\">
在我的MasterPage的代码隐藏声明中,我添加了:
Public bodyId As String = String.Empty
在我的MasterPage代码的Page.PreRender处理程序背后,我添加了:
bodyId = MyBase.GetType.BaseType.Name
    

要回复问题请先登录注册