你可能从未听过这15个HTML元素方法

原文链接:https://mp.weixin.qq.com/s/QLoTIpVgq5IqqYDW4ZQMKg

1、table的方法

const tableE1=document.querySelector('table');

const headRow=tableE1.createHead().insertRow();
headerRow.insertCell().textContent='Make';
headerRow.insertCell().textContent='Model';
headerRow.insertCell().textContent='Color';

const newRow=tableE1.insertRow();
newRow.insertCell().textContent='Yes';
newRow.insertCell().textContent='No';
newRow.insertCell().textContent='Thank you';

这段代码里完全用不着使用document.createElement()方法

如果你再一个table元素上直接调用.insertRow()方法,它甚至会自动为你插入一个<tbody>元素

2.scrollIntoView()

当页面的URL中包含#something元素时,一旦页面加载,浏览器就会自动滚动至具有这个ID的元素之处。

但如果你在页面加载之后再渲染元素,这项功能就不起作用了

不过可以通过以下方式重新生效

document.querySelector(document.location.hash).scrollIntoView();

3.hidden

你是否曾为了隐藏某个元素而使用过myElement.style.display='none';这种方法呢?(我用过)如果是,以后就不要这么做喽

只需调用myElement.hidden=true,即可实现

4.toggle()

toggle实际上是元素属性上的一个方法。严格来说,这是一种为元素添加或删除某个class的方法,具体做法是myElement.classList.toggle('some-class')

曾经通过if 条件语句为元素添加class,现在要改喽

正确方式是为toggle方法传入第二个参数,如果该参数返回true,则指定的class就会添加至元素上

el.classList.toggle('some-orange-class',theme==='orange')

5.querySelector()

该方法可以使用在任意元素上

6.closest

该方法可在任意元素上使用,它能够向上查找元素的树型结构,可以理解为 与 querySelector() 相反的方法。因此,我可以通过以下方法获取当前内容的对应标头:

myElement.closest('article').querySelector('h1');

这段方法首先向上找到最近的 <article>元素,然后再向下找到最近的<h1>元素。

7.getBoundingClientRect()

在对 DOM 元素调用该方法时,将返回一个包含其空间结构详细信息的简单对象。

{
  x: 604.875,
  y: 1312,
  width: 701.625,
  height: 31,
  top: 1312,
  right: 1306.5,
  bottom: 1343,
  left: 604.875
}

不过,在调用该方法时需要注意两点:

  • 调用该方法会导致元素的重绘,根据设备与页面复杂程度的不同,重绘的时间可能会占用几毫秒。因此,如果你需要重复地调用该方法,例如在使用动画的场景下,需要特别注意这一点。

  • 并非所有的浏览器都会返回这些值。

8.matches()

假设我需要检查某个元素是否包括一个特定的 class。

这是最复杂的方式:

if (myElement.className.indexOf('some-class') > -1) {
  // do something
}

最佳方式:

if(myElement.matches('.some-class')){
    //do something
}

9.insertAdjacentElement()

它的作用类似于 appendChild() ,但能够更好地控制插入子元素的具体位置。

parentEl.insertAdjacentElement('beforeend', newEl) 与 parentEl.appendChild(newEl) 的作用是一样的,但除此之外,你还可以指定 beforebegin、afterbegin 或 afterend 这几个参数值,元素将按这些值的名称所示插入相应的位置。

10.contains()

你有没有遇到过这样的情形,需要知道某个元素是否被包含在另一个元素中?

打个比方,假设我在处理一个鼠标点击事件时,需要知道它是发生在一个模态窗口中还是发生在外面(这样我才能够关闭这个窗口),我大概会这么做:

const handleClick = e =>{
    if(!modalEl.contains(e.target)) modalEl.hidden=true;
}

代码中的modalEl是模态窗口的引用,而e.target则代表各种发生点击事件的元素。

11.getAttribute()

这个是所有元素方法中最没用的一个,但有一个场景除外

对象的属性property通常也会映射到它的特性attribute中,但在某一个场景中,这种假设并不成立,这就是某个元素的href特性,例如<a href="/animals/cat">Cat</a>。

调用el.href不会返回/animals/cat,这可能与你猜测的不符。原因在于,元素实现了HTMLHyperlinkElementUtils接口,该接口提供了一系列辅助属性,例如prototol与hash等等,以展现与链接的目标相关的值。

href就是其中一个实用的属性,它将返回完整的URL,并去掉无用的空格,而不是返回在特性中所指定的相对URL,

这样一来,如果你需要获取href特性中的字符串字面值,就只能使用el.getAttribute('href')方法了。

12.dialog元素的三大法宝

<dialog>是一个相对较新的元素,它带来了两个还算能用的方法,和一个非常棒的方法。其中show()和close()方法的功能与你所想象的一样。

而showModal()方法能够将<dialog>元素显示在页面顶层,居中对齐,这正是所期望的模态窗口行为。你无需指定z-index,或者手动添加一个灰色的背景,也不需要监听esc按键以关闭此窗口。浏览器能够理解模态窗口的工作方式,并自动完成你所期望的行为。

13.forEach()

某些情况,当你获取到一个元素列表的引用时,可以通过forEach()方法记性迭代式调用

假设你需要记录页面所有链接的URL,可以输入以下代码,只要你不介意看到报错

document.getElementsByTagName('a').forEach(el==>{
   console.log(el.href);
})

也可以这么做:

document.querySelectorAll('a').forEach(el==>{
   console.log(el.href);
})

问题出在getElementsByTagName与其他类似的get...方法返回的是一个HTMLCollection接口,而querySelectorAll返回的是一个NodeList接口。

而NodeList接口为我们提供了forEach()方法(此外还包括keys()、values()、和entries()等方法)。

理想的情况下,最好是每个方法都只返回简单的数组,而不是返回一些类似数组的对象。不过别担心,ECMA大神为我们提供了Array.form()方法,它能够把所有这些类数组对象转为一个真正的数组。

所以,这样的代码就能够正常工作:

Array.from(document.getElementsByTagName('a')).forEach(el==>{
    console.log(el.href);
});

创建了一个数组之后,就能对其使用map()、filter()和reduce()以及其他各种数组方法了。

举个栗子,先不管目的是什么,总之你可以按以下方式返回所有外部链接的数组:

Array.from(document.querySelectorAll('a'))
    .map(el==> el.origin)
    .filter(origin => origin !==document.origin)
    .filter(Boolean);

14.表单

或许你已经知道,<form>有一个方法submit()方法。但或许你不知道表单还有一个reset()方法,而且当你需要对表单元素进行验证时,还可以调用reportValidity()方法。

15.select()

虽然这是最后一条,但是也很重要哦,.select()方法会将你指定的元素中的所有内容全选

 

详细信息见:https://mp.weixin.qq.com/s/QLoTIpVgq5IqqYDW4ZQMKg

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值