Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 亚洲国产爱久久全部精品,日韩一区二区精品久久高清,2020久久国产最新免费观看

          整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          19、jQuery 如何設(shè)置和獲取 HTML、文本和

          19、jQuery 如何設(shè)置和獲取 HTML、文本和值?(必會)

          、html()方法:如果想更改或者是設(shè)置 HTML 的內(nèi)容,我們可以使用 html()方法,首先我們先使用這個方法獲取元素里面的內(nèi)容 var html=$("p").html()。如果需要設(shè)置某元素的 HTML 代碼,那么我們就可以使用此方法加上一個參數(shù)。此方法只能應(yīng)用于 XHTML 中,不能用于 xml。

          2、text()方法,去設(shè)置某個元素中的文本內(nèi)容,代碼是 var text=$("p").text();如果想設(shè)置文本同樣需要給它傳一個參數(shù)。

          3、val()方法,可以用來設(shè)置和獲取元素的值,它不僅僅可以設(shè)置元素,同時也能獲取元素,另外,它能是下拉列表框,多選框,和單選框相應(yīng)的選項被選中,在表單操作中會經(jīng)常用到。


          用html標簽使用介紹

          本文主要記錄常用的html標簽使用說明,用起來的時候偶爾查查。

          常用html標簽列表

          標簽

          英文全拼

          作用

          特點

          ?<html></html>??

          html

          網(wǎng)頁的根標簽

          所有的標簽都要寫在這一對根標簽里面

          ??<head></head>??

          head

          網(wǎng)頁的頭標簽

          包括完檔的屬性和信息

          ??<body></body>??

          body

          網(wǎng)頁的主題

          包含文檔的所有內(nèi)容

          ??<div></div>??

          division

          定義一個區(qū)域

          瀏覽器通常會在??<div>??前后放置一個換行符

          ??<!-- 注釋 -->??

          -

          注釋

          單標簽

          ??<br>或<br/>??

          break

          換行

          單標簽,不會在其前后創(chuàng)建空白行

          ??<hr>或<hr/>??

          horizontal rule

          添加水平線

          單標簽

          ??<img src="">??

          image

          添加圖片

          單標簽

          ??<embed src="">??

          embed

          嵌入外部應(yīng)用

          單標簽

          ??<meta>??

          meta

          提供有關(guān)頁面的元信息

          單標簽,??<meta>???標簽通常位于??<head>??區(qū)域內(nèi)

          ??<link>??

          link

          定義文檔與外部資源的關(guān)系

          單標簽,??<link>???標簽只能存在于??<head>??區(qū)域內(nèi),不過它可出現(xiàn)任何次數(shù)。

          ??<p></p>??

          paragraph

          定義段落

          自動在其前后創(chuàng)建空白行

          ??<h1> to <h6>??

          Header 1 to Header 6

          定義標題

          h1在一個頁面里只能出現(xiàn)一次

          ??<strong></strong>??

          strong

          文本加粗

          加粗標記該文本

          ??<b></b>??

          bold

          文本加粗

          加粗顯示文本,不推薦使用

          ??<em></em>??

          emphasize

          文本傾斜

          傾斜標記文本

          ??<i></i>??

          italic

          文本傾斜

          傾斜顯示文本,不推薦使用

          ??<del></del>??

          delete

          文本添加刪除線

          -

          ??<s></s>??

          strike

          文本添加刪除線

          不推薦使用

          ??<ins></ins>??

          insert

          文本添加下劃線

          -

          ??<u></u>??

          underline

          文本添加下劃線

          不推薦使用

          ??<a href="">填寫內(nèi)容</a>??

          anchor

          添加超鏈接

          最好使用CSS來改變鏈接的樣式

          ??<ul></ul>??

          unordered list

          定義無序列表

          通常與??<li>??標簽一起使用

          ??<ol></ol>??

          ordered list

          定義有序列表

          通常與??<li>??標簽一起使用

          ??<li></li>??

          list item

          創(chuàng)建列表項

          可與各種列表定義標簽一起使用

          ??<dl></dl>??

          definition list

          定義描述列表

          通常與??<dt>???和??<dd>??一起使用

          ??<dt></dt>??

          definition term

          定義條目

          定義描述列表的項目

          ??<dd></dd>??

          definition description

          定義描述

          對描述列表中的項目進行描述

          ??<table></table>??

          table

          定義HTML表格

          盡可能通過樣式改變表格外觀

          ??<tr></tr>??

          table row

          定義表格的行

          一個??<tr>???標簽包含一個或多個??<th>???或??<td>??標簽

          ??<th></th>??

          table headline

          定義表格每一列的標題

          該標簽的文本通常呈現(xiàn)為粗體且居中

          ??<td></td>??

          table data

          定義表格中的單元格數(shù)據(jù)

          該標簽的文本呈現(xiàn)為普通且左對齊

          ??<caption>表格標題</caption>??

          caption

          定義整個表格的標題

          ??<caption>???標簽必須直接放在??<table>??標簽后

          ??<input type="">??

          input

          定義輸入控件

          輸入字段可通過多種方式改變,取決于type屬性

          ??select??

          select

          定義下拉列表

          ??<select>???中的??<option>??標簽定義了列表中的可用選項

          ??<option></option>??

          option

          定義下拉列表中的可用項

          ??<option>??標簽不可自由定義寬高

          ??<optgroup></optgroup>??

          options group

          定義選項組

          ??<optgroup>??標簽用于把相關(guān)的選項組合在一起

          ??<textarea></textarea>??

          textarea

          定義多行的文本輸入控件

          文本的默認字體是等寬字體

          ??<form></form>??

          form

          定義表單

          ??<form>??可以包含多個元素

          ??<fieldset></fieldset>??

          field set

          定義圍繞表單中元素的邊框

          ??<legend>???為??<fieldset>??定義標題

          ??<legend></legend>??

          legend

          為??<fieldset>??定義標題

          ??<legend>??通過css設(shè)定樣式

          ??<progress></progress>??

          progress

          定義運行中的任務(wù)進度

          ??<progress>???是HTML5中的新標簽,??<progress>??標簽不適合用來表示度量衡

          ??<meter></meter>??

          meter

          度量衡

          ??<meter>???是HTML5的新標簽,??<meter>??標簽不適合用來表示進度條

          ??<audio></audio>??

          audio

          添加音頻

          ??<audio>??標簽是HTML5的新標簽

          ??<video></video>??

          video

          添加視頻

          ??<video>??標簽是HTML5的新標簽

          ??<source>??

          source

          定義媒介資源

          ??<source>??標簽是HTML5中的新標簽

          常用標簽使用說明

          • 常用寫法:??<img src="" alt="" title=""width="" height=""??>
          • src:圖片的來源(必寫屬性)
          • alt:圖像不顯示時的替代文本
          • title:鼠標在移動到元素上的文本提示
          • width/height:圖片寬高,沒有定義寬高的時候,圖片按照百分之百比例顯示,更改圖片的寬度或者高度,圖片等比例縮放

          普通用法

          • 常用寫法:??<a href="" title="" target="">填寫內(nèi)容</a>??
          • href:去往的路徑(必寫屬性)
          • title:鼠標在移動到元素上的文本提示
          • target:規(guī)定在何處打開路徑
          • _blank:新頁面打開
          • _parent:在父窗口中打開鏈接
          • _self:當(dāng)前頁面跳轉(zhuǎn)(默認值)
          • _top:在當(dāng)前窗體打開鏈接,并替換當(dāng)前的整個窗體
          • 當(dāng)href的值為javascript:void(0); 或 javascript:; ,表示超鏈接不做任何事情,不做任何跳轉(zhuǎn)
          • 當(dāng)href的值為#,表示超鏈接為空鏈接,點擊此鏈接時會跳轉(zhuǎn)到頁首的位置

          錨點鏈接

          錨點鏈接通過點擊超鏈接,自動跳轉(zhuǎn)到我們設(shè)置錨點的位置,類似于word的目錄導(dǎo)航。建立錨點的元素必須要有id或name屬性,最好兩個都有。這里只跳轉(zhuǎn)本頁面元素,其他頁面跳轉(zhuǎn)自行搜索。
          具體做法如下:

          1. 給目標元素設(shè)置id值,如??<p id="id1"></p>??
          2. 設(shè)置錨點超鏈接,錨點的超鏈接路徑一定包含"#",后面緊跟元素的id或者name,如??<a href="#id1"></a>??

          示例如下。為了顯示效果,通過使用lorem自動生成隨機文本(具體使用方法搜索,一般直接輸入就行),lorem*50表示重復(fù)lorem15次。

          <a href="#id2">a</a>
          
            <p id="id1">
              (lorem*15)
            </p>
          
               (lorem*15)
          
            <p id="id2">
               (lorem*15)
            </p>

          超鏈接全局設(shè)置

          在頁面head中寫入代碼可以設(shè)置超鏈接的全局跳轉(zhuǎn)設(shè)置

          <head>
            <!-- 讓頁面所有的超鏈接新頁面打開 -->
            <base target="_blank">  
          </head>

          charset編碼

          • 常用寫法: ??<meta charset="UTF-8">??
          • charset:定義文檔的字符編碼
          • ASCII/ANSI/Unicode:英語
          • GBK:亞洲通用字符集
          • GB2312:中文簡體
          • Big5:臺澳港繁體
          • UTF-8:世界通用字符集

          name

          1. 關(guān)鍵字
          • 常用寫法: ??<meta name="keywords" content="">??
          • 描述:告訴搜索引擎網(wǎng)頁的關(guān)鍵字,盡量將重要的關(guān)鍵詞放在前面
          1. 網(wǎng)頁描述
          • 常用寫法: ??<meta name="keywords" content="">??
          • 描述:告訴搜索引擎網(wǎng)頁的主要內(nèi)容
          1. 作者
          • 常用寫法: ??<meta name="author" content="">??
          • 描述:告訴搜索引擎網(wǎng)頁的作者
          1. 文件檢索
          • 常用寫法: ??<meta name="robots" content="all | none | index | noindex | follow | nofollow">??
          • 描述:有時候會有一些站點內(nèi)容,不希望被ROBOTS抓取而公開。為了解決這個問題,ROBOTS開發(fā)界提供了兩個辦法:一個是robots.txt,另一個是The Robots META標簽。
          • content: 文件檢索方式
          • all:文件將被檢索,且頁面上的鏈接可以被查詢 (默認值)
          • none:文件將不被檢索,且頁面上的鏈接不可以被查詢
          • index:文件將被檢索;
          • noindex:文件將不被檢索,但頁面上的鏈接可以被查詢
          • follow:頁面上的鏈接可以被查詢
          • nofollow:文件將不被檢索,頁面上的鏈接可以被查詢

          網(wǎng)頁自動跳轉(zhuǎn)

          • 常用寫法: ??<meta http-equiv="Refresh" content="3;url=http://www.baidu.com" />??
          • 描述:網(wǎng)頁5秒后自動跳轉(zhuǎn)到谷歌主頁
          • url:為空則刷新本頁
          • 常用寫法:
          • 描述:規(guī)定當(dāng)前文檔與被鏈接文檔/資源之間的關(guān)系
          • rel:定義當(dāng)前文檔與被鏈接文檔之間的關(guān)系。rel 是 relationship的英文縮寫(必寫屬性)
          • type:規(guī)定被鏈接文檔的類型
          • href:鏈接的文件路徑
          • 示例:
          • 鏈接外部樣式表:??<link rel="stylesheet" type="text/css" href="a.css">??
          • 設(shè)置網(wǎng)頁icon圖標:??<link rel="icon" href="a.ico">??

          列表

          無序列表

          無序列表使用粗體圓點進行標記。簡單示例如下。

          <ul>
                  <li>1</li>
                  <li>2</li>
                  <li>3</li>
                  ...
              </ul>

          有序列表

          有序列表使用數(shù)字進行標記,我們可以通過整數(shù)值start指定列表編號的起始值。簡單示例如下。

          <ol start="2">
                  <li>a</li>
                  <li>b</li>
                  <li>c</li>
                  ...
              </ol>

          描述列表

          通過描述列表自定義列表,列表項內(nèi)部可以使用段落、換行符、圖片、鏈接以及其他列表等等。簡單示例如下。

          <dl>
                  <dt>A</dt> <!-- 小標題 -->
                      <dd>A1</dd> <!-- 解釋標題 -->
                      <dd>A2</dd> <!-- 解釋標題 -->
                  <dt>B</dt> <!-- 小標題 -->
                      <dd>B1</dd> <!-- 解釋標題 -->
                      <dd>B2</dd> <!-- 解釋標題 -->
              </dl>

          表格

          基礎(chǔ)表格

          • 常用寫法:??<table width="" height="" border="" cellspacing="" cellpadding=""></table>??
          • width:表格寬度
          • height:表格高度
          • border:邊框?qū)挾?/li>
          • cellspacing:單元格間距
          • cellpadding:內(nèi)容與邊框間距

          簡單示例如下。

          <table width="300px" height="100px" border="2" cellspacing="5px" cellpadding="0">
          <caption>表格標題</caption> <!-- 定義表格標題 -->
          
          <tr>
              <!-- 定義表格的行 -->
              <td>A1</td> <!-- 定義表格該行第一列中的數(shù)據(jù) -->
              <td>B1</td>
              <td>C1</td>
          </tr>
          <tr>
              <!-- 定義表格的行 -->
              <th>A</th> <!-- 定義表格每一列的標題 -->
              <th>B</th>
              <th>C</th>
          </tr>
          <tr>
              <td>A2</td>
              <td>B2</td>
              <td>C2</td>
          </tr>
          </table>

          單元格合并

          • 常用寫法:??<td colspan=“” rowspan=“”></td>??
          • 描述:告訴表格該單元格可以橫跨colspan列,縱跨rowspan行

          簡單示例如下。

          <table border="2" cellspacing="1px" width="400px" height="100px">
          <caption><strong>表格標題</strong></caption> <!-- 定義表格標題 -->
          <tr height="100">
              <!-- 定義表格的行 -->
              <td colspan="2">A1</td> <!-- 定義該行可以橫跨兩列 -->
              <td>B1</td>
          </tr>
          
          <tr height="100">
              <td>A2</td>
              <td>B2</td>
              <td rowspan="2">C</td> <!-- 定義該行可以橫跨兩行 -->
          </tr>
          
          <tr height="100">
              <td>A3</td>
              <td>B3</td>
          </tr>
          </table>

          對于??<input>??不同的type屬性值,輸入字段擁有很多種形式。輸入字段可以是文本字段、復(fù)選框、掩碼后的文本控件、單選按鈕、按鈕等等。

          文本輸入框

          • 常用寫法:??<input type="text" name="" maxlength="" readonly="" disabled="" value="">??
          • type:規(guī)定輸入字段的類型
          • name:輸入框的名字
          • maxlength:輸入文本長度
          • readonly:輸入框是否只讀
          • disabled:輸入框是否未激活
          • value:輸入框默認值

          簡單示例如下。

          <input type="text" name="username" maxlength="6" readonly="readonly" disabled="disabled" value="用戶名">

          密碼輸入框

          • 常用寫法:??<input type="password" name="">??
          • type:規(guī)定輸入字段的類型
          • name:輸入框的名字
          • 密碼輸入框的其他參數(shù)和文本輸入框一樣

          簡單示例如下。

          <input type="password" name="pwd" maxlength="6" readonly="readonly" disabled="disabled" value="密碼">

          單選框

          • 常用寫法:??<input type="radio" name="" checked="checked">??
          • type:規(guī)定輸入字段的類型
          • name:輸入框的名字
          • checked:設(shè)定該輸入框被預(yù)先選定
          • 想要多個單選框只能有一個被選中,設(shè)置所有單選框的name值相同即可實現(xiàn)

          示例一,兩個單選框都可以被選中

          <div>
              <input type="radio" name="man" checked="checked">男
          </div>
          <div>
              <input type="radio" name="woman">女
          </div>

          示例二,兩個單選框只能有一個被選中

          <div>
              <input type="radio" name="gender" checked="checked">男
            </div>
            <div>
              <input type="radio" name="gender">女
            </div>

          下拉列表

          ??<select>??

          • 常用寫法:??<select multiple=""></select>??
          • multiple:當(dāng)該屬性為true時,可選擇多個選項。

          ??<optgroup>??

          • 常用寫法:??<optgroup label=""></optgroup>??
          • label:設(shè)定選項組的描述。

          ??<option>??

          • 常用寫法:??<option value="" selected="">選項值</option>??
          • value:定義送往服務(wù)器的選項值。
          • selected:當(dāng)該屬性為true時,該選項被默認選擇。

          示例一,單選下拉列表

          <select>
              <option value="a">a</option>
              <option value="b">b</option>
              <option value="c" selected='selected'>c</option>  <!-- 默認選中 -->
            </select>

          示例二,帶組合的單選下拉列表

          <select>
              <optgroup label="A">
                <option value="a1">a1</option>
                <option value="a2" selected='selected'>a2</option>
              </optgroup>
              <optgroup label="B">
                <option value="b1">b1</option>
                <option value="b2">b2</option>
              </optgroup>
            </select>

          示例三,帶組合的多選下拉列表

          <select multiple=”multiple”>
              <optgroup label="A">
                <option value="a1">a1</option>
                <option value="a2" selected='selected'>a2</option>
              </optgroup>
              <optgroup label="B">
                <option value="b1" selected='selected'>b1</option>
                <option value="b2">b2</option>
              </optgroup>
            </select>

          多選框

          • 常用寫法:??<input type="checkbox" checked="">??
          • type:規(guī)定輸入字段的類型
          • checked:設(shè)定該輸入框被預(yù)先選定

          簡單示例如下。

          <input type="checkbox"  checked="checked">A
            <input type="checkbox">B

          文本框

          • 常用寫法:??<textarea cols="" rows="" placeholder=""></textarea>??
          • cols:控制可見文本的列數(shù)
          • rows:控制可見文本的行數(shù)
          • placeholder:提示字符

          簡單示例如下。

          <textarea cols="5" rows="2" placeholder="text"></textarea>

          文本上傳控件

          • 常用寫法:??<input type="file" accept=""/>??
          • accept:規(guī)定提交的文件的類型

          簡單示例如下。

          <input type="file" accept="image/gif, image/jpeg"/>

          其他類型按鈕

          <input type="submit">文件提交按鈕
            <input type="button" value="">普通按鈕
            <input type="image" src="">圖片按鈕
            <input type="reset">重置按鈕
            <input type="url">網(wǎng)址控件
            <input type="date">日期控件 
            <input type="time">時間控件
            <!--email提供了郵箱的完整驗證,必須包含@和后綴,如果不滿足驗證,會阻止表單提交-->
            <input type="email">郵件控件
            <input type="number" step="3">數(shù)字控件
            <input type="range" step="100">滑塊控件
            <input type="color">顏色控件

          表單

          示例一,普通表單

          <form>
              First name: <input type="text" name="fname"><br>
              Last name: <input type="text" name="lname"><br>
              <input type="submit" value="提交">
            </form>

          示例二,帶分組信息表單

          <form>
              <fieldset>
                <legend>Personalia:</legend>
                First name: <input type="text" name="fname"><br>
                Last name: <input type="text" name="lname"><br>
                <input type="submit" value="提交">
              </fieldset>
          
              First nameA: <input type="text" name="fname"><br>
              Last nameB: <input type="text" name="lname"><br>
            </form>

          ??<progress>???與??<meter>??主要區(qū)別和用法見??HTML5 progress和meter控件??

          ??<progress>??

          • 常用寫法:??<progress value="" max=""></progress>??
          • value:規(guī)定進程的當(dāng)前值
          • max:規(guī)定需要完成的值

          簡單示例如下。

          <progress value="60" max="100"></progress>

          ??<meter>??

          • 常用寫法:??<meter min="" low="" high="" max="" value="" optimum=""></meter>??
          • value:規(guī)定度量的當(dāng)前值
          • max:規(guī)定被界定為高的值的范圍
          • min:規(guī)定被界定為低的值的范圍
          • low:規(guī)定被界定為低的值的范圍
          • high:規(guī)定被界定為高的值的范圍
          • optimum:規(guī)定度量的最優(yōu)值
          • 具體使用見meter標簽改變顏色規(guī)則

          簡單示例如下

          <meter min="0" low="40" high="90" max="100" value="91"></meter>
          <meter min="0" low="40" high="90" max="100" value="90"></meter>

          多媒體資源

          ??<audio>??

          • 常用寫法:??<audio src="" controls autoplay loop></audio>??
          • src:規(guī)定音頻文件的url
          • controls:如果出現(xiàn)該屬性,顯示音頻播放器的控制面板(比如播放/暫停按鈕)
          • autoplay:如果出現(xiàn)該屬性,自動播放音頻
          • loop:如果出現(xiàn)該屬性,循環(huán)播放音頻

          簡單示例如下

          <audio src="demo.mp3" controls autoplay></audio>

          ??<video>??

          • 常用寫法:??<video src="" width="" height="" poster="" controls autoplay loop></video>??
          • src:規(guī)定視頻文件的url
          • width:設(shè)置視頻播放器的寬度(pixels)
          • height:設(shè)置視頻播放器的高度(pixels)
          • poster:設(shè)置視頻未播放時展示的畫面
          • controls:如果出現(xiàn)該屬性,顯示音頻播放器的控制面板(比如播放/暫停按鈕)
          • autoplay:如果出現(xiàn)該屬性,自動播放音頻
          • loop:如果出現(xiàn)該屬性,循環(huán)播放音頻

          簡單示例如下

          <video src="demo.mp4" controls autoplay height="500px" poster="0.jpg"></video>

          ??<source>??

          • 常用寫法:??<source src="" type="">??
          • src:規(guī)定媒體文件的url
          • type:規(guī)定媒體文件的類型
          • 因為不同瀏覽器支持的媒體格式不同,當(dāng)添加媒體文件時,需要考慮瀏覽器是否支持它們。我們可以準備多種不同格式的媒體文件,然后使用source 標簽,讓瀏覽器從上到下選擇支持的媒體格式

          簡單示例如下

          <video controls>
              <source src="demo.mp3" type="audio/mp3">
              <source src="demo.mp4" type="video/mp4">
              您的瀏覽器不支持video元素。
            </video>

          特殊字符

          ??HTML特殊字符編碼對照表??

          參考

          • ??HTML基礎(chǔ)??
          • ??HTML 參考手冊??
          • HTML中標簽對應(yīng)的英文
          • meter標簽改變顏色規(guī)則
          • HTML5 progress和meter控件

          S 鼠標框選(頁面選擇)時返回對應(yīng)的 HTML 或文案內(nèi)容

          一、需求背景

          1、項目需求

          當(dāng)用戶進行鼠標框選選擇了頁面上的內(nèi)容時,把選擇的內(nèi)容進行上報。

          2、需求解析

          雖然這需求就一句話的事,但是很顯然,沒那么簡單...

          因為鼠標框選說起來簡單,就是選擇的內(nèi)容,但是這包含很多中情況,比如:只選擇文案、選擇圖片、選擇輸入框、輸入框中的內(nèi)容選擇、iframe、等。

          簡單總結(jié),分為以下幾點:

          1. 選擇文案時
          2. 選擇圖片、svg、iframe、video、audio 等標簽時
          3. 選擇 input、select、textarea 等標簽時
          4. 選擇 input、textarea 標簽內(nèi)容時
          5. 選擇類似 字符時
          6. 鍵盤全選時
          7. 鼠標右鍵選擇
          8. 以上各模塊結(jié)合時
          9. 當(dāng)包含標簽的時候,返回 html 結(jié)構(gòu),只有文本時返回文本內(nèi)容

          二、技術(shù)要點

          鼠標框選包含以下幾點:

          1. debounce 防抖
          2. addEventListener 事件監(jiān)聽
          3. Range 對象
          4. Selection 對象

          1、debounce

          老生常談的技術(shù)點了,這里不能用節(jié)流,因為肯定不能你鼠標選擇的時候,隔一段時間返回一段內(nèi)容,肯定是選擇之后一起返回。

          這里用 debounce 主要也是用在事件監(jiān)聽和事件處理上。

          • 【debounce 掘金】
          • 【debounce CSDN】

          2、addEventListener

          事件監(jiān)聽,因為鼠標選擇,不僅僅是鼠標按下到鼠標抬起,還包括雙擊、右鍵、全選。

          需要使用事件監(jiān)聽對事件作處理。

          • 【addEventListener MDN】

          3、Range

          Range 接口表示一個包含節(jié)點與文本節(jié)點的一部分的文檔片段。

          Range 是瀏覽器原生的對象。

          3.1. 創(chuàng)建 Range 實例,并設(shè)置起始位置

          <body>
            <ul>
              <li>Vite</li>
              <li>Vue</li>
              <li>React</li>
              <li>VitePress</li>
              <li>NaiveUI</li>
            </ul>
          </body>
          <script>
            // 創(chuàng)建 Range 對象
            const range=new Range()
            const liDoms=document.querySelectorAll("li");
            // Range 起始位置在 li 2
            range.setStartBefore(liDoms[1]);
            // Range 結(jié)束位置在 li 3
            range.setEndAfter(liDoms[2]);
            // 獲取 selection 對象
            const selection=window.getSelection();
            // 添加光標選擇的范圍
            selection.addRange(range);
          </script>


          可以看到,選擇內(nèi)容為第二行和第三行

          3.1.1 瀏覽器兼容情況


          3.2. Range 屬性

          1. startContainer:起始節(jié)點。
          2. startOffset:起始節(jié)點偏移量。
          3. endContainer:結(jié)束節(jié)點。
          4. endOffset:結(jié)束節(jié)點偏移量。
          5. collapsed:范圍的開始和結(jié)束是否為同一點。
          6. commonAncestorContainer:返回完整包含 startContainer 和 endContainer 的最深一級的節(jié)點。

          3.2.1. 用我們上面創(chuàng)建的實例來看下 range 屬性的值


          3.2.2. 如果我們只選擇文本內(nèi)容時

          只選擇 li 中的 itePres


          可以看出 range 屬性對應(yīng)的值


          3.3. Range 方法

          1. cloneContents():復(fù)制范圍內(nèi)容,并將復(fù)制的內(nèi)容作為 DocumentFragment 返回。
          2. cloneRange():創(chuàng)建一個具有相同起點/終點的新范圍, 非引用,可以隨意改變,不會影響另一方。
          3. collapse(toStart):如果 toStart=true 則設(shè)置 end=start,否則設(shè)置 start=end,從而折疊范圍。
          4. compareBoundaryPoints(how, sourceRange):兩個范圍邊界點進行比較,返回一個數(shù)字 -1、0、1。
          5. comparePoint(referenceNode, offset):返回-1、0、1具體取決于 是 referenceNode 在 之前、相同還是之后。
          6. createContextualFragment(tagString):返回一個 DocumentFragment。
          7. deleteContents():刪除框選的內(nèi)容。
          8. extractContents():從文檔中刪除范圍內(nèi)容,并將刪除的內(nèi)容作為 DocumentFragment 返回。
          9. getBoundingClientRect():和 dom 一樣,返回 DOMRect 對象。
          10. getClientRects():返回可迭代的對象序列 DOMRect。
          11. insertNode(node):在范圍的起始處將 node 插入文檔。
          12. intersectsNode(referenceNode):判斷與給定的 node 是否相交。
          13. selectNode(node):設(shè)置范圍以選擇整個 node。
          14. selectNodeContents(node):設(shè)置范圍以選擇整個 node 的內(nèi)容。
          15. setStart(startNode, startOffset):設(shè)置起點。
          16. setEnd(endNode, endOffset):設(shè)置終點。
          17. setStartBefore(node):將起點設(shè)置在 node 前面。
          18. setStartAfter(node):將起點設(shè)置在 node 后面。
          19. setEndBefore(node):將終點設(shè)置為 node 前面。
          20. setEndAfter(node):將終點設(shè)置為 node 后面。
          21. surroundContents(node):使用 node 將所選范圍內(nèi)容包裹起來。

          3.4. 創(chuàng)建 Range 的方法

          3.4.1. Document.createRange

          const range=document.createRange();

          3.4.2. Selection 的 getRangeAt() 方法

          const range=window.getSelection().getRangeAt(0)

          3.4.3. caretRangeFromPoint() 方法

          if (document.caretRangeFromPoint) {
              range=document.caretRangeFromPoint(e.clientX, e.clientY);
          }

          3.4.4. Range() 構(gòu)造函數(shù)

          const range=new Range()

          3.5. Range 兼容性


          4、Selection

          Selection 對象表示用戶選擇的文本范圍或插入符號的當(dāng)前位置。它代表頁面中的文本選區(qū),可能橫跨多個元素。

          4.1. 獲取文本對象

          window.getSelection()



          4.2. Selection 術(shù)語

          4.2.1. 錨點 (anchor)

          錨指的是一個選區(qū)的起始點(不同于 HTML 中的錨點鏈接)。當(dāng)我們使用鼠標框選一個區(qū)域的時候,錨點就是我們鼠標按下瞬間的那個點。在用戶拖動鼠標時,錨點是不會變的。

          4.2.2. 焦點 (focus)

          選區(qū)的焦點是該選區(qū)的終點,當(dāng)你用鼠標框選一個選區(qū)的時候,焦點是你的鼠標松開瞬間所記錄的那個點。隨著用戶拖動鼠標,焦點的位置會隨著改變。

          4.2.3. 范圍 (range)

          范圍指的是文檔中連續(xù)的一部分。一個范圍包括整個節(jié)點,也可以包含節(jié)點的一部分,例如文本節(jié)點的一部分。用戶通常下只能選擇一個范圍,但是有的時候用戶也有可能選擇多個范圍。

          4.2.4. 可編輯元素 (editing host)

          一個用戶可編輯的元素(例如一個使用 contenteditable 的 HTML 元素,或是在啟用了 designMode 的 Document 的子元素)。

          4.3. Selection 的屬性

          首先要清楚,選擇的起點稱為錨點(anchor),終點稱為焦點(focus)。

          1. anchorNode:選擇的起始節(jié)點。
          2. anchorOffset:選擇開始的 anchorNode 中的偏移量。
          3. focusNode:選擇的結(jié)束節(jié)點。
          4. focusOffset:選擇開始處 focusNode 的偏移量。
          5. isCollapsed:如果未選擇任何內(nèi)容(空范圍)或不存在,則為 true。
          6. rangeCount:選擇中的范圍數(shù),之前說過,除 Firefox 外,其他瀏覽器最多為1。
          7. type:類型:None、Caret、Range

          4.4. Selection 方法

          1. addRange(range): 將一個 Range 對象添加到當(dāng)前選區(qū)。
          2. collapse(node, offset): 將選區(qū)折疊到指定的節(jié)點和偏移位置。
          3. collapseToEnd(): 將選區(qū)折疊到當(dāng)前選區(qū)的末尾。
          4. collapseToStart(): 將選區(qū)折疊到當(dāng)前選區(qū)的起始位置。
          5. containsNode(node, partlyContained): 判斷選區(qū)是否包含指定的節(jié)點,可以選擇是否部分包含。
          6. deleteFromDocument(): 從文檔中刪除選區(qū)內(nèi)容。
          7. empty(): 從選區(qū)中移除所有范圍(同 `removeAllRanges()``,已廢棄)。
          8. extend(node, offset): 將選區(qū)的焦點節(jié)點擴展到指定的節(jié)點和偏移位置。
          9. getRangeAt(index): 返回選區(qū)中指定索引處的 Range 對象。
          10. removeAllRanges(): 移除所有選區(qū)中的范圍。
          11. removeRange(range): 從選區(qū)中移除指定的 Range 對象。
          12. selectAllChildren(node): 選中指定節(jié)點的所有子節(jié)點。
          13. setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset): 設(shè)置選區(qū)的起始和結(jié)束節(jié)點及偏移位置。
          14. setPosition(node, offset):collapse 的別名

          4.5. Selection 兼容性


          三、項目實現(xiàn)

          1、實現(xiàn)思路

          1. 先獲取選擇的內(nèi)容,開發(fā) getSelectContent 函數(shù)
          2. 對獲取的內(nèi)容進行判斷,是否存在 selection 實例,沒有直接返回 null
          3. 判斷 selection 實例的 isCollapsed 屬性 沒有選中,對 selection 進行 toString().trim() 操作,判斷內(nèi)容 有內(nèi)容,直接返回 text 類型 無內(nèi)容,返回 null 有選中,則判斷內(nèi)容
          4. 判斷選中的內(nèi)容有沒有節(jié)點 沒有節(jié)點,則和沒有選中一樣處理,進行 toString().trim() 操作,判斷內(nèi)容 有內(nèi)容,直接返回 text 類型 無內(nèi)容,返回 null 有節(jié)點,進行 toString().trim() 操作,判斷內(nèi)容 沒有內(nèi)容,判斷是否有特殊節(jié)點 有 'iframe', 'svg', 'img', 'audio', 'video' 節(jié)點,返回 html 類型 有 'input', 'textarea', 'select',判斷 value 值,是否存在 存在:返回 html 類型 不存在:返回 null 沒有特殊節(jié)點,返回 null 有內(nèi)容,返回 html 類型
          5. 對鼠標 mousedown、mouseup 事件和 selectionchange、contextmenu、dblclick 事件進行監(jiān)聽,觸發(fā) getSelectContent 函數(shù)
          6. 在需要的地方進行 debounce 防抖處理

          2、簡易流程圖


          2、Debounce 方法實現(xiàn)

          2.1. JS

          function debounce (fn, time=500) {
            let timeout=null; // 創(chuàng)建一個標記用來存放定時器的返回值
            return function () {
              clearTimeout(timeout) // 每當(dāng)觸發(fā)時,把前一個 定時器 clear 掉
              timeout=setTimeout(()=> { // 創(chuàng)建一個新的 定時器,并賦值給 timeout
                fn.apply(this, arguments)
              }, time)
            }
          }

          2.2. TS

          /**
           * debounce 函數(shù)類型
           */
          type DebouncedFunction<F extends (...args: any[])=> any>=(...args: Parameters<F>)=> void
          /**
           * debounce 防抖函數(shù)
           * @param {Function} func 函數(shù)
           * @param {number} wait 等待時間
           * @param {false} immediate 是否立即執(zhí)行
           * @returns {DebouncedFunction}
           */
          function debounce<F extends (...args: any[])=> any>(
            func: F,
            wait=500,
            immediate=false
          ): DebouncedFunction<F> {
            let timeout: ReturnType<typeof setTimeout> | null
            return function (this: ThisParameterType<F>, ...args: Parameters<F>) {
              // eslint-disable-next-line @typescript-eslint/no-this-alias
              const context=this
              const later=function () {
                timeout=null
                if (!immediate) {
                  func.apply(context, args)
                }
              }
              const callNow=immediate && !timeout
              if (timeout) {
                clearTimeout(timeout)
              }
              timeout=setTimeout(later, wait)
              if (callNow) {
                func.apply(context, args)
              }
            }
          }

          3、獲取選擇的文本/html 元素

          3.1. 獲取文本/html 元素

          nterface IGetSelectContentProps {
            type: 'html' | 'text'
            content: string
          }
          /**
           * 獲取選擇的內(nèi)容
           * @returns {null | IGetSelectContentProps} 返回選擇的內(nèi)容
           */
          const getSelectContent=(): null | IGetSelectContentProps=> {
            const selection=window.getSelection()
            if (selection) {
              // 1. 是焦點在 input 輸入框
              // 2. 沒有選中
              // 3. 選擇的是輸入框
              if (selection.isCollapsed) {
                return selection.toString().trim().length
                  ? {
                      type: 'text',
                      content: selection.toString().trim()
                    }
                  : null
              }
              // 獲取選擇范圍
              const range=selection.getRangeAt(0)
              // 獲取選擇內(nèi)容
              const rangeClone=range.cloneContents()
              // 判斷選擇內(nèi)容里面有沒有節(jié)點
              if (rangeClone.childElementCount > 0) {
                // 創(chuàng)建 div 標簽
                const container=document.createElement('div')
                // div 標簽 append 復(fù)制節(jié)點
                container.appendChild(rangeClone)
                // 如果復(fù)制的內(nèi)容長度為 0
                if (!selection.toString().trim().length) {
                  // 判斷是否有選擇特殊節(jié)點
                  const isSpNode=hasSpNode(container)
                  return isSpNode
                    ? {
                        type: 'html',
                        content: container.innerHTML
                      }
                    : null
                }
                return {
                  type: 'html',
                  content: container.innerHTML
                }
              } else {
                return selection.toString().trim().length
                  ? {
                      type: 'text',
                      content: selection.toString().trim()
                    }
                  : null
              }
            } else {
              return null
            }
          }
          /**
           * 判斷是否包含特殊元素
           * @param {Element} parent 父元素
           * @returns {boolean} 是否包含特殊元素
           */
          const hasSpNode=(parent: Element): boolean=> {
            const nodeNameList=['iframe', 'svg', 'img', 'audio', 'video']
            const inpList=['input', 'textarea', 'select']
            return Array.from(parent.children).some((node)=> {
              if (nodeNameList.includes(node.nodeName.toLocaleLowerCase())) return true
              if (
                inpList.includes(node.nodeName.toLocaleLowerCase()) &&
                (node as HTMLInputElement).value.trim().length
              )
                return true
              if (node.children) {
                return hasSpNode(node)
              }
              return false
            })
          }

          3.2. 只需要文本

          /**
           * 獲取框選的文案內(nèi)容
           * @returns {string} 返回框選的內(nèi)容
           */
          const getSelectTextContent=(): string=> {
            const selection=window.getSelection()
            return selection?.toString().trim() || ''
          }

          4、添加事件監(jiān)聽

          // 是否時鼠標點擊動作
          let selectionchangeMouseTrack: boolean=false
          const selectionChangeFun=debounce(()=> {
            const selectContent=getSelectContent()
            console.log('selectContent', selectContent)
            // todo... 處理上報
            selectionchangeMouseTrack=false
          })
          // 添加 mousedown 監(jiān)聽事件
          document.addEventListener('mousedown', ()=> {
            selectionchangeMouseTrack=true
          })
          // 添加 mouseup 監(jiān)聽事件
          document.addEventListener(
            'mouseup',
            debounce(()=> {
              selectionChangeFun()
            }, 100)
          )
          // 添加 selectionchange 監(jiān)聽事件
          document.addEventListener(
            'selectionchange',
            debounce(()=> {
              if (selectionchangeMouseTrack) return
              selectionChangeFun()
            })
          )
          // 添加 dblclick 監(jiān)聽事件
          document.addEventListener('dblclick', ()=> {
            selectionChangeFun()
          })
          // 添加 contextmenu 監(jiān)聽事件
          document.addEventListener(
            'contextmenu',
            debounce(()=> {
              selectionChangeFun()
            })
          )

          也可以進行封裝

          /**
           * addEventlistener function 類型
           */
          export interface IEventHandlerProps {
            [eventName: string]: EventListenerOrEventListenerObject
          }
          
          let selectionchangeMouseTrack: boolean=false
          const eventHandlers: IEventHandlerProps={
            // 鼠標 down 事件
            mousedown: ()=> {
              selectionchangeMouseTrack=true
            },
            // 鼠標 up 事件
            mouseup: debounce(()=> selectionChangeFun(), 100),
            // 選擇事件
            selectionchange:  debounce(()=> {
              if (selectionchangeMouseTrack) return
              selectionChangeFun()
            }),
            // 雙擊事件
            dblclick: ()=> selectionChangeFun(),
            // 右鍵事件
            contextmenu: debounce(()=> selectionChangeFun())
          }
          Object.keys(eventHandlers).forEach((event)=> {
            document.addEventListener(event, eventHandlers[event])
          })

          5、返回內(nèi)容

          5.1. 純文本內(nèi)容


          5.2. html 格式


          6. 完整 JS 代碼

          function debounce (fn, time=500) {
            let timeout=null; // 創(chuàng)建一個標記用來存放定時器的返回值
            return function () {
              clearTimeout(timeout) // 每當(dāng)觸發(fā)時,把前一個 定時器 clear 掉
              timeout=setTimeout(()=> { // 創(chuàng)建一個新的 定時器,并賦值給 timeout
                fn.apply(this, arguments)
              }, time)
            }
          }
          
          let selectionchangeMouseTrack=false
          document.addEventListener('mousedown', (e)=> {
            selectionchangeMouseTrack=true
            console.log('mousedown', e)
          })
          document.addEventListener('mouseup', debounce((e)=> {
            console.log('mouseup', e)
            selectionChangeFun()
          }, 100))
          document.addEventListener('selectionchange', debounce((e)=> {
            console.log('selectionchange', e)
            if (selectionchangeMouseTrack) return
            selectionChangeFun()
          }))
          document.addEventListener('dblclick', (e)=> {
            console.log('dblclick', e)
            selectionChangeFun()
          })
          document.addEventListener('contextmenu',debounce(()=> {
            selectionChangeFun()
          }))
          
          const selectionChangeFun=debounce(()=> {
            const selectContent=getSelectContent()
            selectionchangeMouseTrack=false
            console.log('selectContent', selectContent)
          })
          
          const getSelectContent=()=> {
            const selection=window.getSelection();
            if (selection) {
              // 1. 是焦點在 input 輸入框
              // 2. 沒有選中
              // 3. 選擇的是輸入框
              if (selection.isCollapsed) {
                return selection.toString().trim().length ? {
                  type: 'text',
                  content: selection.toString().trim()
                } : null
              }
              // 獲取選擇范圍
              const range=selection.getRangeAt(0);
              // 獲取選擇內(nèi)容
              const rangeClone=range.cloneContents()
              // 判斷選擇內(nèi)容里面有沒有節(jié)點
              if (rangeClone.childElementCount > 0) {
                const container=document.createElement('div');
                container.appendChild(rangeClone);
                if (!selection.toString().trim().length) {
                  const hasSpNode=getSpNode(container)
                  return hasSpNode ? {
                    type: 'html',
                    content: container.innerHTML
                  } : null
                }
                return {
                  type: 'html',
                  content: container.innerHTML
                }
              } else {
                return selection.toString().trim().length ? {
                  type: 'text',
                  content: selection.toString().trim()
                } : null
              }
            } else {
              return null
            }
          }
          
          const getSpNode=(parent)=> {
            const nodeNameList=['iframe', 'svg', 'img', 'audio', 'video']
            const inpList=['input', 'textarea', 'select']
            return Array.from(parent.children).some((node)=> {
              if (nodeNameList.includes(node.nodeName.toLocaleLowerCase())) return true
              if (inpList.includes(node.nodeName.toLocaleLowerCase()) && node.value.trim().length) return true
              if (node.children) {
                return getSpNode(node)
              }
              return false
            })
          }

          四、總結(jié)

          1. 鼠標框選上報能監(jiān)控用戶在頁面的行為,能為后續(xù)的數(shù)據(jù)分析等提供便利
          2. 基于 JS 中的 Selection 和 Range 實現(xiàn)的,使用原生 JS
          3. 涉及到的操作比較多,包含鍵盤、鼠標右鍵、全選等
          4. 能對框選的內(nèi)容進行分類,區(qū)別 html 和 text,更方便的看出用戶選擇了哪些內(nèi)容

          主站蜘蛛池模板: 日本一区二区三区不卡视频中文字幕| 成人乱码一区二区三区av| 精品欧美一区二区在线观看| 国产一区二区草草影院| 国产SUV精品一区二区88L| 国产AⅤ精品一区二区三区久久| 国产一区二区在线视频| 国产日韩精品一区二区在线观看 | 国产色情一区二区三区在线播放| 麻豆一区二区在我观看| 亚洲中文字幕丝袜制服一区| 国产香蕉一区二区三区在线视频| 中文字幕亚洲乱码熟女一区二区 | 精品人妻一区二区三区四区| 青青青国产精品一区二区| 中文字幕在线观看一区| 色国产在线视频一区| 97人妻无码一区二区精品免费| 国产亚洲一区二区三区在线观看| 国产成人无码精品一区不卡| 呦系列视频一区二区三区| 无码精品人妻一区二区三区中 | 综合久久久久久中文字幕亚洲国产国产综合一区首 | 中文乱码人妻系列一区二区| 国产午夜精品免费一区二区三区| 国产伦精品一区二区三区视频小说 | 国语精品一区二区三区| 日韩有码一区二区| 一本大道东京热无码一区| 精品国产一区二区三区在线观看 | 色狠狠一区二区三区香蕉蜜桃| 人妻无码一区二区视频| 久夜色精品国产一区二区三区| 福利一区福利二区| 免费萌白酱国产一区二区三区| 国产高清视频一区三区| 亚洲sm另类一区二区三区| 国产乱码精品一区二区三区四川人| AV无码精品一区二区三区| 精品日韩一区二区| 中文字幕无码一区二区免费|