我正在为即将到来的项目做的事情之一是标注/工具提示系统。理论上,这是一件简单的小事。你采取一些这样的标记:
<script src='jQuery 1.10.1'></script>
<a href='#' id='callout-link'>Click Me</a>
<div id='callout-id' class='callout hidden'>
This is my tooltip text.
</div>
/* CSS Styling... */
.callout {
position: absolute;
z-index: 2;
}
.hidden {
display: none;
}
...并将其绑定在 JavaScript 中,以便每当您单击某个链接时,它都会切换可见性。
// ...Page Script...
var $link = $('#callout-link'),
$callout = $('#callout-id');
$(document).ready(function () {
var callout = new MyCallout($link, $callout);
callout.bindToControlClick();
});
// ...Object Definition...
var MyCallout = function ($control, $callout) {
init();
// Public Scope...
var pub = {};
pub.$actionControl = $control;
pub.$callout = $callout;
pub.bindToControlClick = function () {
pub.$actionControl.click(function (e) {
e.preventDefault();
e.stopPropagation();
toggleCallout();
});
}
// Private Scope...
function init() {
// The callout-content subdiv is necessary for other operations that are
// likely not relevant to the problem I am encountering.
if($callout.children('.callout-content').length == 0)
$callout.wrapInner('<div class="callout-content" />');
}
function toggleCallout() {
if(pub.$callout.is(':hidden')) {
// Show is actually more complicated than this, but that's not the problem.
pub.$callout.show();
} else {
pub.$callout.hide();
}
}
return pub;
};
问题是,虽然标注最初是从视图中隐藏的,并且在单击时出现,但尝试关闭标注会失败。当我在 Chrome 调试器中添加断点和监视值时$callout.is(':hidden')
,即使元素可见,监视值也会计算为true
。
根据:hidden 选择器的 jQuery 条目,似乎在任何给定时间都在检查许多属性,这让我想到了一个问题:在我的设置中是什么在设法欺骗 jQuery 的:hidden
选择器使其始终相信标注被隐藏,即使不再如此?
编辑:由于我在侧面板中注意到我最近的一个问题,因此我的团队已确保我们的应用程序在 IE9 标准模式下运行,因此环境不应该成为问题。
编辑2:有问题的代码的小提琴(更新!问题完全再现。)