主頁 > 前端設計 > 14_從零構建微信小程式專案_資料互動_json-server詳解

14_從零構建微信小程式專案_資料互動_json-server詳解

2021-10-02 09:59:18 前端設計

一、Node環境搭建

Node.js 簡介

Node.js 是一個開源與跨平臺的 JavaScript 運行時環境, 它是一個可用于幾乎任何專案的流行工具!

Node.js 在瀏覽器外運行 V8 JavaScript 引擎(Google Chrome 的內核), 這使 Node.js 表現得非常出色,

Node.js 應用程式運行于單個行程中,無需為每個請求創建新的執行緒, Node.js 在其標準庫中提供了一組異步的 I/O 原生功能(用以防止 JavaScript 代碼被阻塞),并且 Node.js 中的庫通常是使用非阻塞的范式撰寫的,

當 Node.js 執行 I/O 操作時(例如從網路讀取、訪問資料庫或檔案系統),Node.js 會在回應回傳時恢復操作,而不是阻塞執行緒并浪費 CPU 回圈等待,

這使 Node.js 可以在一臺服務器上處理數千個并發連接,而無需引入管理執行緒并發的負擔(這可能是重大 bug 的來源),

Node.js 具有獨特的優勢,因為為瀏覽器撰寫 JavaScript 的數百萬前端開發者現在除了客戶端代碼之外還可以撰寫服務器端代碼,而無需學習完全不同的語言,

在 Node.js 中,可以毫無問題地使用新的 ECMAScript 標準,因為不必等待所有用戶更新其瀏覽器,你可以通過更改 Node.js 版本來決定要使用的 ECMAScript 版本,并且還可以通過運行帶有標志的 Node.js 來啟用特定的實驗中的特性,言,發布于2009年5月,由Ryan Dahl開發,實質是對Chrome V8引擎進行了封裝,

Chrome V8引擎簡介

隨著Web相關技術的發展,JavaScript所要承擔的作業也越來越多,早就超越了“表單驗證”的范疇,這就更需要快速的決議和執行JavaScript腳本,

V8引擎就是為解決這一問題而生,在node中也是采用該引擎來決議JavaScript,V8是如何使得JavaScript性能有大幅提升的呢?

更多介紹:Chrome V8引擎介紹

Node.js環境搭建

Nodejs最新下載地址: 下載 | Node.js 中文網

下載

根據自己電腦系統及位數選擇,我這里選擇windows64位.msi格式安裝包

.msi和.zip格式區別:

1、.msi是Windows installer開發出來的程式安裝檔案,它可以讓你安裝,修改,卸載你所安裝的程式,說白了.msi就是Windows installer的資料包,把所有和安裝檔案相關的內容封裝在一個包里,

2、.zip是一個壓縮包,解壓之后即可,不需要安裝

安裝

下載完成后,雙擊安裝包,開始安裝,一直點next即可,安裝路徑默認在C:\Program Files下,也可以自定義修改,

Node.js runtime 表示運行環境

npm package manager表示npm包管理器

online documentation shortcuts 在線檔案快捷方式

Add to PATH添加到環境變數

驗證

安裝完成后,.msi格式的安裝包已經將node啟動程式添加到系統環境變數path中,查看系統變數驗證,

win7驗證:

win10驗證:

既然已經將node程式添加到全域系統變數,我們可以直接在CMD視窗中任意位置執行node,打開CMD視窗,執行命令node -v查看node版本,

最新版的node在安裝時同時也安裝了npm,執行npm -v查看npm版本,

npm簡介

npm全稱為Node Package Manager,是一個基于Node.js的包管理器,也是整個Node.js社區最流行、支持的第三方模塊最多的包管理器,

npm的初衷:JavaScript開發人員更容易分享和重用代碼,

npm的使用場景:

  • 允許用戶從NPM服務器下載別人撰寫的第三方包到本地使用,

  • 允許用戶從NPM服務器下載并安裝別人撰寫的命令列程式到本地使用,

  • 允許用戶將自己撰寫的包或命令列程式上傳到NPM服務器供別人使用,

如果你安裝的是舊版本的 npm,可以很容易得通過 npm 命令來升級,命令如下:

npm install npm -g

使用淘寶鏡像的命令:

npm install -g cnpm --registry=https://registry.npm.taobao.org

npm run是npm run-script的簡寫,顧名思義就是執行腳本,執行的腳本配置在package.json中的scripts物件,

