主頁 > 前端設計 > 函式this三種指向、函式呼叫背景關系模式、遞回、閉包

函式this三種指向、函式呼叫背景關系模式、遞回、閉包

2021-12-28 08:15:02 前端設計

函式的三種呼叫方式(this指向)

函式三種呼叫方式:普通函式 物件方法 建構式

重點:理解this關鍵字的作用:誰呼叫這個函式,this就指向誰

無法修改this指向的三種:

1.普通函式呼叫:this指向的就是window

2.物件方法呼叫:this指向的就是這個物件

3.建構式呼叫:this指向的就是new關鍵字創造的物件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
       /* 
        函式三種執行模式 : 全域函式 、 物件方法 、 建構式
            this : 誰 `呼叫` 我,我就指向誰
            1. 全域函式 : this指向window
            2. 物件方法 : this指向物件
            3. 建構式 : this指向new創建的空物件
         */
         // this環境物件:誰呼叫我,我就指向誰

        // 普通函式呼叫   this指向的就是window
        function fn() {
            console.log(this);
        }
        fn()

        // 物件方法呼叫:物件名.方法名()   this指向就是這個物件
        let obj = {
            name: '陳爽',
            age: 19,
            saiHia: function () {
                console.log(this);
            }
        }
        obj.saiHia()

        // 建構式呼叫:new  函式名()   this指向new 創建的實體物件
        function Fn() {
            console.log(this);
        }
        let s = new Fn()
    </script>
</body>

</html>

函式呼叫的背景關系模式(可以修改函式中this指向)

函式背景關系的三個方法:call() 、 apply() 、 bind() ,他們定義在Function建構式中

函式執行背景關系模

作用可以修改this指向

異同點:都可以修改函式中的this指向

不同點:傳參方式不同

call:函式名.call(this修改后的指向,引數1,引數2....)

適用于只有一個引數的函式

應用場景:偽陣列排序、檢測資料型別

   // call可以修改this指向
        // 語法:函式名.call(修改的this,引數1,引數2)
        function fn(a, b) {
            console.log(this);
            console.log(a + b);
        }
        fn.call({ name: '張子沁' }, 30, 20)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>


        // 檢測資料型別固定格式語法:object.prototype.toString.call(資料)
        console.log(Object.prototype.toString.call('123'));
        console.log(Object.prototype.toString.call(12312));
        console.log(Object.prototype.toString.call(true));
        console.log(Object.prototype.toString.call(undefined));
        console.log(Object.prototype.toString.call(null));
        console.log(Object.prototype.toString.call([10, 20, 30]));
        console.log(Object.prototype.toString.call(function () { }));
        console.log(Object.prototype.toString.call({ name: '張三' }));
    </script>
</body>

</html>

apply() :函式名:apply(this修改后的指向,偽陣列/陣列)

適用于多個傳參的函式

應用場景:偽數轉真陣列、求陣列最大值

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // apply背景關系呼叫:修改this指向   傳參不同
        // 語法:函式名.apply(修改的this指向,陣列/偽陣列)
        function fn(a, b, c) {
            console.log(this);
            console.log(a * b + c);
        }
        fn.apply({ name: '陳爽' }, [30, 50, 50])
    </script>
</body>

</html>

偽陣列轉真陣列

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>

        let obj = {
            0: 20,
            1: 30,
            2: 40,
            3: 90,
            4: 100,
            length: 5
        }
        // console.log(obj);

        // 將偽陣列轉為真陣列
        // ES6語法
        // let arr = Array.from(obj)
        // console.log(arr);


        // ES5語法
        // 創建一個空陣列
        let Array = []
        // 函式名.apply(修改的this,陣列/偽陣列)
        // 第一個引數:不用修改this,因為this本來就指向Array
        // 第二個引數:obj,借助apply特點:自動遍歷了偽陣列,逐一傳參
        Array.push.apply(Array, obj)
        console.log(Array);
    </script>
