如何在不使用getElementById方法的情况下测试元素的存在性?

我已经设置了一个现场演示供参考。我也将在这里打印代码:

<!DOCTYPE html>
<html>
<head>
    <script>
    var getRandomID = function (size) {
            var str = "",
                i = 0,
                chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
            while (i < size) {
                str += chars.substr(Math.floor(Math.random() * 62), 1);
                i++;
            }
            return str;
        },
        isNull = function (element) {
            var randomID = getRandomID(12),
                savedID = (element.id)? element.id : null;
            element.id = randomID;
            var foundElm = document.getElementById(randomID);
            element.removeAttribute('id');
            if (savedID !== null) {
                element.id = savedID;
            }
            return (foundElm) ? false : true;
        };
    window.onload = function () {
        var image = document.getElementById("demo");
        console.log('undefined', (typeof image === 'undefined') ? true : false); // false
        console.log('null', (image === null) ? true : false); // false
        console.log('find-by-id', isNull(image)); // false
        image.parentNode.removeChild(image);
        console.log('undefined', (typeof image === 'undefined') ? true : false); // false ~ should be true?
        console.log('null', (image === null) ? true : false); // false ~ should be true?
        console.log('find-by-id', isNull(image)); // true ~ correct but there must be a better way than this?
    };
    </script>
</head>
<body>
    <div id="demo"></div>
</body>
</html>

基本上,上面的代码演示了一个元素被存储到一个变量中,然后从DOM中删除。即使元素已经从DOM中删除,变量仍然保留第一次声明时的元素。换句话说,它不是对元素本身的动态引用,而是一个副本。因此,检查变量的值(元素)是否存在将会得到一个意想不到的结果。

isNull函数是我试图从变量中检查元素的存在,它可以工作,但我想知道是否有更简单的方法来实现相同的结果。

PS:如果有人知道一些与这个主题相关的好文章,我还对JavaScript变量为什么会这样表现感兴趣。


当前回答

如果getElementById()可用,请使用它。

另外,这里有一个简单的方法来用jQuery:

if ($('#elementId').length > 0) {
  // Exists.
}

如果你不能使用第三方库,那就坚持使用基本的JavaScript:

var element =  document.getElementById('elementId');
if (typeof(element) != 'undefined' && element != null)
{
  // Exists.
}

其他回答

所有现有的元素都有parentElement集,除了HTML元素!

function elExists (e) { 
    return (e.nodeName === 'HTML' || e.parentElement !== null);
};

节点使用。包含DOM API,你可以检查页面中任何元素的存在(当前在DOM中)非常容易:

document.body.contains(YOUR_ELEMENT_HERE);

跨浏览器注意:Internet Explorer中的文档对象没有contains()方法——为了确保跨浏览器兼容性,请使用document.body.contains()代替。

一个简单的解决方案与jQuery:

$('body').find(yourElement)[0] != null

由于这个问题,我降落在这里。上面提到的解决方案很少不能解决问题。经过几次查找,我在互联网上找到了一个解决方案,如果一个节点存在于当前视口中,我尝试解决的答案是否存在于主体中。

函数isInViewport(element) { const rect = element.getBoundingClientRect(); 回报( 矩形。top >= 0 && left >= 0 && 矩形.bottom <=(窗口。innerHeight || document.documentElement.clientHeight) && right <=(窗口。document.documentElement.clientWidth) ); } console.log ( isInViewport (document.querySelector (.selector-i-am-looking-for)) ); < div class = " selector-i-am-looking-for " > < / div >

此代码片段取自此处,作为备份,因为链接可能在一段时间后不可用。查看链接了解解释。

而且,并没有打算在评论中发帖,因为在大多数情况下,他们被忽略了。

你也可以使用jQuery。包含,它检查一个元素是否是另一个元素的后代。我传入document作为父元素进行搜索,因为页面DOM中存在的任何元素都是document的后代。

jQuery.contains( document, YOUR_ELEMENT)