Как много вы помните об этих нативных операциях с DOM😨

внешний интерфейс
Как много вы помните об этих нативных операциях с DOM😨

предисловие

Недавно внутренняя библиотека компонентов пользовательского интерфейса компании была инкапсулирована во второй раз, и один из модулей должен предоставитьelement-plusизmessageДля расширения используется большое количество нативных DOM-операций, наиболее удобным способом работы с DOM является использованиеjquery, но написание компонента vue также ссылаетсяjquery, что является оскорблениемvueДа, и, наконец, полагайтесь на собственный js для достижения.

Но, если честно, как долго вы не писали нативный js в эпоху фреймворков? Прошло много времени с автора, и некоторые нативные API будут забыты, если их не написать, поэтому давайте двигаться дальше и рассматривать эти знакомые и незнакомые API!

Общие операции с DOM

Получить элемент DOM

Ele.getElementById(idName)

Найти элемент по id. Возвращается DOM элемента, если на странице есть несколько элементов с одинаковым ID, то будет возвращен только первый элемент, а несколько элементов не будут возвращены (в принципе ID один, но великие программисты. ..)

Ele.getElementsByClassName(className)

Найти по классу. то, что возвращаетсямассивныйСтруктура, чтобы выполнить обход forEach, вам нужно сначала преобразовать ее в структуру массива.


const doms = document.getElementsByClassName('xxx')

const domsArr = Array.from(doms)

domsArr.forEach(dom=>{})

Ele.getElementsByTagName(tagName)

Получить элементы по имени тега так же, как и getElementsByClassName.

Ele.querySelector(selectors) | Ele.querySelectorAll(selectors)

Это единственные API, которые поддерживают использование селекторов для поиска элементов. С этим API нам очень удобно выполнять глубокий поиск.


<div class="warp">
    <p>name<p>
    <p>age<p>
<div>

<p>...</p>


<script>
// 目标 获取到warp下面的p元素

1. 不使用querySelectorAll
cons warp = document.getElementsByClassName("warp")[0];
const allp =  warp.getElementsByTagName(p)

2. 使用querySelectorAll

const allp = document.querySelectorAll(".warp p")
 
</script>

querySelector получает один элемент, querySelectorAll получает несколько элементов и возвращает структуру, подобную массиву.

Добавляйте стили в DOM

Добавляйте стили к элементам

Ele.style.width = xxx

добавить класс к элементу

Ele.className='aaa'  // 设置元素的class为aaa ,如果元素上原本有class则会覆盖

Ele.classList.add("aaa") // 给Ele新增aaa

Ele.className += " aaa"  // 给Ele新增aaa

Проверить, есть ли атрибут у элемента

Ele.classList.contains("aaa")  // 如果Ele上面的class类名是aaa返回true,否则返回false

Управление свойствами в DOM

Добавить свойство

Ele.setAttribute("data-id", 1);

Получить стоимость недвижимости

Ele.getAttribute("data-id");

удалить атрибут

Ele.removeAttribute("data-id");

Добавление, удаление, изменение и поиск элементов dom

Создание DOM-элементов

 const p = document.createElement("p");

удалить DOM-элемент

 Ele.remove(); // 删除ELe
 
 Ele.removeChild(clildEle) // 删除ELe中的子元素 childEle

копировать DOM

Ele.cloneNode( true | false )

const box = document.getElementsByClassName("box")[0];
const p = document.createElement("p");
p.innerText = "欢迎关注码不停息微信公众号";
const p2 = p.cloneNode(true); // 复制一个p  参数true标识深度复制,如果p里面有子节点也复制过来
box.appendChild(p);
box.appendChild(p2);

Как показано на рисунке, были получены два тега p, и оба они отображаются на странице.

image.png

Вставить в DOM

Ele.appendChild(ele) 在Ele的最后插入ele

Ele.insertBefore(newele,ele) // 在Ele元素中的 ele元素前插入 newele

заменить ДОМ

parentEle.replaceChild(newEle,oldEle)

  <body>
    <div class="box">
      <h1>微信公众号</h1>
    </div>

    <button id="btn">变换</button>
    <script>
      const btnDom = document.getElementById("btn");
      const box = document.getElementsByClassName("box")[0];
      const h1 = document.getElementsByTagName("h1")[0];
      const h2 = document.createElement("h2");
      h2.innerText = "码不停息";
      btnDom.onclick = function () {
        box.replaceChild(h2, h1);
      };

    </script>
  </body>

удалить DOM

EleParent.removeChild(ele) // 删除EleParent中的ele元素

Пройтись по DOM

  • parentNode

Найти родительский узел указанного узла

  • nextSibling

Найти следующий узел указанного узла

  • previousSibling

Найти предыдущий узел указанного узла

  • firstChild

Найти первую байтовую точку указанного узла

  • lastChild

Найти последнюю точку байта указанного узла

  • childElementCount

Возвращает количество дочерних элементов, текстовых узлов и не включает аннотации

  • firstElementChild