</body>

</html>

求陣列最大值

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        let arr = [20, 40, 90, 10, 32, 90]

        // 排序法 // 最大值
        // arr.sort(function (a, b) {
        //     return b - a
        // })
        // console.log(arr[0]);

        // ES5語法
        // 第一個引數:Math,因為他this指向本身就Math,這里不用修改this指向,相當于不變
        // 第二個引數:arr,借助apply的特點,自動遍歷陣列里的元素,然后逐一傳參,求出最大值賦值給max
        let max = Math.max.apply(Math, arr)
        console.log(max);

        
        // ES6語法
        let max3 = Math.max(...arr)
        console.log(max3);
    </script>
</body>

</html>

bind()語法:函式名.bind(this修改后的指向,引數1,殘數2)

bind()語法并不會立即執行函式,而是回傳一個修改指向后的新函式,常用于回呼函式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        /* 
        1.函式三種執行方式 : 
            全域函式 : this指向window
            物件方法:  this指向物件
            建構式 : this指向new創建的物件
                共同的特點: this的指向無法動態修改

        2.函式背景關系模式 : 
            2.1 作用: 可以動態修改函式中的this
            2.2 語法: 有3種寫法,作用都是一樣改this,應用場景不同
                a. 函式名.call(修改的this,arg1,arg2…………) 
                    * 適用于函式原本形參 <= 1
                b. 函式名.apply(修改的this,[陣列或偽陣列])
                    * 適用于函式原本形參 >= 2
                c. 函式名.bind(修改的this,arg1,arg2…………)
                    * 特點:不會立即執行這個函式,而是回傳修改this后的新函式
                    * 適用于不會立即執行的函式 : 事件處理函式,定時器函式

         */

        // function fn(){
        //     //三種執行模式this無法動態修改
        //     //this = {age:18};

        //     console.log(this);
            
        // };

        // fn();//this:window
        
        /* 背景關系模式 */
        function fn(a,b){
            console.log(this);
            console.log(a+b);
        };

        //a. 函式名.call(修改的this,arg1,arg2…………) 
        //應用場景: 適用于函式原本形參 <= 1
        fn(10,20);//this:window
        fn.call({age:18},100,200);
        
        //b. 函式名.apply(修改的this,[陣列或偽陣列])
        //應用場景: 適用于函式原本形參 >=2
        fn.apply({age:88},[20,30]);

        //c. 函式名.bind(修改的this,arg1,arg2…………)
        //特點:這個函式不會立即執行,而是回傳一個修改this之后的新函式
        //應用場景 : 事件處理函式,定時器
        let newFn =  fn.bind({name:'坤坤'});
        newFn(50,60);


        //4. 定時器中的this一定是指向window

        // 定時器:一段代碼間隔事件執行 setTimeout(一段代碼,間隔時間)

        //4.1 具名函式
        let test = function(){
            console.log('我是具名函式');
            console.log(this);    
        };

        let newTest = test.bind({name:'張三'})

        setTimeout(newTest,3000);

        //4.2 匿名函式
        setTimeout(function(){
            console.log('我是定時器中的函式');
            console.log(this);
        }.bind({name:'李四'}),2000);
    </script>
</body>
</html>


    //2.3 bind();
    //語法:  函式名.bind(this修改后的指向,arg1,arg2....);
    let obj = {
        name:"文聰兄"
    };

    function getSum(a,b){
        console.log(this);
        console.log(a+b);
    }

    getSum(10,20);//this指向window
    let fn = getSum.bind(obj); //bind()不會執行這個函式,而是會回傳一個修改了this的函式.
    fn(100,200); //此時這個fn,就相當于是修改了this之后的getSum.


    //3 回呼函式(例如定時器),一般使用bind來修改this指向
       let obj = {
         name:"班長"
       };
        //3.1  定時器的回呼函式是一個具名函式
       function test1(){
         console.log(this);
       }
       let test2 = test1.bind(obj);
       setInterval(test2,2000);
       //3.2 定時器的回呼函式是一個匿名函式
       setInterval(function () {
           console.log ( this );
       }.bind(obj),2000);