二、json-server環境搭建

json-server概述

一個在前端本地運行,可以存盤json資料的server,

通俗來說,就是模擬服務端介面資料,一般用在前后端分離后,前端人員可以不依賴API開發,而在本地搭建一個JSON服務,自己產生測驗資料,

顧名思義,json-server就是個存盤json資料的server~?,

下載安裝

使用npm全域安裝json-server:

npm install -g json-server

可以通過查看版本號,來測驗是否安裝成功:

json-server -v

創建json資料——db.json

既然是造資料,就需要創建一個json資料,

在任意一個檔案夾下(此處假設我創建了一個myserver檔案夾),進入到該檔案夾里面,執行代碼:

json-server --watch db.json

原本空空如也的檔案夾里,就會多出一個db.json檔案,

同時,根據執行代碼結果的提示,我們可以訪問 http://localhost:3000 (啟動json-server后,點擊才有效),看到如下頁面:

可以分別點擊/posts /comment /profile /db鏈接,看看頁面跳轉后,觀察地址欄變化和頁面內容,你看到了什么?

沒錯,就是各自的json資料,

db.json里面自帶的資料:

{
  "posts": [
    {
      "id": 1,
      "title": "json-server",
      "author": "typicode"
    }
  ],
  "comments": [
    {
      "id": 1,
      "body": "some comment",
      "postId": 1
    }
  ],
  "profile": {
    "name": "typicode"
  }
}

再比對myserver/db.json檔案的資料,就可以發現: /db就是整個的db.json資料包,而/posts /comment /profile 分別是db.json里面的子物件,

所以說,json-server把db.json 根節點的每一個key,當作了一個router,我們可以根據這個規則來撰寫測驗資料,

修改埠號

json-server 默認是 3000 埠,我們也可以自己指定埠,指令如下:

json-server --watch db.json --port 3004

嗯,如果你很懶,覺得啟動服務的這段代碼有點長,還可以考慮db.json同級檔案夾(也就是myserver檔案夾)新建一個package.json,把配置資訊寫在里頭:

{
    "scripts": {
        "mock": "json-server db.json --port 3004"
    }
}

之后啟動服務,只需要執行如下指令就可以了:

npm run mock

json-server 的相關啟動引數

  • 語法:json-server [options] <source>

  • 選項串列:

三、操作資料

我們先自己倒騰下 db.json 資料,比如現在是個水果商城,放點 用戶資訊水果價格 資訊:

{
  "fruits": [
    {
      "id": 1,
      "name": "apple",
      "price": 33
    },
    {
      "id": 2,
      "name": "orange",
      "price": 8.88
    }
  ],
   "users": [
    {
      "name": {
        "username":"admin",
        "nickname":"zhangsan"
      },
      "pwd": "123456"
    }
  ]
}

要注意,資料格式符合JSON格式(尤其注意最后一個鍵值對后面不要有逗號),如果資料格式有誤,命令視窗會報錯,可以根據錯誤提示進行修整,

接下來我們就可以GET, POST, PUT, PATCH or DELETE 方法來對資料進行操作,

獲取資料

首先,我們先來看GET操作,

瀏覽器地址訪問就可以看做GET操作,所以不用寫任何代碼,我們就可以先來測驗下 url -GET 操作,

常規獲取

    http://localhost:3004/fruits

可以得到所有水果資料(物件陣列)

[
  {
    "id": 1,
    "name": "apple",
    "price": 33
  },
  {
    "id": 2,
    "name": "orange",
    "price": 8.88
  }
]

過濾獲取 Filter

根據id獲取資料

    http://localhost:3004/fruits/1

可以得到指定id為1的水果(物件):

{
  "id": 1,
  "name": "apple",
  "price": 33
}

當然,指定id為1的獲取指令還可以用如下指令,但要注意,此時回傳的資料是一個陣列

    http://localhost:3004/fruits?id=1
[
  {
    "id": 1,
    "name": "apple",
    "price": 33
  }
]

以此類推,我們也可以通過水果名稱,或者是價格來獲取資料:

    http://localhost:3004/fruits?name=orange
[
  {
    "id": 2,
    "name": "orange",
    "price": 8.88
  }
]

也可以指定多個條件,用&符號連接:

    http://localhost:3004/fruits?name=orange&price=8.88
[
  {
    "id": 2,
    "name": "orange",
    "price": 8.88
  }
]