возвращает первый дочерний элемент

  • lastElementChild

Возвращает последний дочерний элемент

  • previousElementSibling

Возвращает предыдущий соседний одноуровневый элемент

  • nextElementSibling

Возвращает следующий соседний одноуровневый элемент

Обратите внимание, что узлы и элементы не равны

<body>
    <div id="box">
      <p>文件</p>
      <p>文件</p>
    </div>

    <script>
      const box = document.getElementById("box");
      console.log(box.firstChild); // 打印 text节点(换行)
      console.log(box.firstElementChild); // 打印p标签
    </script>
 </body>

Определите тип узла элемента

nodeType, всего 12 типов, см.W3C

  <body>
    <div id="box">
      <p>文件</p>
      <p>文件</p>
    </div>

    <script>
      const box = document.getElementById("box");
      console.log(box.firstChild.nodeType); // 3 文本
      console.log(box.firstElementChild.nodeType); // 1 元素
    </script>
  </body>

Получает ширину и высоту браузера Большого шлема

image.png

const W  =  window.screen.width 
const H  =  window.screen.height

Получает ширину браузера и высоту

image.png

const W = window.outerWidth;
const H = window.outerHeight;

Получить текущую ширину и высоту окна (ширину и высоту области просмотра браузера)

image.png

const W = window.innerWidth;
const H = window.innerHeight;

Получить ширину и высоту макета элемента

image.png

const W = element.offsetWidth;
const H = element.offsetHeight;

Получить ширину и высоту содержимого элемента

image.png

const W = element.scrollWidth;
const H = element.scrollHeight;

Получить ширину и высоту скрытой страницы после прокрутки

image.png

const H = document.documentElement.scrollTop;
const W = document.documentElement.scrollLeft

Получить расстояние от верхней и левой части элемента

image.png

const top = Ele.offsetTop;
const left = Ele.offsetLeft

Собственный инвентарь событий браузера

событие мыши

коллекция событий

  • событие щелчка
Ele.onclick = function () {
    console.log("onclick");
 };
  • событие двойного щелчка
Ele.ondblclick = function () {
    console.log("ondblclick");
 };
  • событие правого клика
Ele.oncontextmenu = function () {
    console.log("oncontextmenu");
 };
  • событие нажатия мыши
Ele.onmousedown = function () {
    console.log("onmousedown");
 };
  • событие перемещения мыши
Ele.onmousemove = function () {
    console.log("onmousemove");
 };
  • событие мыши вверх
Ele.onmouseup = function () {
    console.log("onmouseup");
 };
  • мышь на случай
// 鼠标移动到自身时候会触发事件,同时移动到其子元素身上也会触发事件
Ele.onmouseover = function () {
    console.log("onmouseover");
 };
// 鼠标移动到自身是会触发事件,但是移动到其子元素身上不会触发事件
 Ele.onmouseenter = function () {
    console.log("onmouseenter");
 };
  • событие отключения мыши
// 鼠标移动到自身时候会触发事件,同时移动到其子元素身上也会触发事件
Ele.onmouseout = function () {
    console.log("onmouseout");
 };
 // 鼠标移动到自身是会触发事件,但是移动到其子元素身上不会触发事件
 Ele.onmouseleave = function () {
    console.log("onmouseleave");
 };

Полные мероприятия на основе мышей

qw00d-d0jqo.gif

  const box = document.getElementById("box");
  let nowW, nowH, flag;
  box.onmousedown = function (e) {
    nowW = e.clientX;
    nowH = e.clientY;
    flag = true;
    document.onmousemove = function (e) {
      if (!flag) return false;
      const moveX = e.clientX - nowW;
      const moveY = e.clientY - nowH;
      const left = parseInt(box.style.left || 0);
      const top = parseInt(box.style.top || 0);
      box.style.left = left + moveX + "px";
      box.style.top = top + moveY + "px";
      nowW = e.clientX;
      nowH = e.clientY;
    };
    document.onmouseup = function () {
      flag = false;
    };
    document.onmouseleave = function () {
      flag = false;
    };
  };

Завершить пользовательский щелчок правой кнопкой мыши на основе событий мыши

w6pys-l06lx.gif

<body>
    <div id="box"></div>
    <div id="option">
      <div class="item">复制</div>
      <div class="item">放大</div>
      <div class="item">搜索</div>
    </div>
    <script>
      const box = document.getElementById("box");
      const option = document.getElementById("option");
      box.oncontextmenu = function (e) {
        const x = e.clientX;
        const y = e.clientY;
        option.style.display = "block";
        option.style.top = y + "px";
        option.style.left = x + "px";
        return false;
      };
      option.onclick = function () {
        this.style.display = "none";
      };
    </script>
  </body>

событие клавиатуры