遞回

遞回函式介紹

1.遞回函式:一個函式自己呼叫自己

2.遞回函式特點:

一定要有結束條件,否則會導致死回圈

能夠用遞回函式實作的需求,就一定可以用回圈呼叫函式來解決,只是代碼簡潔與性能不同而已

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        /* 
        1. 遞回函式 : 在函式中自己呼叫自己

        2. 遞回特點
            a. 能用遞回實作的功能一定可以用回圈,只是語法不同
            b. 遞回一定要有結束的條件,否則會導致死回圈
         */

        //一個函式遞回
        // function fn(){
        //     console.log('哈哈');
        //     fn();
            
        // };

        // fn();

        //兩個函式遞回
        // function fn1(){
        //     console.log('哈哈');
        //     fn2();
            
        // };

        // function fn2(){
        //     console.log('呵呵');
        //     fn1();
            
        // };
        // fn2();


        //需求:寫一個函式,列印三次 我愛坤哥

        let i = 1;
        function fn(){
            console.log('我愛坤哥');
            i++;
            if(i <= 3){
                fn();
            };
            
            //回圈實作
            // for(let i = 1;i<=3;i++){
            //     console.log('我愛坤哥');
                
            // };
        };

        fn();
    </script>
</body>
</html>

遞回應有場景:淺拷貝與深拷貝

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /*淺拷貝與深拷貝概念主要針對于物件這種資料型別 
        
        1.淺拷貝: 拷貝的是地址
            * 特點:修改拷貝后的資料,原資料也會隨之修改
        2.深拷貝:拷貝的是資料
            * 特點:修改拷貝后的資料,對原資料沒有影響
         */

      let obj = {
        name: 'ikun',
        age: 32,
        hobby: ['講課', '敲代碼', '黑馬程式員'],
        class: {
          name: '武漢大前端',
          salary: [18888, 12000, 10000]
        }
      }

      //1.淺拷貝: 拷貝的是地址
      let obj1 = obj
      obj1.name = '黑馬李宗盛'
      console.log(obj, obj1)

      //2.深拷貝:拷貝的是資料
      //核心原理:使用遞回, 只要遇到屬性值是參考型別,則遍歷,

      function kaobei (newObj, obj) {
        // 遍歷
        for (let key in obj) {
          if (obj[key] instanceof Array) {
            // obj[key] 是陣列
            // obj[key]是陣列
            newObj[key] = []

            kaobei(newObj[key], obj[key])
          } else if (obj[key] instanceof Object) {
            // obj[key] 是物件
            // obj[key]再遍歷拷貝
            newObj[key] = {}

            kaobei(newObj[key], obj[key])
          } else {
            newObj[key] = obj[key]
          }
        }
      }

      let obj2 = {}
      //深拷貝
      kaobei(obj2, obj)
      //修改拷貝后的資料
      obj2.name = '黑馬顏值擔當'
      obj2.hobby = '唱歌'
      console.log(obj,obj2)
    </script>
  </body>
</html>

