【发布时间】:2015-07-02 20:49:49
【问题描述】:
有一个同事面临的一个非常奇怪的问题,我设法解决了这个问题,但我一生无法理解为什么他的初始代码不起作用! - 我们有一个传统的 asp.net Web 应用程序,它使用 MasterPages/Content 控件,并且在整个 Web 应用程序中混合了 jQuery,提供了一些客户端交互性。
本质上,有一个 Web 表单视图,其中有一个 div,其中包含一个最初隐藏的按钮(显示:无),单击另一个菜单项后,该 div 使用 jQuery BLOCKUI 插件显示,阻止 UI 的其余部分并呈现弹出 div 到位 - 然后用户可以单击按钮,单击按钮应该隐藏包含 div,并显示另一个包含另外两个按钮的 div - 一切都应该很简单....但这就是它变得时髦的地方:
请记住,这些内容都不是动态生成的,所有 HTML 元素都存在于页面加载完成后的 .aspx 视图中。
var blockUiRenderFrame = function (html, width, height) {
window.parent.$.blockUI({
message: html,
css: {
top: ($(window.parent).height() - height) / 2 + 'px',
left: ($(window.parent).width() - width) / 2 + 'px',
width: width
}
});
};
<div id="anotherContentFrame">
<p>some text</p>
</div>
<div id="contentFrame" style="display:none;">
<div id="myButtonContainingDiv">
<button id="aButton" />
</div>
<div id="myOtherButtonsContainingDiv"></div>
</div>
$(document).ready(function() {
$("#myButton").click(function() {
$("#myButtonContainingDiv").hide();
$("#myOtherButtonsContainingDiv").show();
});
});
<!-- A Button on the page calls this code -->
blockUiRenderFrame($("#contentFrame"), 200, 200);
我观察到的情况似乎是完全失去了上下文,或者在不同的上下文中一起执行事件......在处理点击事件、div 元素或 HTML div 中的任何内容期间contentFrame 全部返回 undefined。
在任何其他时间,如果我使用控制台/调试器,我可以使用 $("#myButtonContainingDiv") 成功返回一个元素。
点击事件有其正确的事件元素,我可以使用 $(this) 来获取我点击的按钮,但甚至尝试 select $("#myButton") within实际的单击事件处理程序代码本身返回“未定义”。
我可以在任何时候完美地访问 $("anotherContentFrame"),包括在处理 #myButton 的点击事件期间。
为了让这段代码正常工作,我必须使用的解决方法是:
在单击事件处理程序期间,使用以下内容:
$(this).closest('div').hide()
$(this).closest('div').next().show()
因为这是我获得对页面上 DOM 元素的任何引用以成功隐藏/显示它们的唯一方法。
如果有人愿意,我可以尝试提供更多信息,我不确定是否有人见过这样的问题。
提前致谢!
【问题讨论】:
-
你能做个小提琴吗?
-
很奇怪。没有看到它在行动中很难提供帮助。无论如何,您可以像这样组合这些行:
$(this).closest('div').hide().next().show(); -
我试图用类似的代码做一个小提琴 - 但它按我的预期执行,所以没有将它添加到这里。唯一的区别是无法设置 asp 母版页和内容/等。这是我见过的最奇怪的问题之一,但现在假设它是特定于实现的,与 jQuery 无关——因为我尝试了基本的 Javascript 访问器,但它们也不起作用!
标签: javascript jquery html asp.net