LinkXSystem / learn-guide

有趣的学习笔记 (*^_^*)
https://linkxsystem.github.io/
3 stars 1 forks source link

前端小技巧 (。・∀・)ノ゙ #3

Open LinkXSystem opened 4 years ago

LinkXSystem commented 4 years ago

用于记录一些常见的前端的小技巧的代码片段

LinkXSystem commented 4 years ago

判断鼠标滚轮的方向

function (event) {
    const delta = event.wheelDelta;
    const status  = delta > 0 ? true : false
    ...
}
LinkXSystem commented 4 years ago

什么是 document.readyState

document.readyState 有啥用

通常情况下,我们可以使用DOMContentLoaded事件来完成监听 DOM 是否加载完成,而不是使用 document.readyState 来检查 DOM 的状态。 同时也由于 Script 都是要求放在文档底部的, 所以基本上 javascript 运行的时候 DOM 已经加载完成。

但,凡事都存在意外。

是的,当我们动态加载 script 的时候,这个问题便出现了。是的,就是你想的那样,此时 DOM 是加载完成的,DOMContentLoaded事件是无法触发的。那么如果我们需要在动态加载完成 script 需要初始化的时候,便不能写在 DOMContentLoaded事件 中了。所以这个时候我们就需要 document.readyState ,大概代码(PS:参考文章)如下:

if (document.readyState != 'loading') {
    init();
} else {
    window.addEventListener("DOMContentLoaded", function () {
        init();
    });
}
LinkXSystem commented 4 years ago

获取 HTML 元素中的文本

const text = dom.textContent || dom.innerText

为啥是 textContent 优先

LinkXSystem commented 4 years ago

快速编辑页面的方法

// 开启
document.body.contentEditable = "true"

//关闭
document.body.contentEditable = "false"
LinkXSystem commented 4 years ago

DOMParser 是啥 ?

DOMParser 是可以让 HTML 字符串解析为 DOM 树,它支持下面的 mimeType 类型:

mimeType值 返回文档类型
text/html Document
text/xml XMLDocument
application/xml XMLDocument
application/xhtml+xml XMLDocument
image/svg+xml XMLDocument

它的使用方法如下:

const parser = new DOMParser();
parse.parseFromString('<div>Yes! AMD</div>', 'text/html');

需要注意的是解析的类型不同,返回的结果则不相同

LinkXSystem commented 4 years ago

XMLSerializer 是啥?

XMLSerializer 是将 DOM 树对象序列化为字符串

它的使用方法如下:

const serializer = new XMLSerializer();

serializer.serializeToString(document.querySelector('.link'));

而且 serializeToString 方法会自动为 root 元素添加 xmlns 的命名空间

XMLSerializer 和 outerHTML 的区别

需要注意的是 outerHTML 只能在 Element 元素上使用, 但 XMLSerializer 可以使用任意类型,类型如下:

节点类型 释义
DocumentType 文档类型
Document 文档
DocumentFragment 文档片段
Element 元素
Comment 注释节点
Text 文本节点
ProcessingInstruction 注释节点
Attr 属性节点
LinkXSystem commented 4 years ago

document. execCommand 是啥?

来自MDN 解析是 当一个HTML文档切换到设计模式时,document 暴露 execCommand 方法,该方法允许运行命令来操纵可编辑内容区域的元素

言下之意,就是在 HTML 处于编辑模式的时候,我们可以通过浏览器的内建命令来直接操作 HTML 。典型的例子便是富文本编辑器的实现基础便是 document. execCommand 方法。

如果你想快速体验此方法,可以直接通过此comment 中的方法来尝试。

该方法的默认调用形式如下:

bool = document.execCommand(aCommandName, aShowDefaultUI, aValueArgument)

默认返回值为 Boolean,通常情况下,返回值都是 false ,即为未被启用或者是不支持。当然也有例外的命令,即使没有进入编辑模式也是可以正常使用的,如 copy 命令。

那么谈到了 document. execCommand ,便来看一个典型的应用吧,即富文本编辑器,但是这里即限于了解,至于为啥,你可以看一下这个

那么关于富文本编辑器的实现,就请到此问题上吧,issue

LinkXSystem commented 4 years ago

MutationObserver 是啥?

MutationObserver 使用监控指定 DOM 节点变化的 API,包括文本变更,属性更新等操作

基本的调用形式如下:

const ObserverCallback = function() {
...
}

const observer = new MutationObserver(ObserverCallback);
// 指定监听的对象
const target = document.body;
// 指定监听的配置
const options = { attribute: true };

// 启动监听
observer.observe(target, options});
// 停止监听
observer.disconnect();

MutationObserver 使用十分简单,但是我们需要注意它的配置参数有哪些?参数如下:

注意, attributes / characterData / childList 三者中需要必须有一个为 true

为啥,Callback 中返回的 MutationRecord 对象的 type 字段对应的类型便是 attributes / characterData / childList 之一 。下面是 Callback 的参考示例:

//  参数依次为 MutationRecord 对象的数组,以及调用的观察者 
const ObserverCallback = function(mutations, observer) {
    mutations.forEach(mutation => {
         switch (mutation.type) {
            case "attributes":
               ...
               break;
            case "childList":
               ...
               break;
         }
   });
};

那么 MutationRecord 对象具体包含的属性如下:

LinkXSystem commented 4 years ago

禁止手动修改对象的方式

注意:以上方法均不可逆

LinkXSystem commented 3 years ago

监听 StorageEvent 事件

基于此事件可以共享同源页面上的数据