你甚至還可以使用物件取屬性值 obj.key 的方式:

    http://localhost:3004/users?name.nickname=zhangsan
[
  {
    "name": {
      "username": "admin",
      "nickname": "zhangsan"
    },
    "pwd": "123456"
  }
]

以上看著是不是特別眼熟,不就是HTTP中GET請求方式嘛~

嗯,更好玩的還在后面,

分頁 Paginate

為了能演示分頁效果,我們在db.json檔案里的fruits里面多添加了幾種水果,

{
  "fruits": [
    {
      "id": 1,
      "name": "apple1",
      "price": 33
    },
    {
      "id": 2,
      "name": "apple2",
      "price": 2
    },
    {
      "id": 3,
      "name": "apple3",
      "price": 3
    },
    {
      "id": 4,
      "name": "apple4",
      "price": 4
    },
    {
      "id": 5,
      "name": "apple5",
      "price": 5
    },
    {
      "id": 6,
      "name": "orange",
      "price": 8.88
    }
  ],
   "users": [
    {
      "name": {
        "username":"admin",
        "nickname":"zhangsan"
      },
      "pwd": "123456"
    }
  ]
}

編輯過db.json(db.json資料有變動),都要關閉服務重新啟動,(注意:不要用 CTRL + C 來停止服務,因為這種方式會導致 node.js 依舊霸占著3004埠,導致下一次啟動失敗,簡單粗暴關閉視窗即可! —— 個人window系統,其他系統可能沒有這樣的煩惱,)

分頁采用 _page 來設定頁碼, _limit 來控制每頁顯示條數,如果沒有指定 _limit ,默認每頁顯示10條,

    http://localhost:3004/fruits?_page=2&_limit=2
[
  {
    "id": 3,
    "name": "apple3",
    "price": 3
  },
  {
    "id": 4,
    "name": "apple4",
    "price": 4
  }
]

排序 Sort

排序采用 _sort 來指定要排序的欄位, _order 來指定排序是正排序還是逆排序(asc | desc ,默認是asc),

    http://localhost:3004/fruits?_sort=id&_order=desc
[
  {
    "id": 6,
    "name": "orange",
    "price": 8.88
  },
  {
    "id": 5,
    "name": "apple5",
    "price": 5
  },
  {
    "id": 4,
    "name": "apple4",
    "price": 4
  },
  {
    "id": 3,
    "name": "apple3",
    "price": 3
  },
  {
    "id": 2,
    "name": "apple2",
    "price": 2
  },
  {
    "id": 1,
    "name": "apple1",
    "price": 33
  }
]

也可以指定多個欄位排序,一般是按照id進行排序后,相同id的再跟進name排序:

    http://localhost:3004/fruits?_sort=id,name&_order=desc,asc

取區域資料 Slice

slice的方式,和 Array.slice() 方法類似,采用 _start 來指定開始位置, _end 來指定結束位置、或者是用_limit來指定從開始位置起往后取幾個資料,

    http://localhost:3004/fruits?_start=2&_end=4
[
  {
    "id": 3,
    "name": "apple3",
    "price": 3
  },
  {
    "id": 4,
    "name": "apple4",
    "price": 4
  }
]
    http://localhost:3004/fruits?_start=2&_limit=4
[
  {
    "id": 3,
    "name": "apple3",
    "price": 3
  },
  {
    "id": 4,
    "name": "apple4",
    "price": 4
  },
  {
    "id": 5,
    "name": "apple5",
    "price": 5
  },
  {
    "id": 6,
    "name": "orange",
    "price": 8.88
  }
]

取符合某個范圍 Operators

(1)采用 _gte _lte 來設定一個取值范圍(range):

    http://localhost:3004/fruits?id_gte=4&id_lte=6
[
  {
    "id": 4,
    "name": "apple4",
    "price": 4
  },
  {
    "id": 5,
    "name": "apple5",
    "price": 5
  },
  {
    "id": 6,
    "name": "orange",
    "price": 8.88
  }
]

(2)采用_ne來設定不包含某個值:

    http://localhost:3004/fruits?id_ne=1
[
  {
    "id": 2,
    "name": "apple2",
    "price": 2
  },
  {
    "id": 3,
    "name": "apple3",
    "price": 3
  },
  {
    "id": 4,
    "name": "apple4",
    "price": 4
  },
  {
    "id": 5,
    "name": "apple5",
    "price": 5
  },
  {
    "id": 6,
    "name": "orange",
    "price": 8.88
  }
]

