Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
回发后保留jQuery对象中原始值的元素_Jquery_Asp.net_Updatepanel_Init_Object Literal - Fatal编程技术网

回发后保留jQuery对象中原始值的元素

回发后保留jQuery对象中原始值的元素,jquery,asp.net,updatepanel,init,object-literal,Jquery,Asp.net,Updatepanel,Init,Object Literal,我使用的是ASP.NET 3.5与异常的UpdatePanel、jQuery.delegate()、以及JavaScript对象文本相结合 我使用jQuery.delegate()来持久化事件处理程序,正如预期的那样,事件处理程序在回发后会触发 问题在于jQuery对象存储在init()上的object literal属性中,它们保留在ASP.NET回发之前的值 这是我的JavaScript: SFAIC SFAIC= { 母版页:{cs:“cs”,cp:“cp”}, contentPage

我使用的是ASP.NET 3.5与异常的UpdatePanel
jQuery.delegate()
、以及JavaScript对象文本相结合

我使用
jQuery.delegate()
来持久化事件处理程序,正如预期的那样,事件处理程序在回发后会触发

问题在于jQuery对象存储在
init()
上的object literal属性中,它们保留在ASP.NET回发之前的值

这是我的JavaScript


SFAIC
SFAIC=
{
母版页:{cs:“cs”,cp:“cp”},
contentPages:{cs:“CSContent”,cp:“CPContent”},
isSecurePage:错误,
$body:未定义,
$container:未定义,
$updatePanel:未定义,
$textBox:未定义,
$errorLabel:未定义
};

SFAIC.init()
SFAIC.init=函数()
{ 
日志(“-->SFAIC.init()已激发”);
var self=这个;
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,“模糊”,函数()
{ 
self.validateRequired(self.$textBox,self.$errorLabel);
});
self.$textBox.focus();
};

SFAIC.validateRequired()
SFAIC.validateRequired=函数($element,$errorLabel)
{
如果($element.val().length==0){$errorLabel.text(“必需”);}
else{$errorLabel.text(“”;}
};


如上所述,当激发
SFAIC.init()
时,
self.textBox
被分配给它的jQuery对象。我想这就是我的困惑所在。我认为当您调用
.val()
时,它将立即返回该元素中的值。如果调用服务器并更改控件的值,然后返回呈现元素更改后的值,那么jQuery对象似乎不知道该更改

我错了吗

我需要做什么来保持对元素的实时引用,以便在页面发回后获得当前值


根据@DaveLong编辑请求:


SFAIC.getCSMasterElement()
SFAIC.getCSMasterElement=函数(id$context)
{ 
返回SFAIC.getElement(SFAIC.masterPages.cs,id$context);
};

SFAIC.getCPMasterElement()
SFAIC.getCPMasterElement=函数(id$context)
{ 
返回SFAIC.getElement(SFAIC.masterPages.cp,id$context);
};

SFAIC.getContentElement()
SFAIC.getContentElement=函数(id$context)
{ 
返回SFAIC.getElement
( 
(SFAIC.isSecurePage)?SFAIC.contentPages.cp:SFAIC.contentPages.cs,
身份证件
$context
); 
};

SFAIC.getElement()
SFAIC.getElement=函数(页面,id,$context)
{
选择器=SFAIC.getElementIdSelector(第页,id);
返回(选择器)
?($context&&$context.length)
?$context.find(选择器)
:SFAIC.$body.find(选择器)
:未定义;
};

SFAIC.getElementIdSelector()
SFAIC.getElementIdSelector=函数(第页,id)
{ 
var prefix=SFAIC.getElementPrefix(第页);
返回(前缀和id)“#”+前缀+id:未定义;
};

SFAIC.getElementPrefix()
SFAIC.getElementPrefix=函数(第页)
{   
交换机(第页)
{
案例SFAIC.masterPages.cs:返回SFAIC.masterPages.cs;
案例SFAIC.masterPages.cp:返回SFAIC.masterPages.cp+SFAIC.masterPages.cs;
案例SFAIC.contentPages.cs:返回SFAIC.masterPages.cs+SFAIC.contentPages.cs;
案例SFAIC.contentPages.cp:返回SFAIC.masterPages.cp+SFAIC.masterPages.cs+SFAIC.contentPages.cs+SFAIC.contentPages.cp;
}
};

也许您应该在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>

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(重新初始化);
函数重新初始化(发送方,参数)
{
//重新初始化对象
//在这里添加代码
} 
干杯,
Nitin

UpdatePanel从DOM中删除整个目标,并用响应中的新标记替换它。并不是您的变量保存旧值,而是它们保存了对原始标记的引用。您需要“重新初始化”以获得对DOM中新节点的引用。

值得一提的是,我提出的解决方案是Paul Irish和@NitinJS/@Ethan答案的定制版本


在JavaScript的底部,我添加了:

在我的主页的aspx中,我将body标签修改为:

在母版页的code behind Page.PreRender处理程序中,我添加了:
你有没有可能有一个我们可以看到的有效例子?没有,一点也没有。目前这是在dev中,因为它是ASP.NET,所以我不能用jsFiddle完全复制它。不过,我可以告诉您,通过输出到
控制台.log
,我确信它不仅在回发之前保留了
self.textBox
的值,而且在
SFAIC.validateRequired()
中设置
$errorLabel
时,它不会更改屏幕上的值。非常奇怪的行为。嗨,斯科特-你能发布“getContentElement()”函数吗?我怀疑这可能(至少部分)是你的问题所在。@Dave-我不得不更新我的原始代码,以便重新输入,并根据你的请求更改一些内容。
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);
<body id="<%=bodyId%>">
Public bodyId As String = String.Empty
bodyId = MyBase.GetType.BaseType.Name