隐藏选择器始终决定元素可见,即使元素不可见
Hidden selector always deciding that an element is visible, even when its not
我正在为即将到来的项目做的一件事是调用/工具提示系统。理论上,这只是一件简单的小事。你接受一些这样的标记:
<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
。
根据jQuery对:hidden选择器的输入,似乎在任何给定时间都在检查许多属性,这让我想到了问题:在我的设置中,是什么在欺骗jQuery的:hidden
选择器,使其始终相信callout是隐藏的,即使现在已经不是这样了?
编辑:由于我在侧面板中注意到我最近的一个问题,我的团队已经确保我们的应用程序在IE9标准模式下运行,所以环境应该不会成为问题。
编辑2:问题代码的混乱(更新!问题完全再现。)
尝试使用hasClass代替:
function toggleCallout() {
if(pub.$callout.hasClass('hidden')) {
pub.$callout.removeClass('hidden');
} else {
pub.$callout.addClass('hidden');
}
}
或者使用toggleClass:更快
function toggleCallout() {
pub.$callout.toggleClass('hidden');
}
另外,在使用MyCallout
声明之前,一定要先放好它,否则会出现类似的错误
未捕获类型错误:未定义不是函数
调用时
var callout = new MyCallout($link, $callout);
工作Fiddle
这个问题实际上是一个CSS问题——虽然我的代码是正常的(正如我的OP中的jsFiddle所示),但.callout
div使用默认维度width: 0; height: 0
进行渲染,这导致:hidden
选择元素。
我所要做的就是添加以下CSS来解决我的问题:
.callout {
width: 1em;
height: 1em;
/* ...As before... */
}
课程:始终检查元素!看起来像是脚本错误的东西,实际上可能完全是另一回事。
相关文章:
- Webdriver.io pageObject模式-通过传递参数来定义元素选择器
- 使用元素选择器向Object添加函数
- j查询未来元素选择器
- Jquery动态元素选择器
- 如何通过元素选择器获取tinyMCE编辑器实例
- 如何在 Edge Animate 中使用类元素选择器绑定 ElementAction
- jQuery在以下选择器中引用初始元素选择器
- 编写一个类似jQuery的JS元素选择器
- 并行元素选择器
- 带有元素选择器的jQuery get()函数
- Jquery Html元素选择器
- 在IE上组合了活动状态伪类和相邻元素选择器
- 仅为通过元素选择器选择的元素获取指定的属性列表
- 为什么jQuery元素[]选择器在这种情况下不起作用?
- jQuery元素选择器
- Javascript元素选择器
- 用于多个元素/选择器的字符语法
- 如何使用Jquery中的元素选择器和类选择器
- 多元素选择器上的jQuery方法链接
- 如何使用jQuery元素选择器从表单中获取输入字段的ID