select 源码解析

select 源码解析

正文

0. 功能

select 库的功能是使用户能够以编程命令式的方式选择某个 html 元素节点,并同步获取元素内容文本

1. 代码结构

  • /src/select.js(阅读笔记:/src/select.js
function select(element) {
  var selectedText;

  if (element.nodeName === 'SELECT') {
    // ...
  } else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
    // ...
  } else {
    // ...
  }

  return selectedText;
}

module.exports = select;

代码结构就一个 select.js 文件,主流程分成三种目标元素来处理

1.1 HTMLSelectElement

对于 <select> 元素

  • /src/select.js(阅读笔记:/src/select.js
  if (element.nodeName === 'SELECT') {
    element.focus();

    selectedText = element.value;

直接使用 select 元素的 value 代表选取的目标文本

1.2 HTMLInputElement、HTMLTextAreaElement

  • /src/select.js(阅读笔记:/src/select.js
  } else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
    var isReadOnly = element.hasAttribute('readonly');

    if (!isReadOnly) {
      element.setAttribute('readonly', '');
    }

    element.select();
    element.setSelectionRange(0, element.value.length);

    if (!isReadOnly) {
      element.removeAttribute('readonly');
    }

    selectedText = element.value;

对于 input 和 textarea 元素,首先需要在选取的过程确保 readonly,避免内容被修改;使用

    element.select();
    element.setSelectionRange(0, element.value.length);

选择输入框后选取输入框的内容文本

1.3 其他 Element

  • /src/select.js(阅读笔记:/src/select.js
    if (element.hasAttribute('contenteditable')) {
      element.focus();
    }

    var selection = window.getSelection();
    var range = document.createRange();

    range.selectNodeContents(element);
    selection.removeAllRanges();
    selection.addRange(range);

    selectedText = selection.toString();

对于其他 Element,我们使用了 Selection API 来实现,先获取 window 上的 Selection 对象(window.getSelection),然后创建 Range 对象(document.createRange),使用 range.selectNodeContents 方法选取目标元素,并挂载到 selection 上 selection.addRange(range)

其他资源

参考连接

TitleLink
select - npmhttps://www.npmjs.com/package/select
zenorocha/select - githubhttps://github.com/zenorocha/select
HTMLSelectElement - MDNhttps://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement
HTMLInputElement.select() - MDNhttps://developer.mozilla.org/zh-CN/docs/Web/API/HTMLInputElement/select
HTMLTextAreaElement - MDNhttps://developer.mozilla.org/zh-CN/docs/Web/API/HTMLTextAreaElement
HTMLElement - MDNhttps://developer.mozilla.org/en-US/docs/Web/API/HTMLElement
Window.getSelection - MDNhttps://developer.mozilla.org/zh-CN/docs/Web/API/Window/getSelection
Document.createRange() - MDNhttps://developer.mozilla.org/zh-CN/docs/Web/API/Document/createRange
Range - MDNhttps://developer.mozilla.org/zh-CN/docs/Web/API/Range

阅读笔记参考

https://github.com/superfreeeee/Blog-code/tree/main/source_code_research/select-1.1.2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值