(3)采用_like來設定匹配某個字串(或正則運算式):

    http://localhost:3004/fruits?name_like=apple
[
  {
    "id": 2,
    "name": "apple2",
    "price": 2
  },
  {
    "id": 3,
    "name": "apple3",
    "price": 3
  },
  {
    "id": 4,
    "name": "apple4",
    "price": 4
  },
  {
    "id": 5,
    "name": "apple5",
    "price": 5
  }
]

全文搜索 Full-text search

采用 q 來設定搜索內容:

http://localhost:3004/fruits?q=oran
[
  {
    "id": 6,
    "name": "orange",
    "price": 8.88
  }
]

除了獲取資料,我們當然還希望能向操作sql一樣能更改資料、洗掉資料了,

所以這里,我們采用大部分人熟悉的 ajax 方法,來操作下回應的資料,

案例

獲取db.json中的所有水果資訊,以表格的方式展現出來,

<!DOCTYPE html>
<html>

<head>
  <title>使用jq ajax方法操作資料</title>
  <script type="text/javascript" src="js/jquery.js"></script>
  <style>
    table,
    td,
    th {
      border: 1px solid black;
      border-collapse: collapse;
    }

    table {
      width: 500px;
      text-align: center;
    }

    tr {
      height: 35px;
    }
  </style>
</head>

<body>
  <button id="getBtn">get</button>
  <div id="showData"></div>

  <script type="text/javascript">
    $("#getBtn").click(function () {
      $.ajax({
        type: 'get',
        url: 'http://localhost:3004/fruits',
        success: function (data) {
          // data 物件陣列
          var h = ""
          h += "<table border='1'>"
          h += "<thead><th>ID</th><th>name</th><th>price</th></thead>"
          h += "<tbody>"
          for (var i = 0; i < data.length; i++) {
            var o = data[i]
            h += "<tr>"
            h += "<td>" + o.id + "</td><td>" + o.name + "</td><td>" + o.price + "</td>"
            h += "</tr>"
          }
          h += "<tbody>"
          h += "</table>"
          $("#showData").empty().append(h)
        },
        error: function () {
          alert("get : error")
        }
      })
    })
  </script>
</body>

</html>

添加資料

POST 方法,常用來創建一個新資源,

案例:在頁面的輸入框中輸入新的水果名稱和價格,通過post添加到db.json中,

水果:<input id="fruitName" type="text" name="fruitName"><br>
價格:<input id="fruitPrice" type="text" name="fruitPrice"><br>
<button id="postBtn">add</button>
$("#postBtn").click(function () {
    $.ajax({
        type: 'post',
        url: 'http://localhost:3004/fruits',
        data: {
            name: $("#fruitName").val(),
            price: $("#fruitPrice").val()
        },
        success: function (data) {
            console.log("post success")
        },
        error: function () {
            alert("post error")
        }
    })
})

輸入 watermelon 6.88 水果后 add 添加新水果,再次點擊get按鈕重新獲取db.json資料,就可以看到新添加進去的資料,此時打開db.json檔案,也可以看到這條新添加的記錄,

注意:此時如果再次點擊 add 按鈕,重復添加watermelon 6.88 資料,會發現在get中存在多條 id 不一樣但 name & price 相同的重復資料,

更新資料

PUT 方法,常用來更新已有資源,若資源不存在,它也會進行創建,

案例:輸入水果對應id,修改其價格,

<p>更新水果價格</p>
水果id:<input id="putId" type="text" name="fruitId"><br>
價格:<input id="putPrice" type="text" name="fruitPrice"><br>
<button id="putBtn">put</button>
$("#putBtn").click(function () {
    $.ajax({
        type: 'put',
        url: 'http://localhost:3004/fruits/' + $("#putId").val(),
        data: {
            price: $("#putPrice").val()
        },
        success: function (data) {
            console.log("put success")
        },
        error: function () {
            alert("put error")
        }
    })
})

在案例中,我們輸入id1 ,更改價格為100,本意是要更新 apple 的價格為100,但PUT方法執行后,get到的資料name 欄位 的 apple 變成 undefined 了,

這是因為,PUT方法會更新整個資源物件,前端沒有給出的欄位,會自動清空,所以,要么我們在ajax的data中給出完整的物件資訊,要么采用PATCH方法,

PATCH是一個新方法,可以當作是PUT方法的補充,主要用來做區域更新,

