【问题标题】:What's the best way to test an element in the DOM在 DOM 中测试元素的最佳方法是什么
【发布时间】:2012-05-22 07:40:39
【问题描述】:

有几种方法可以做到这一点(据我所知)。

测试css显示

if ($('#foo').css('display') == 'none')

测试可见性

if ($('#foo').is(':visible'))

在可见性中我可以检查元素是否存在。

如果元素占用了文档中的空间,则认为它们是可见的。 可见元素的宽度或高度大于零。

具有可见性的元素:隐藏或不透明度:0 被认为是可见的, 因为它们仍然会占用布局中的空间。

Source

但是,请注意,在这两种情况下,我都无法(由用户)测试可见性,因为:

隐藏元素可以通过将 display 属性设置为 “无”或“隐藏”的可见性属性。但是,请注意 这两种方法产生不同的结果:

可见性: hidden 隐藏一个元素,但它仍然会占用相同的 空间和以前一样。该元素将被隐藏,但仍会影响 布局。

display: none 隐藏元素,不会占用任何空间。这 元素将被隐藏,页面将显示为 元素不存在:

Source

因此,在这两个示例中,我都没有测试该元素是否对用户在所有意义上都是可见的。

所以我的问题是:

  • 上面的两个 if 代码有什么区别?
  • 测试元素是否对用户可见的最佳方法是:

我应该使用类似的东西吗:

if ($('#foo').is(':visible') && 
    $('#foo').css('opacity') > 0 && 
    $('#foo').css('visibility') != 'hidden')

【问题讨论】:

  • 你试过最后一段代码是否有效吗?
  • 1. 测试元素是否对用户可见的最佳方法是什么? >> $('#foo').is(':visible') 是检查元素是否对用户可见(意思是显示)的最佳方法 2. 上面的两个 if 代码有什么区别? >> 您引用了visibledisplay 之间的区别。那么现在,您的问题是什么?
  • 如果一个元素完全可见,但通过z-index 将另一个元素定位在它上面呢?如果这个最上面的 div 有一个不透明的背景怎么办?还是透明的?还是部分透明的?元素“下方”是否可见?
  • 看看你的屏幕,看看你是否能自己发现元素。永远不要相信用户,他们什么都不知道?
  • @Vega 和其他人我也在 +Caleb 回答中发表了评论,解释了我的问题中的大部分这些 cmets,take a look at my comment 我希望这会让事情变得清晰,我们都能得到最好的结果这个的。提前感谢您的关注。

标签: javascript jquery css performance dom


【解决方案1】:

两者之间的区别在于,使用“可见”属性隐藏元素会在页面上留下元素,而不是实际显示。因此,当页面呈现显示的其余部分时,将考虑它的间距。

似乎以其他方式执行实际上会阻止将元素放置到页面上,这可能会改变页面上其他元素的布局方式。

根据我的经验,通常测试可见部分就足够了,但是如果您想要更完整,那么是的,您必须在多个属性上使用“&&”条件进行检查。 这实际上完全取决于您使用的代码有多干净,以及系统的其余 UI 方面的测试有多好。

要考虑的另一件事是测试的目的是什么。您是否正在测试您编写的代码,或者浏览器如何使用 Javascript 来呈现页面?您想要测试您正在创建的代码,并依赖于浏览器工作的事实(因为如果浏览器停止工作,那么整个事情无论如何都是不可靠的)。因此,如果您的代码告诉元素设置某个属性,那么检查该属性就是您需要做的所有测试。除此之外的任何事情都只能通过在代码本身之外进行测试来真正得到证明(例如手动查看页面和其他类似的东西)。

【讨论】:

  • 我更关心的是跨浏览器和性能。另外,如果我的逻辑中缺少某些东西。这就是为什么我希望有人向我解释这样做的区别和最佳方式。如果您查看 SO,您会看到很多关于“在我的 dom 中查找 waldo”类型的不同答案。
【解决方案2】:

如果你想查看一个元素是否存在于 DOM 中,你可以这样做:

$.fn.exists = function () {
    return this.length > 0;
}

用法:

$('#myid').exists();

【讨论】:

  • 这是一个很好的答案,但这不会比上面两个(在问题中)花费更多的时间吗?或者它们是另一个的别名?
  • @FelixKling 他在使用this.length > 0 我没看懂你的评论(他只在编辑中添加了对js函数的调用)
  • @Michel:当我评论它是$(this).length > 1。 Gabe 可能在 5 分钟的宽限期内进行了编辑。否则,我为什么要评论?
  • @FelixKling 我不知道这个 5 分钟的垃圾邮件。刚查了一下编辑,没看到有什么主题,所以问为什么要理解它背后的意思。感谢您对没有显示的编辑的解释。通常,当我在短时间内编辑我的问题/答案时,它会记录在日志中。从来没有注意到这一点。
  • @Michel:不用担心 :) 是的,前 5 分钟没有记录更改...
【解决方案3】:

我认为您最好的选择是实现如下所示的自定义功能,并在出现新事物时进行测试/改进,

$.fn.isReallyVisible = function () { //rename function name as you like..
    return (this.css('display') != 'none' &&
            this.css('visibility') != 'hidden' &&
            this.css('opacity') > 0);
}

上面应该是跨浏览器证明,因为我们使用的是 jQuery .css 函数(专门用于不透明度)。

DEMO

【讨论】:

  • 真的很好。只是想知道,您使用的是this.css('display') != 'none' 而不是$('#foo').is(':visible')。你能告诉我为什么选择这个吗?
  • @MichelAyres 只是一个小小的改进。 is 是 jQuery 函数,它可以使用不同类型的参数,:visible 就是其中之一。在内部它将首先过滤它是 :visible 并执行其相应的流程,最后它会做同样的事情。
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2021-11-26
  • 1970-01-01
相关资源
最近更新 更多