遞回應用場景:遍歷dom樹

  • 在我們后期vue專案中,有一個這樣的案例:服務器回傳一個不確定的資料結構, 是一個多級選單,這個資料是不確定的,我們需要根據服務器回傳的資料,來生成對應的頁面結構

    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <meta http-equiv="X-UA-Compatible" content="ie=edge" />
        <title>Document</title>
        <style>
          * {
            padding: 0;
            margin: 0;
          }
    
          .menu p {
            width: 100px;
            border: 3px solid;
            margin: 5px;
          }
    
          .menu > div p {
            margin-left: 10px;
            border-color: red;
          }
    
          .menu > div > div p {
            margin-left: 20px;
            border-color: green;
          }
    
          .menu > div > div > div p {
            margin-left: 30px;
            border-color: yellow;
          }
        </style>
      </head>
      <body>
        <div class="menu">
          <!-- <div>
            <p>第一級選單</p>
            <div>
              <p>第二級選單</p>
              <div>
                <p>第三級選單</p>
              </div>
            </div>
          </div> -->
        </div>
        <script>
          //服務器回傳一個不確定的資料結構,涉及到多重陣列嵌套
          let arr = [
            {
              type: '電子產品',
              data: [
                {
                  type: '手機',
                  data: ['iPhone手機', '小米手機', '華為手機']
                },
                {
                  type: '平板',
                  data: ['iPad', '平板小米', '平板華為']
                },
                {
                  type: '智能手表',
                  data: []
                }
              ]
            },
            {
              type: '生活家居',
              data: [
                {
                  type: '沙發',
                  data: ['真皮沙發', '布沙發']
                },
                {
                  type: '椅子',
                  data: ['餐椅', '電腦椅', '辦公椅', '休閑椅']
                },
                {
                  type: '桌子',
                  data: ['辦公桌']
                }
              ]
            },
            {
              type: '零食',
              data: [
                {
                  type: '水果',
                  data: []
                },
                {
                  type: '咖啡',
                  data: ['雀巢咖啡']
                }
              ]
            }
          ]
    
          /* 使用遞回遍歷陣列 */
          function addElement (arr, father) {
            for (let i = 0; i < arr.length; i++) {
              let div = document.createElement('div')
              div.innerHTML = `<p>${arr[i].type || arr[i] }</p>`
              father.appendChild(div)
              if( arr[i].data ){
                addElement(arr[i].data,div)
              }
            }
          }
    
          //呼叫遞回函式
          addElement(arr,document.querySelector('.menu'))
        </script>
      </body>
    </html>
    

    閉包

1.閉包:是一個可以訪問其他函式變數的函式

2.閉包作用:解決變數污染問題,讓變數被函式保護起來

function fn(){
    let a = 1
    function fn1() {
        console.log(a)
    }
    fn1()
}

執行函式 fn1 用到了另一個函式fn中的 a 這個變數,所以 fn1 + a 構成了閉包,

閉包的案例

  1. 案例需求:在輸入框輸入搜索文字,點擊百度一下按鈕,用定時器模擬網路請求,1 秒之后顯示搜索結果;

結構如下:

<div class="box">
  <input type="search" name="" id="">
  <button>百度一下</button>
</div>

代碼如下:

// 1. 獲取元素
let search = document.querySelector('.box input')
let btn = document.querySelector('.box button')

// 2. 添加點擊事件
btn.onclick = function () {
  // 獲取搜索的文字
  let text = search.value

  // 模擬發送網路請求
  setTimeout(function () {
    alert(`您搜索的內容是 ${text} 共搜索到 12345 條結果`)
  }, 1000)
}

學習重點梳理(高頻面試題)

this三種指向

this:誰呼叫我,我就指向誰

1.全域函式:this指向window

2.物件方法:this指向物件

3.建構式:this指向new創建的空物件

call、apply、bind三者區別

相同點:都是修改函式this指向

不同點:

傳參方式不同:call用于單個引數,apply用于多個引數(陣列/偽陣列)

執行機制不同:call與apply會立即執行,bind不會立即執行

call、apply用一次修改一次

bind:依次修改,終生有效

閉包

什么是閉包:以下兩種回答都可以

閉包是一個訪問其他函式內部變數的函式

閉包是函式+背景關系代碼組合

閉包作用:解決變數污染

遞回

什么是遞回:函式內部呼叫自己

遞回場景

深拷貝

遍歷dom樹

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/395140.html

標籤:其他

上一篇:JS--閉包--作用/用途/原理

下一篇:【JavaScript 】JavaScript 初識,樹欲千尺,唯有根深。

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more