案例:同PUT方法,

$("#putBtn").click(function () {
    $.ajax({
        type: 'patch',
        url: 'http://localhost:3004/fruits/' + $("#putId").val(),
        data: {
            price: $("#putPrice").val()
        },
        success: function (data) {
            console.log("put success")
        },
        error: function () {
            alert("put error")
        }
    })
})

此處,我們輸入id2 ,更改價格為200,即要更新 orange 的價格為200,執行PATCH方法后,get到的資料name 欄位 的 orange 的價格確實變化了,而且不會像PUT方法,導致 name 變成 undefined

但有時候,我們更希望能通過輸入水果名稱,來動態更新水果價格,但 'http://localhost:3004/fruits/orange' 這種 url 是錯誤的,而像 'http://localhost:3004/fruits?name = orange' 這種url,只能供 GET 方法來獲取資料,既然如此,我們就多繞個彎,通過GET方法來獲知id,然后再通過id去PATCH資料,

實作方法如下:

<p>通過水果名更新水果價格</p>
水果:<input id="editName" type="text" name="fruitName"><br>
價格:<input id="editPrice" type="text" name="fruitPrice"><br>
<button id="editBtn">edit</button>
$("#editBtn").click(function () {
    getFun($("#editName").val(), patchFun)
})

function getFun(name, f) {
    $.ajax({
        type: 'get',
        url: 'http://localhost:3004/fruits' + '?name=' + name,
        success: function (data) {
            // data 物件陣列
            console.log(data[0]);
            if (typeof f == "function") f.call(this, data[0].id)
        },
        error: function () {
            alert("error")
        }
    })
}

function patchFun(id) {
    $.ajax({
        type: 'patch',
        url: 'http://localhost:3004/fruits/' + id,
        data: {
            price: $("#editPrice").val()
        },
        success: function (data) {
            console.log("success", data)
        },
        error: function () {
            alert("error")
        }
    })
}

洗掉資料

DELETE 方法,常用來洗掉已有資源

案例:根據id洗掉水果資料

<p>洗掉水果</p>
水果id:<input id="delId" type="text" name="delName"><br>
<button id="delOne">del</button>
<button id="delAll">delAll</button>
$("#delOne").click(function () {
    $.ajax({
        type: 'delete',
        url: 'http://localhost:3004/fruits/' + $("#delId").val(),
        success: function (data) {
            console.log("del success")
        },
        error: function () {
            alert("del error")
        }
    })
})

若想用洗掉全部,沒辦法使用'http://localhost:3004/fruits' 這種請求url,

因為必須指定洗掉的物件id,所以只能通過回圈洗掉,這就需要實作通過GET方法來獲取當前最大id(注意是最大id,而不是資料個數)來作為回圈的邊界,

$("#delAll").click(function () {
    // 此處就沒有動態去獲取db.json中fruits的最大id,直接帶入10
    for (var i = 0; i <= 10; i++) {
        delFun(i)
    }
})

function delFun(id) {
    $.ajax({
        type: 'delete',
        url: 'http://localhost:3004/fruits/' + id,
        data: '',
        success: function (data) {
            console.log("del success", data)
        },
        error: function () {
            console.log("del error")
        }
    })
}

四、配置靜態資源服務器

主要是用來配置圖片、音頻、視瞥澩

通過命令列配置路由、資料檔案、監控等會讓命令變的很長,而且容易敲錯;

json-server允許我們把所有的配置放到一個組態檔中,這個組態檔一般命名為json_sever_config.json;

json_sever_config.json

{
  "port": 3004,            
  "watch": true,           
  "static": "./public",
  "read-only": false, 
  "no-cors": true, 
  "no-gzip": false
}

package.json

{
    "scripts": {
        "mock": "json-server --c json_sever_config.json db.json"
    }
}

我們可以把我們的圖片資源都放在public目錄中,但是public目錄不僅可以放圖片,也可以放音頻和視頻,所有大家放資源的時候,在public下面創建images用來放置圖片,創建audio/video分別放置音頻和視頻;

既然我們已經在json_server_config.json里面指明了靜態檔案的目錄,那么我們訪問的時候,就可以忽略public;

圖片:http://localhost:3004/@2x_about.png

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

標籤:其他

上一篇:請求圖書洗掉案例

下一篇:2021最新~某知名社交平臺的前端工程師筆試題——看看有哪些是你不會的?

標籤雲
其他(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