我正在使用 ASP.NET 3.5 与糟糕的 UpdatePanel ,jQuery.delegate()
和 JavaScript 对象文字相结合。
我使用jQuery.delegate()
来保留事件处理程序,它会在 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 = 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 = function ( $element, $errorLabel )
{
if ( $element.val().length === 0 ) { $errorLabel.text( "Required" ); }
else { $errorLabel.text( "" ); }
};
鉴于上述情况,当SFAIC.init()
被触发时,self.textBox
被分配给其jQuery对象。我猜在这里是我的困惑。我认为当你调用.val()
时,它会返回当前元素中的值。如果您调用服务器并更改控件的值然后返回呈现元素的更改值,则jQuery对象似乎不知道该更改?
我错了吗?
我需要做些什么来保持对元素的实时引用,以便在页面回发后我可以获取当前值?
按 @DaveLong 编辑请求:
SFAIC.getCSMasterElement = function ( id, $context )
{
return SFAIC.getElement( SFAIC.masterPages.cs, id, $context );
};
SFAIC.getCPMasterElement = function ( id, $context )
{
return SFAIC.getElement( SFAIC.masterPages.cp, id, $context );
};
SFAIC.getContentElement = function ( id, $context )
{
return SFAIC.getElement
(
( SFAIC.isSecurePage ) ? SFAIC.contentPages.cp : SFAIC.contentPages.cs,
id,
$context
);
};
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 = function ( page, id )
{
var prefix = SFAIC.getElementPrefix( page );
return ( prefix && id ) ? "#" + prefix + id : undefined;
};
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;
}
};
答案 0 :(得分:4)
UpdatePanel从DOM中删除整个目标,并将其替换为响应中的新标记。并不是说你的变量持有旧值,而是它们持有对原始标记的引用。您需要“重新初始化”才能获得对DOM中新节点的引用。
答案 1 :(得分:1)
也许你应该在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>
干杯, 尼丁
答案 2 :(得分:0)
对于它的价值,我提出的解决方案是Paul Irish的Markup-based unobtrusive comprehensive DOM-ready execution和@NitinJS / @ Ethan的答案的定制版本。
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