коллекция событий

  • keydown: запускается, когда пользователь нажимает любую клавишу на клавиатуре, и повторно запускает это событие, если его удерживать.
  • нажатие клавиши: запускается, когда пользователь нажимает символьную клавишу на клавиатуре (то есть пользователь нажимает клавишу, которая может выводить символы на экран. Запускается событие нажатия клавиши), и если его удерживать, это событие будет запускаться повторно. (нажатие клавиши Esc также вызовет это событие).
  • keyup: запускается, когда пользователь отпускает клавишу на клавиатуре.

Завершите перемещение div с помощью клавиш со стрелками на основе события клавиатуры

t2wmh-qbf80.gif

<body>
    <div id="box">
      <div id="move">静止</div>
    </div>
    <script>
      const box = document.getElementById("box");
      const move = document.getElementById("move");
      let lefts = box.style.left || 0;
      let tops = box.style.top || 0;
      document.addEventListener("keydown", function (e) {
        const code = e.keyCode;
        move.innerHTML = "开始移动";
        switch (code) {
          case 38:
            move.innerHTML = "上";
            tops -= 5;
            break;
          case 40:
            move.innerHTML = "下";
            tops += 5;
            break;
          case 37:
            move.innerHTML = "左";
            lefts -= 5;
            break;
          case 39:
            move.innerHTML = "右";
            lefts += 5;
            break;
          default:
            break;
        }

        box.style.top = tops + "px";
        box.style.left = lefts + "px";
      });
      document.addEventListener("keyup", function () {
        move.innerHTML = "静止";
      });
      document.addEventListener("keypress", function () {
        console.log("keypress");
      });
    </script>
  </body>

событие формы

  • отправить: отправка формы
  • сброс: сброс формы
  • изменить: значение изменилось
  • размытие: не в фокусе (без пузырей)
  • фокус: фокус (без пузырьков)

window

Событие окна относится к самому окну браузера, а не к объекту документа внутри окна.

  • onload: вызывается при загрузке документа и ресурса
  • выгрузить: вызывается, когда пользователь покидает текущий документ и переходит к другому документу
  • resize: изменение размера окна браузера

другие события

  • beforeunload: событие запускается перед закрытием окна браузера
  • DOMContentLoaded: событие, инициированное после загрузки объекта документа, без ожидания ресурсов, таких как стили и изображения.
  • readystatechange: документ имеет свойство readyState для описания состояния загрузки документа, и изменение readyState вызовет событие readystatechange.

document.readyState === 'полная' страница загружена document.readyState === 'loading' страница загружается

  • pageShow и pagehide: срабатывает каждый раз, когда пользователь просматривает страницу, чтобы закрыть ее.

Инвентаризация собственных объектов Javascript

Объект времени Дата

Некоторые часто используемые методы

  • toLocaleDateString(): преобразует часть даты объекта Date в строку в соответствии с форматом местного времени.

  • toLocaleTimeString(): преобразует временную часть объекта Date в строку в соответствии с форматом местного времени.

  • toLocaleString(): преобразовать объект Date в строку в соответствии с форматом местного времени.

  • getTime(): получить текущую метку времени

image.png

Отметка времени

      function timestampToTime(timestamp) {
        if (typeof timestamp != "number") return false;
        if (timestamp.length === 10) timestamp = timestamp * 1000;
        const date = new Date(timestamp);
        Y = date.getFullYear() + "-";
        M =
          (date.getMonth() + 1 < 10
            ? "0" + (date.getMonth() + 1)
            : date.getMonth() + 1) + "-";
        D = (date.getDate() < 9 ? "0" + date.getDate() : date.getDate()) + " ";
        h =
          (date.getHours() < 9 ? "0" + date.getHours() : date.getHours()) + ":";
        m =
          (date.getMinutes() < 9
            ? "0" + date.getMinutes()
            : date.getMinutes()) + ":";

s = date.getSeconds() < 9 ? "0" + date.getSeconds() : date.getSeconds();
        return Y + M + D + h + m + s;
      }

время до отметки времени

  function timeToTimestamp(time){
    const date = new Date(time);
    return date.getTime()
  }

Математический объект

  • Math.abs(): взять абсолютное значение
   Math.abs(-1)  // 1
  • Math.ceil(): округлить
   Math.ceil(1.1)  // 2
  • Math.floor (): закруглен
   Math.floor(1.1)  // 1
  • Math.round(): округлить
   Math.round(1.5)  // 2
  • Math.max(): взять максимальное значение
   Math.max(1,2,3)  // 3
  • Math.min(): взять минимальное значение
   Math.min(1,2,3)  // 1
  • Math.random(): генерирует случайные числа от 0 до 1.
   Math.random() 
  • Math.pow(): мощность
   Math.pow(2,3)  // == 2*2*2 == 8
  • Math.sqrt(): квадратный корень
   Math.sqrt(36)  // 6

наконец

В этой статье грубо разобраны некоторые операции "JavaScript-ориентированного программирования", которые мы часто используем в своей работе.Возможны некоторые недочеты, и они будут постепенно исправляться на более позднем этапе. Добро пожаловать лайк + подписка😘