參考回答:
https 的 SSL 加密是在傳輸層實現的。
(1)http 和 https 的基本概念
http: 超文本傳輸協議, 是互聯網上應用最為廣泛的一種網絡協議, 是一個客戶端和服 務器端請求和應答的標準 (TCP) , 用于從 WWW 服務器傳輸超文本到本地瀏覽器的傳 輸協議, 它可以使瀏覽器更加高效, 使網絡傳輸減少。
https: 是以安全為目標的 HTTP 通道, 簡單講是 HTTP 的安全版, 即 HTTP 下加入 SSL 層, HTTPS 的安全基礎是 SSL, 因此加密的詳細內容就需要 SSL。
https 協議的主要作用是:建立一個信息安全通道,來確保數組的傳輸,確保網站的真實 性。
(2)http 和 https 的區別?
http 傳輸的數據都是未加密的,也就是明文的, 網景公司設置了 SSL 協議來對 http 協議 傳輸的數據進行加密處理,簡單來說 https 協議是由 http 和 ssl 協議構建的可進行加密傳 輸和身份認證的網絡協議, 比 http 協議的安全性更高。
主要的區別如下:
Https 協議需要 ca 證書, 費用較高。
http 是超文本傳輸協議, 信息是明文傳輸, https 則是具有安全性的 ssl 加密傳輸協議。 使用不同的鏈接方式, 端口也不同, 一般而言, http 協議的端口為 80, https 的端口為443。
http 的連接很簡單,是無狀態的;HTTPS 協議是由 SSL+HTTP 協議構建的可進行加密傳 輸 、身份認證的網絡協議, 比 http 協議安全。
(3)https 協議的工作原理
客戶端在使用 HTTPS 方式與 Web 服務器通信時有以下幾個步驟, 如圖所示。 客戶使用 https url 訪問服務器, 則要求web 服務器建立 ssl 鏈接。
web 服務器接收到客戶端的請求之后, 會將網站的證書 (證書中包含了公鑰) , 返回或 者說傳輸給客戶端。
客戶端和 web 服務器端開始協商 SSL 鏈接的安全等級, 也就是加密等級。
客戶端瀏覽器通過雙方協商一致的安全等級,建立會話密鑰,然后通過網站的公鑰來加 密會話密鑰, 并傳送給網站。
web 服務器通過自己的私鑰解密出會話密鑰。
web 服務器通過會話密鑰加密與客戶端之間的通信。
(4)https 協議的優點
使用HTTPS 協議可認證用戶和服務器, 確保數據發送到正確的客戶機和服務器;
HTTPS 協議是由 SSL+HTTP 協議構建的可進行加密傳輸 、身份認證的網絡協議, 要比 http 協議安全, 可防止數據在傳輸過程中不被竊取 、改變, 確保數據的完整性 。 HTTPS 是現行架構下最安全的解決方案,雖然不是絕對安全,但它大幅增加了中間人攻 擊的成本。
谷歌曾在 2014 年 8 月份調整搜索引擎算法, 并稱“比起同等 HTTP 網站, 采用 HTTPS 加密的網站在搜索結果中的排名將會更高”。
(5)https 協議的缺點
https 握手階段比較費時, 會使頁面加載時間延長 50%, 增加 10%~20%的耗電。
https 緩存不如 http 高效, 會增加數據開銷。
SSL 證書也需要錢, 功能越強大的證書費用越高。
SSL 證書需要綁定 IP, 不能再同一個 ip 上綁定多個域名, ipv4 資源支持不了這種消耗。
參考回答:
客戶端和服務端都需要直到各自可收發, 因此需要三次握手。
簡化三次握手:
<img width="487" alt="2018-07-10 3 42 11" src="https://user-images.githubusercontent.com/ 17233651/42496289-1c6d668a-8458-11e8-98b3-65db50f64d48.png">
從圖片可以得到三次握手可以簡化為:C 發起請求連接 S 確認,也發起連接 C 確認我們 再看看每次握手的作用: 第一次握手: S 只可以確認 自己可以接受 C 發送的報文段第 二次握手: C 可以確認 S 收到了自己發送的報文段, 并且可以確認 自己可以接受 S 發 送的報文段第三次握手: S 可以確認 C 收到了自己發送的報文段。
參考回答:
( 1) TCP 是面向連接的, udp 是無連接的即發送數據前不需要先建立鏈接。
( 2) TCP 提供可靠的服務 。也就是說, 通過 TCP 連接傳送的數據, 無差錯, 不丟失, 不重復, 且按序到達;UDP 盡最大努力交付, 即不保證可靠交付 。 并且因為 tcp 可靠, 面向連接, 不會丟失數據因此適合大數據量的交換。
( 3) TCP 是面向字節流,UDP 面向報文,并且網絡出現擁塞不會使得發送速率降低 (因 此會出現丟包, 對實時的應用比如 IP 電話和視頻會議等) 。
( 4) TCP 只能是 1 對 1 的, UDP 支持 1 對 1,1 對多。
( 5) TCP 的首部較大為 20 字節, 而 UDP 只有 8 字節。
( 6) TCP 是面向連接的可靠性傳輸, 而 UDP 是不可靠的。
參考回答:
(1)什么是 WebSocket?
WebSocket 是 HTML5 中的協議, 支持持久連續, http 協議不支持持久性連接 。Http1.0 和 HTTP1.1 都不支持持久性的鏈接, HTTP1.1 中的 keep-alive, 將多個 http 請求合并為 1 個
(2)WebSocket 是什么樣的協議, 具體有什么優點?
HTTP 的生命周期通過 Request 來界定, 也就是 Request 一個 Response, 那么在 Http1.0 協議中, 這次 Http 請求就結束了 。在 Http1.1 中進行了改進, 是的有一個 connection: Keep-alive,也就是說,在一個 Http 連接中,可以發送多個 Request,接收多個 Response。 但是必須記住, 在 Http 中一個 Request 只能對應有一個 Response, 而且這個 Response 是被動的, 不能主動發起。
WebSocket 是基于 Http 協議的,或者說借用了 Http 協議來完成一部分握手,在握手階段 與 Http 是相同的。我們來看一個 websocket 握手協議的實現,基本是 2 個屬性,upgrade, connection。
基本請求如下:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
多了下面 2 個屬性:
Upgrade:webSocket
Connection:Upgrade
告訴服務器發送的是websocket
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
參考回答:
head: 類似于 get 請求, 只不過返回的響應中沒有具體的內容, 用戶獲取報頭 options: 允許客戶端查看服務器的性能, 比如說服務器支持的請求方式等等。
參考回答:
請求的返回頭里面, 用于瀏覽器解析的重要參數就是 OSS 的 API 文檔里面的返回http 頭, 決定用戶下載行為的參數。
下載的情況下:
x-oss-object-type: Normal
x-oss-request-id: 598D5ED34F29D01FE2925F41
x-oss-storage-class: Standard
參考回答:
能夠被殘障人士使用的網站才能稱得上一個易用的 (易訪問的) 網站。 殘障人士指的是那些帶有殘疾或者身體不健康的用戶。
使用 alt 屬性:
<img src="person.jpg" alt="this is a person"/>
有時候瀏覽器會無法顯示圖像 。具體的原因有:
用戶關閉了圖像顯示
瀏覽器是不支持圖形顯示的迷你瀏覽器
瀏覽器是語音瀏覽器 (供盲人和弱視人群使用)
如果您使用了alt 屬性, 那么瀏覽器至少可以顯示或讀出有關圖像的描述。
參考回答:
什么是 Bom? Bom 是瀏覽器對象 。有哪些常用的 Bom 屬性呢?
(1)location 對象
location.href-- 返回或設置當前文檔的 URL
location.search -- 返回 URL 中的查詢字符串部分 。 例
如 http://www.dreamdu.com/dreamdu.php?id=5&name=dreamdu 返回包括(?)后面的內 容?id=5&name=dreamdu
location.hash -- 返回 URL#后面的內容, 如果沒有#, 返回空
location.host -- 返回 URL 中的域名部分, 例如 www.dreamdu.com
location.hostname -- 返回 URL 中的主域名部分, 例如 dreamdu.com
location.pathname -- 返回 URL 的域名后的部分 。例如 http://www.dreamdu.com/xhtml/ 返 回/xhtml/
location.port -- 返回 URL 中的端口部分 。 例如 http://www.dreamdu.com:8080/xhtml/ 返回8080
location.protocol -- 返回 URL 中的協議部分。例如 http://www.dreamdu.com:8080/xhtml/ 返 回(//)前面的內容 http:
location.assign -- 設置當前文檔的 URL
location.replace() -- 設置當前文檔的 URL, 并且在 history 對象的地址列表中移除這個 URL location.replace(url);
location.reload() -- 重載當前頁面
(2)history 對象
history.go() -- 前進或后退指定的頁面數 history.go(num);
history.back() -- 后退一頁
history.forward() -- 前進一頁
(3)Navigator 對象
navigator.userAgent -- 返回用戶代理頭的字符串表示(就是包括瀏覽器版本信息等的字 符串)。
navigator.cookieEnabled -- 返回瀏覽器是否支持(啟用)cookie。
參考回答:
dragstart: 事件主體是被拖放元素, 在開始拖放被拖放元素時觸發, 。
darg: 事件主體是被拖放元素, 在正在拖放被拖放元素時觸發。
dragenter: 事件主體是目標元素, 在被拖放元素進入某元素時觸發。
dragover: 事件主體是目標元素, 在被拖放在某元素內移動時觸發。
dragleave: 事件主體是目標元素, 在被拖放元素移出目標元素是觸發。
drop: 事件主體是目標元素, 在目標元素完全接受被拖放元素時觸發。
dragend: 事件主體是被拖放元素, 在整個拖放操作結束時觸發。
參考回答:
首先補充一下, http 和 https 的區別, 相比于 http,https 是基于 ssl 加密的 http 協議
簡要概括: http2.0 是基于 1999 年發布的 http1.0 之后的首次更新。
提升訪問速度 (可以對于, 請求資源所需時間更少, 訪問速度更快, 相比 http1.0)
允許多路復用:多路復用允許同時通過單一的 HTTP/2 連接發送多重請求-響應信息。改 善了: 在 http1.1 中, 瀏覽器客戶端在同一時間, 針對同一域名下的請求有一定數量限 制 (連接數量) , 超過限制會被阻塞。
二進制分幀:HTTP2.0 會將所有的傳輸信息分割為更小的信息或者幀,并對他們進行二 進制編碼、首部壓縮、服務器端推送。
參考回答:
(1)400 狀態碼: 請求無效
產生原因:
前端提交數據的字段名稱和字段類型與后臺的實體沒有保持一致。
前端提交到后臺的數據應該是 json 字符串類型, 但是前端沒有將對象 JSON.stringify 轉化成字符串。
解決方法:
對照字段的名稱, 保持一致性,將 obj 對象通過 JSON.stringify 實現序列化。
(2)401 狀態碼: 當前請求需要用戶驗證
(3)403 狀態碼: 服務器已經得到請求, 但是拒絕執行
參考回答:
fetch 發送 post 請求的時候, 總是發送 2 次, 第一次狀態碼是 204, 第二次才成功?
原因很簡單, 因為你用 fetch 的 post 請求的時候, 導致 fetch 第一次發送了一個 Options 請求,詢問服務器是否支持修改的請求頭,如果服務器支持,則在第二次中發送真正的 請求。
參考回答:
在 HTML 頁面中,如果在執行腳本時,頁面的狀態是不可相應的,直到腳本執行完成后, 頁面才變成可相應 。web worker 是運行在后臺的 js, 獨立于其他腳本, 不會影響頁面你 的性能 。并且通過 postMessage 將結果回傳到主線程 。這樣在進行復雜操作的時候, 就 不會阻塞主線程了。
如何創建 web worker:
檢測瀏覽器對于 web worker 的支持性
創建 web worker 文件 (js, 回傳函數等)
創建 web worker 對象
參考回答:
HTML5 語義化標簽是指正確的標簽包含了正確的內容,結構良好,便于閱讀, 比如nav 表示導航條, 類似的還有 article 、header 、footer 等等標簽。
參考回答:
定義: iframe 元素會創建包含另一個文檔的內聯框架
提示: 可以將提示文字放在<iframe></iframe>之間, 來提示某些不支持 iframe 的瀏覽器 缺點: 會阻塞主頁面的 onload 事件 搜索引擎無法解讀這種頁面, 不利于 SEO iframe 和主頁面共享連接池, 而瀏覽器對相同區域有限制所以會影響性能。
參考回答:
Doctype 聲明于文檔最前面, 告訴瀏覽器以何種方式來渲染頁面, 這里有兩種模式, 嚴 格模式和混雜模式。
嚴格模式的排版和 JS 運作模式是 以該瀏覽器支持的最高標準運行。
混雜模式, 向后兼容, 模擬老式瀏覽器, 防止瀏覽器無法兼容頁面。
參考回答:
XSS (跨站腳本攻擊) 是指攻擊者在返回的 HTML 中嵌入 javascript 腳本,為了減輕這些 攻擊, 需要在 HTTP 頭部配上, set-cookie:
httponly-這個屬性可以防止 XSS,它會禁止 javascript 腳本來訪問 cookie。
secure - 這個屬性告訴瀏覽器僅在請求為 https 的時候發送 cookie。
結果應該是這樣的: Set-Cookie=<cookie-value>.....
參考回答:
就是用URL 定位資源, 用 HTTP 描述操作。
參考回答:
可以參考這篇文章:
響應式布局的常用解決方案對比(媒體查詢、百分比、rem 和 vw/vh)
參考回答:
(1)粗暴型, 禁用縮放
<meta name="viewport" content="width=device-width, user-scalable=no">
(2)利用 FastClick, 其原理是:
檢測到 touchend 事件后, 立刻出發模擬 click 事件, 并且把瀏覽器 300 毫秒之后真正出 發的事件給阻斷掉。
參考回答:
addEventListener(event, function, useCapture)
其中, event 指定事件名; function 指定要事件觸發時執行的函數; useCapture 指定事件 是否在捕獲或冒泡階段執行。
參考回答:
100 Continue 繼續 。客戶端應繼續其請求。
101 Switching Protocols 切換協議。服務器根據客戶端的請求切換協議。只能切換到更 高級的協議, 例如, 切換到HTTP 的新版本協議。
200 OK 請求成功 。一般用于 GET 與 POST 請求。
201 Created 已創建 。成功請求并創建了新的資源。
202 Accepted 已接受 。 已經接受請求, 但未處理完成。
203 Non-Authoritative Information 非授權信息。請求成功。但返回的 meta 信息不在原 始的服務器, 而是一個副本。
204 No Content 無內容 。服務器成功處理, 但未返回內容 。在未更新網頁的情況下, 可確保瀏覽器繼續顯示當前文檔。
205 Reset Content 重置內容。服務器處理成功, 用戶終端 (例如: 瀏覽器) 應重置文 檔視圖 。可通過此返回碼清除瀏覽器的表單域。
206 Partial Content 部分內容 。服務器成功處理了部分 GET 請求。
300 Multiple Choices 多種選擇。請求的資源可包括多個位置,相應可返回一個資源特 征與地址的列表用于用戶終端 (例如: 瀏覽器) 選擇。
301 Moved Permanently 永久移動。請求的資源已被永久的移動到新 URI,返回信息會 包括新的 URI,瀏覽器會自動定向到新 URI。今后任何新的請求都應使用新的 URI 代替。
302 Found 臨時移動。與 301 類似。但資源只是臨時被移動。客戶端應繼續使用原有 URI。
303 See Other 查看其它地址 。與 301 類似 。使用 GET 和 POST 請求查看。
304 Not Modified 未修改 。所請求的資源未修改, 服務器返回此狀態碼時, 不會返回 任何資源。客戶端通常會緩存訪問過的資源,通過提供一個頭信息指出客戶端希望只返 回在指定日期之后修改的資源。
305 Use Proxy 使用代理 。所請求的資源必須通過代理訪問。
306 Unused 已經被廢棄的 HTTP 狀態碼。
307 Temporary Redirect 臨時重定向 。與 302 類似 。使用 GET 請求重定向。
400 Bad Request 客戶端請求的語法錯誤, 服務器無法理解。
401 Unauthorized 請求要求用戶的身份認證。
402 Payment Required 保留, 將來使用。
403 Forbidden 服務器理解請求客戶端的請求, 但是拒絕執行此請求。
404 Not Found 服務器無法根據客戶端的請求找到資源 (網頁) 。通過此代碼, 網站 設計人員可設置"您所請求的資源無法找到"的個性頁面。
405 Method Not Allowed 客戶端請求中的方法被禁止。
406 Not Acceptable 服務器無法根據客戶端請求的內容特性完成請求。
407 Proxy Authentication Required 請求要求代理的身份認證, 與 401 類似, 但請求者 應當使用代理進行授權。
408 Request Time-out 服務器等待客戶端發送的請求時間過長, 超時。
409 Conflict 服務器完成客戶端的 PUT 請求是可能返回此代碼,服務器處理請求時發 生了沖突。
410 Gone 客戶端請求的資源已經不存在。410 不同于 404,如果資源以前有現在被永 久刪除了可使用410 代碼, 網站設計人員可通過 301 代碼指定資源的新位置。
411 Length Required 服務器無法處理客戶端發送的不帶 Content-Length 的請求信息。
412 Precondition Failed 客戶端請求信息的先決條件錯誤。
413 Request Entity Too Large 由于請求的實體過大,服務器無法處理, 因此拒絕請求。 為防止客戶端的連續請求,服務器可能會關閉連接。如果只是服務器暫時無法處理,則 會包含一個 Retry-After 的響應信息。
414 Request-URI Too Large 請求的 URI 過長 ( URI 通常為網址) , 服務器無法處理。
415 Unsupported Media Type 服務器無法處理請求附帶的媒體格式。
416 Requested range not satisfiable 客戶端請求的范圍無效。
417 Expectation Failed 服務器無法滿足 Expect 的請求頭信息。
500 Internal Server Error 服務器內部錯誤, 無法完成請求。
501 Not Implemented 服務器不支持請求的功能, 無法完成請求。
502 Bad Gateway 作為網關或者代理工作的服務器嘗試執行請求時, 從遠程服務器接 收到了一個無效的響應。
503 Service Unavailable 由于超載或系統維護,服務器暫時的無法處理客戶端的請求。 延時的長度可包含在服務器的 Retry-After 頭信息中。
504 Gateway Time-out 充當網關或代理的服務器, 未及時從遠端服務器獲取請求。
505 HTTP Version not supported 服務器不支持請求的 HTTP 協議的版本, 無法完成處 理。
參考回答:
協議頭 | 說明 |
Accept | 可接受的響應內容類型 (Content-Types) 。 |
Accept-Charset | 可接受的字符集。 |
Accept-Encoding | 可接受的響應內容的編碼方式。 |
Accept-Language | 可接受的響應內容語言列表。 |
Accept-Datetime | 可接受的按照時間來表示的響應內容版本。 |
Authorization | 用于表示 HTTP 協議中需要認證資源的認證信息。 |
Cache-Control | 用來指定當前的請求/回復中的, 是否使用緩存機制。 |
Connection | 客戶端 (瀏覽器) 想要優先使用的連接類型。 |
Cookie | 由之前服務器通過 Set-Cookie(見下文)設置的一個 HTTP 協議 Cookie。 |
Content-Length | 以 8 進制表示的請求體的長度。 |
Content-MD5 | 請求體的內容的二進制 MD5 散列值 (數字簽名) , 以 Base64 編碼的結果。 |
Content-Type | 請求體的 MIME 類型 (用于 POST 和 PUT 請求中)。 |
Date | 發送該消息的日期和時間 (以RFC 7231中定義的"HTTP 日期"格式 來發送)。 |
Expect | 表示客戶端要求服務器做出特定的行為。 |
From | 發起此請求的用戶的郵件地址。 |
Host | 表示服務器的域名以及服務器所監聽的端口號 。如果所請求的端口 是對應的服務的標準端口 ( 80) , 則端口號可以省略。 |
If-Match | 僅當客戶端提供的實體與服務器上對應的實體相匹配時, 才進行對應的操作 。主要用于像 PUT 這樣的方法中, 僅當從用戶上次更新 某個資源后, 該資源未被修改的情況下, 才更新該資源。 |
If-Modified-Since | 允許在對應的資源未被修改的情況下返回304 未修改 |
If-None-Match | 允許在對應的內容未被修改的情況下返回304 未修改 ( 304 Not Modified ) , 參考 超文本傳輸協議 的實體標記 |
If-Range | 如果該實體未被修改過, 則向返回所缺少的那一個或多個部分 。否 則, 返回整個新的實體。 |
If-Unmodified-Since | 僅當該實體自某個特定時間以來未被修改的情況下, 才發送回應。 |
Max-Forwards | 限制該消息可被代理及網關轉發的次數。 |
Origin | 發起一個針對跨域資源共享的請求 (該請求要求服務器在響應中加入一個 Access-Control-Allow-Origin 的消息頭,表示訪問控制所允許 的來源) 。 |
Pragma | 與具體的實現相關, 這些字段可能在請求/回應鏈中的任何時候產 生。 |
Proxy-Authorization | 用于向代理進行認證的認證信息。 |
Range | 表示請求某個實體的一部分, 字節偏移以 0 開始。 |
Referer | 表示瀏覽器所訪問的前一個頁面, 可以認為是之前訪問頁面的鏈接將瀏覽器帶到了當前頁面。Referer 其實是 Referrer 這個單詞,但 RFC 制作標準時給拼錯了, 后來也就將錯就錯使用 Referer 了。 |
TE | 瀏覽器預期接受的傳輸時的編碼方式: 可使用回應協議頭 Transfer-Encoding 中的值 (還可以使用"trailers"表示數據傳輸時的分 塊方式) 用來表示瀏覽器希望在最后一個大小為 0 的塊之后還接收到一些額外的字段。 |
User-Agent | 瀏覽器的身份標識字符串。 |
Upgrade | 要求服務器升級到一個高版本協議。 |
Via | 告訴服務器, 這個請求是由哪些代理發出的。 |
Warning | 一個一般性的警告, 表示在實體內容體中可能存在錯誤。 |
參考回答:
緩存分為兩種: 強緩存和協商緩存, 根據響應的header 內容來決定。
獲取資源形式 | 狀態碼 | 發送請求到服務器 | |
強緩存 | 從緩存取 | 200 (from cache) | 否, 直接從緩存取 |
協商緩存 | 從緩存取 | 304 (not modified) | 是,通過服務器來告知緩存是否可 用 |
強緩存相關字段有 expires, cache-control 。如果 cache-control 與 expires 同時存在的話, cache-control 的優先級高于 expires。
協商緩存相關字段有 Last-Modified/If-Modified-Since, Etag/If-None-Match。
參考回答:
304:如果客戶端發送了一個帶條件的 GET 請求且該請求已被允許,而文檔的內容 (自 上次訪問以來或者根據請求的條件) 并沒有改變, 則服務器應當返回這個 304 狀態碼。
參考回答:
因為服務器上的資源不是一直固定不變的,大多數情況下它會更新,這個時候如果我們 還訪問本地緩存,那么對用戶來說,那就相當于資源沒有更新,用戶看到的還是舊的資 源;所以我們希望服務器上的資源更新了瀏覽器就請求新的資源,沒有更新就使用本地 的緩存, 以最大程度的減少因網絡請求而產生的資源浪費。
參考 https://segmentfault.com/a/1190000008956069
參考回答:
降低請求量: 合并資源, 減少 HTTP 請求數, minify / gzip 壓縮, webP, lazyLoad。
加快請求速度: 預解析 DNS, 減少域名數, 并行加載, CDN 分發。
緩存: HTTP 協議緩存請求, 離線緩存 manifest, 離線數據緩存 localStorage。
渲染: JS/CSS 優化, 加載順序, 服務端渲染, pipeline。
TML 中使用 <input> 元素表示單行輸入框和 <textarea> 元素表示多行文本框。
HTML中使用的 <input> 元素在 JavaScript 中對應的是 HTMLInputElement 類型。HTMLInputElement 繼承自 HTMLElement 接口:
interface HTMLInputElement extends HTMLElement {
...
}
HTMLInputElement 類型有一些獨有的屬性和方法:
而在上述介紹 HTMLInputElement 類型中的屬性時,type 屬性要特別關注一下,因為根據 type 屬性的改變,可以改變<input>的屬性。
類型 | 描述 |
text | 文本輸入 |
password | 密碼輸入 |
submit | 表單數據提交 |
button | 按鈕 |
radio | 單選框 |
checkbox | 復選框 |
file | 文件 |
hidden | 隱藏的字段 |
image | 定義圖像作為提交按鈕 |
reset | 重置按鈕 |
省略 type 屬性與 type="text"效果一樣, <input> 元素顯示為文本框。
當 type 的值為text/password/number/時,會有以下屬性對 <input> 元素有效。
屬性 | 類型 | 描述 |
autocomplete | string | 字符串on或off,表示<input>元素的輸入內容可以被瀏覽器自動補全。 |
maxLength | long | 指定<input>元素允許的最多字符數。 |
size | unsigned long | 表示<input>元素的寬度,這個寬度是以字符數來計量的。 |
pattern | string | 表示<input>元素的值應該滿足的正則表達式 |
placeholder | string | 表示<input>元素的占位符,作為對元素的提示。 |
readOnly | boolean | 表示用戶是否可以修改<input>的值。 |
min | string | 表示<input>元素的最小數值或日期。 |
max | string | 表示<input>元素的最大數值或日期。 |
selectionStart | unsigned long | 表示選中文本的起始位置。如果沒有選中文本,返回光標在<input>元素內部的位置。 |
selectionEnd | unsigned long | 表示選中文本的結束位置。如果沒有選中文本,返回光標在<input>元素內部的位置。 |
selectionDirection | string | 表示選中文本的方向。可能的值包括forward、backward、none。 |
下面創建一個 type="text" ,一次顯示 25 個字符,但最多允許顯示 50 個字符的文本框:
<input type="text" size="25" maxlength="50" value="initial value">
HTML 使用的 <textarea> 元素在 JavaScript 中對應的是 HTMLTextAreaElement 類型。HTMLTextAreaElement類型繼承自 HTMLElement 接口:
interface HTMLTextAreaElement extends HTMLElement {
...
}
HTMLTextAreaElement 類型有一些獨有的屬性和方法:
下面創建一個高度為 25,寬度為 5 的 <textarea> 多行文本框。它與 <input> 不同的是,初始值顯示在 <textarea>...</textarea> 之間:
<textarea rows="25" cols="5">initial value</textarea>
注意:處理文本框值的時候最好不要使用 DOM 方法,而應該使用 value 屬性。
<input> 與 <textarea> 都支持 select() 方法,該方法用于選中文本框中的所有內容。該方法的語法為:
select(): void
下面看一個示例:
let textbox = document.forms[0].elements["input-box"];
textbox.select();
也可以在文本框獲得焦點時,選中文本框的內容:
textbox.addEventListener("focus", (event) => {
event.target.select();
});
當選中文本框中的文本或使用 select() 方法時,會觸發 select 事件。
let textbox = document.forms[0].elements["textbox1"];
textbox.addEventListener("select", (event) => {
console.log(`Text selected: ${textbox.value}`);
});
HTML5 對 select 事件進行了擴展,通過 selectionStart 和 selectionEnd 屬性獲取文本選區的起點偏移量和終點偏移量。如下所示:
function getSelectedText(textbox){
return textbox.value.substring(textbox.selectionStart,
textbox.selectionEnd);
}
注意:在 IE8 及更早版本不支持這兩個屬性。
HTML5 提供了 setSelectionRange() 方法用于選中部分文本:
setSelectionRange(start, end, direction): void;
下面看一個例子:
<input type="text" id="text-sample" size="20" value="Hello World!">
<button onclick="selectText()">選中部分文本</button>
<script>
function selectText() {
let input = document.getElementById("text-sample");
input.focus();
input.setSelectionRange(4, 8); // o Wo
}
</script>
如果想要看到選中效果,必須讓文本框獲得焦點。
不同文本框經常需要保證輸入特定類型或格式的數據,或許數據需要包含特定字符或必須匹配某個特定模式。而文本框并未提供驗證功能,因此要配合 JavaScript 腳本實現輸入過濾功能。
有些輸入框需要出現或不出現特定字符。如果想要將輸入框變成只讀的,只需要使用 preventDefault()方法將按鍵都屏蔽:
input.addEventListener("keypress", (event) => {
event.preventDefault();
});
而要屏蔽特定字符,就需要檢查事件的 charCode 屬性。如下所示,使用正則表達式實現只允許輸入數字的輸入框:
input.addEventListener("keypress", (event) => {
if (!/\d/.test(event.key)) {
event.preventDefault();
}
});
還有一個問題需要處理:復制、粘貼及涉及Ctrl 鍵的其他功能。在除IE 外的所有瀏覽器中,前面代碼會屏蔽快捷鍵Ctrl+C、Ctrl+V 及其他使用Ctrl 的組合鍵。因此,最后一項檢測是確保沒有按下Ctrl鍵,如下面的例子所示:
textbox.addEventListener("keypress", (event) => {
if (!/\d/.test(String.fromCharCode(event.charCode)) &&
event.charCode > 9 &&
!event.ctrlKey){
event.preventDefault();
}
});
最后這個改動可以確保所有默認的文本框行為不受影響。這個技術可以用來自定義是否允許在文本框中輸入某些字符。
IE 是第一個實現了剪切板相關的事件以及通過JavaScript訪問剪切板數據的瀏覽器,其它瀏覽器在后來也都支持了相同的事件和剪切板的訪問,后來 HTML5 將其納入了規范。以下是與剪切板相關的 6 個事件:
剪切板事件的行為及相關對象會因瀏覽器而異。在 Safari、Chrome 和 Firefox 中,beforecopy、beforecut 和 beforepaste 事件只會在顯示文本框的上下文菜單時觸發,但 IE 不僅在這種情況下觸發,也會在 copy、cut 和 paste 事件在所有瀏覽器中都會按預期觸發。
在實際的事件發生之前,通過beforecopy、beforecut 和 beforepaste 事件可以在向剪貼板發送或從中檢索數據前修改數據。不過,取消這些事件并不會取消剪貼板操作。要阻止實際的剪貼板操作,必須取消 copy、cut和 paste 事件。
剪貼板的數據通過 clipboardData 對象來獲取,且clipboardData 對象提供 3 個操作數據的方法:
而 clipboardData 對象在 IE 中使用 window 獲取,在 Firefox、Safari 和 Chrome 中使用 event 獲取。為防止未經授權訪問剪貼板,只能在剪貼板事件期間訪問 clipboardData 對象;IE 會在任何時候都暴露 clipboardData 對象。因此,要兼容兩者,最好在剪貼板事件期間使用該對象。
function getClipboardText(event){
var clipboardData = (event.clipboardData || window.clipboardData);
return clipboardData.getData("text");
}
function setClipboardText (event, value){
if (event.clipboardData){
return event.clipboardData.setData("text/plain", value);
} else if (window.clipboardData){
return window.clipboardData.setData("text", value);
}
}
如果文本框只有數字,那剪貼時,就需要使用paste事件檢查剪貼板上的文本是否無效。如果無效,可以取消默認行為:
input.addEventListener("paste", (event) => {
let text = getClipboardText(event);
if (!/^\d*$/.test(text)){
event.preventDefault();
}
});
注意:Firefox、Safari和Chrome只允許在onpaste事件中訪問getData()方法。
在 JavaScript 中,可以用在當前字段完成時自動切換到下一個字段的方式來增強表單字段的易用性。比如,常用手機號分為國家好加手機號。因此,我們設置 2 個文本框:
<form>
<input type="text" name="phone1" id="phone-id-1" maxlength="4">
<input type="text" name="phone2" id="phone-id-2" maxlength="11">
</form>
當文本框輸入到最大允許字符數后,就把焦點移到下一個文本框,這樣可以增加表單的易用性并加速數據輸入。如下所示:
<script>
function tabForward(event){
let target = event.target;
if (target.value.length == target.maxLength){
let form = target.form;
for (let i = 0, len = form.elements.length; i < len; i++) {
if (form.elements[i] == target) {
if (form.elements[i+1]) {
form.elements[i+1].focus();
}
return;
}
}
}
}
let inputIds = ["phone-id-1", "phone-id-2"];
for (let id of inputIds) {
let textbox = document.getElementById(id);
textbox.addEventListener("keyup", tabForward);
}
</script>
這里,tabForward() 函數通過比較用戶輸入文本的長度與 maxLength 屬性的值來檢測輸入是否達到了最大長度。如果兩者相等,就通過循環表中的元素集合找到當前文本框,并把焦點設置到下一個元素。
注意:上面的代碼只適用于之前既定的標記,沒有考慮可能存在的隱藏字段。
HTML5 新增了一些表單提交前,瀏覽器會基于指定的規則進行驗證,并在出錯時顯示適當的錯誤信息。而驗證會基于某些條件應用到表單字段中。
表單字段中添加 required 屬性,用于標注該字段是必填項,不填則無法提交。該屬性適用于<input>、<textarea>和<select>。如下所示:
<input type="text" name="account" required>
也可以通過 JavaScript 檢測對應元素的 required 屬性來判斷表單字段是否為必填項:
let isRequired = document.forms[0].elements["account"].required;
也可以檢測瀏覽器是否支持 required 屬性:
let isRequiredSupported = "required" in document.createElement("input");
注意:不同瀏覽器處理必填字段的機制不同。Firefox、Chrome、IE 和Opera 會阻止表單提交并在相應字段下面顯示有幫助信息的彈框,而Safari 什么也不做,也不會阻止提交表單。
HTML5 為 <input> 元素增加了幾個新的 type 值。如下所示:
類型 | 描述 |
number | 數字值的輸入 |
date | 日期輸入 |
color | 顏色輸入 |
range | 一定范圍內的值的輸入 |
month | 允許用戶選擇月份和年份 |
week | 允許用戶選擇周和年份 |
time | 允許用戶選擇時間(無時區) |
datetime | 允許用戶選擇日期和時間(有時區) |
datetime-local | 允許用戶選擇日期和時間(無時區) |
電子郵件地址的輸入 | |
search | 搜索(表現類似常規文本) |
tel | 電話號碼的輸入 |
url | URL地址的輸入 |
這些輸入表名字段應該輸入的數據類型,并且提供了默認驗證。如下所示:
<input type="email" name="email">
<input type="url" name="homepage">
要檢測瀏覽器是否支持新類型,可以在 JavaScript 中創建 <input> 并設置 type 屬性,之后讀取它即可。老版本中會將我只類型設置為 text,而支持的會返回正確的值。如下所示:
let input = document.createElement("input");
input.type = "email";
let isEmailSupported = (input.type == "email");
而上面介紹的幾個如 number/range/datetime/datetime-local/date/month/week/time 幾個填寫數字的類型,都可以指定 min/max/step 等幾個與數值有關的屬性。step 屬性用于規定合法數字間隔,如 step="2",則合法數字應該為 0、2、4、6,依次類推。如下所示:
<input type="number" min="0" max="100" step="5" name="count">
上面的例子是<input>中只能輸入從 0 到 100 中 5 的倍數。
也可以使用 stepUp() 和 stepDown() 方法對 <input> 元素中的值進行加減,它倆會接收一個可選參數,用于表示加減的數值。如下所示:
input.stepUp(); // 加1
input.stepUp(5); // 加5
input.stepDown(); // 減1
input.stepDown(10); // 減10
HTML5 還為文本添加了 pattern 屬性,用于指定一個正則表達式。這樣就可以自己設置 <input> 元素的輸入模式了。如下所示:
<input type="text" pattern="\d+" name="count">
注意模式的開頭和末尾分別假設有^和$。這意味著輸入內容必須從頭到尾都嚴格與模式匹配。
與新增的輸入類型一樣,指定 pattern 屬性也不會阻止用戶輸入無效內容。模式會應用到值,然后瀏覽器會知道值是否有效。通過訪問 pattern 屬性可以讀取模式:
let pattern = document.forms[0].elements["count"].pattern;
使用如下代碼可以檢測瀏覽器是否支持pattern 屬性:
let isPatternSupported = "pattern" in document.createElement("input");
HTML5 新增了 checkValidity() 方法,用來檢測表單中任意給定字段是否有效。而判斷的條件是約束條件,因此必填字段如果沒有值會被視為無效,字段值不匹配 pattern 屬性也會被視為無效。如下所示:
if (document.forms[0].elements[0].checkValidity()){
// 字段有效,繼續
} else {
// 字段無效
}
要檢查整個表單是否有效,可以直接在表單上調用checkValidity()方法。這個方法會在所有字段都有效時返回true,有一個字段無效就會返回false:
if(document.forms[0].checkValidity()){
// 表單有效,繼續
} else {
// 表單無效
}
validity 屬性會返回一個ValidityState 對象,表示 <input> 元素的校驗狀態。返回的對象包含一些列的布爾值的屬性:
因此,通過 validity 屬性可以檢查表單字段的有效性,從而獲取更具體的信息,如下所示:
if (input.validity && !input.validity.valid){
if (input.validity.valueMissing){
console.log("請指定值.")
} else if (input.validity.typeMismatch){
console.log("請指定電子郵件地址.");
} else {
console.log("值無效.");
}
}
通過指定 novalidate 屬性可以禁止對表單進行任何驗證:
<form method="post" action="/signup" novalidate>
<!-- 表單元素 -->
</form>
也可以在 JavaScript 通過 noValidate 屬性設置,為 true 表示屬性存在,為 false 表示屬性不存在:
document.forms[0].noValidate = true; // 關閉驗證
如果一個表單中有多個提交按鈕,那么可以給特定的提交按鈕添加formnovalidate 屬性,指定通過該按鈕無需驗證即可提交表單:
<form method="post" action="/foo">
<!-- 表單元素 -->
<input type="submit" value="注冊提交">
<input type="submit" formnovalidate name="btnNoValidate"
value="沒有驗證的提交按鈕">
</form>
也可以使用 JavaScript 設置 formNoValidate 屬性:
// 關閉驗證
document.forms[0].elements["btnNoValidate"].formNoValidate = true;
以上總結了 <input> 和 <textarea> 兩個元素的一些功能,主要是 <input> 元素可以通過設置 type 屬性獲取不同類型的輸入框,可以通過監聽鍵盤事件并檢測要插入的字符來控制文本框的內容。
還有一些與剪貼板相關的事件,并對剪貼的內容進行檢測。還介紹了一些 HTML5 新增的屬性和方法和新增的更多的 <input> 元素的類型,和一些與驗證相關的屬性和方法。
源:計算機世界
前幾天一則“微軟允許員工永久在家辦公”的消息刷爆朋友圈,無獨有偶,Facebook正在將數萬個工作崗位轉移到遠程工作上。由于新冠疫情的影響,線上會議、線上辦公已經成為了部分企業的常態。根據Akamai智能邊緣平臺的監測,疫情期間網絡流量出現大幅增長,平均增幅達30%左右,而往年這一數據僅有3%。
與此同時,網絡攻擊風險也隨之增加。社交、視頻、聊天及游戲行業的流量激增情況較為突出,惡意攻擊流量約有4倍的增幅。那么,企業如何利用智能邊緣保證業務和數據的安全性?
疫情期間網絡攻擊頻發
6月初,Akamai平臺監測到一起超大規模的DDoS攻擊,攻擊流量高達1.44 Tbps,這是Akamai平臺監測到的自2018年GitHub遭受1.3 Tbps流量攻擊以來的又一次歷史新高。該起攻擊發生后不久,Akamai平臺再次監測到一起每秒高達8.09億個數據包的DDoS攻擊。
此外,Akamai還監測到一起針對金融服務行業的DDoS攻擊,攻擊者通過給攻擊目標發郵件,去勒索比特幣。所幸,該攻擊被Akamai智能邊緣平臺監測到并成功化解。目前,該種攻擊正慢慢向金融服務行業以外的游戲、媒體等其他行業發展。
從DDoS整個發展趨勢而言,Akamai發現其規模越來越大,且形式越發復雜。于UDP Flood、SYN Flood這種單一的攻擊模式目前越來越少,而比如網絡層攻擊、應用層攻擊、反射性攻擊以及分片式攻擊等組合攻擊方式卻層出不窮。
Web應用層攻擊的增長也非常迅速。隨著數字化轉型的推進,應用層的應用數量通常超100個。這種情況之下,不同的應用使用的組件和技術會越發復雜。結果就是,使用開源代碼、第三方腳本、下一代HTML語言或API接口等方式,都使得網站越來越脆弱,暴露的受攻擊點越來越多。
撞庫攻擊方也在發生變化。據Akamai監測,在2020年第一季度,針對歐洲視頻服務提供商和廣播公司的惡意登錄嘗試大幅增加。在眾多隔離措施開始施行后,3月下旬的一起針對單一服務提供商的攻擊在24小時內共發起了近3.5億次登錄嘗試。很多犯罪分子會將相同帳戶與不同應用的憑證信息進行合并,合并后形成一個憑證集合,隨后進行深度訓練,從而獲取更多客戶的憑證信息,最終得到一個整體的客戶畫像、在黑產市場獲取更大利潤。Akamai的研究人員觀察到,在整個第一季度中,被盜帳戶憑據一開始的交易價格約為1到5美元,涵蓋多種服務的套餐交易價格為10到45美元。
如何利用邊緣網絡守住安全防線?
萬物互聯(IoE)和人工智能等技術的發展已將數據和計算的重心從核心轉移到邊緣。在邊緣側進行數據分析,可以改善企業整體的敏捷性,以及戰略和運營決策。由于海量數據是在傳統的數據中心之外創建,因此云將延伸至邊緣。未來不是云與邊緣的對抗,而是云和邊緣的共生,原有的架構也會發生變化。
隨著多云環境、混合云環境的使用,云端的安全策略很難統一。當企業隨云遷移的時候,安全策略是不是可以遷移?安全防護是不是可以遷移?現在很多應用在云端可以彈性化拓展,這也要求安全服務能夠有彈性擴展防護能力。
Gartner預計2025年至少有約一半的企業采用邊緣化的安全架構。
Akamai的邊緣安全是數字化轉型中的保護傘,它很好地利用了自身網絡邊緣以及流量邊緣的優勢,在網絡邊緣處對各種各樣的攻擊流量進行識別。Akamai采用分層的安全防護體系,目前,該防護體系包括DDoS防護、爬蟲攻擊的檢測和防護以及API防護等,企業可以緩解各種類型和規模的攻擊流量。除分層的邊緣安全防護體系外,Akamai還具備基于用戶身份識別和管理的服務、基于零信任的遠程訪問,以及網關類檢測等防護功能。
對于Akamai的邊緣安全領域的差異化優勢,Akamai區域副總裁暨大中華區總經理李昇說:“首先,從邊緣的特點來說,Akamai高度分布的架構是最大的差異化優勢。另外,Akamai的優勢還在于安全,這并不局限于技術范疇,還有疊加信息的豐富性。Akamai有原生優勢,因為我們承載了互聯網很大部分流量,對于攻擊行為有豐富的洞見。基于豐富的洞見,Akamai把知識圖譜輸入到產品的設計和功能中。”
Akamai區域副總裁暨大中華區總經理李昇
如今,大家對邊緣化能力的提升有了越來越高的期待,一些大的云計算廠商也在推廣這一個概念,使得他們擴充和彌補自己在分布式節點上的能力。
Akamai則是從另外一個方向來滿足企業在這方面的期待。李昇表示,除了傳統的CDN分發,Akamai還將在物聯網等層面不停地疊加邊緣邏輯處理能力。在提升業務處理能力的同時,做好邊緣安全防護。
去年,Akamai委托Forrester進行了一項總體經濟影響(Total Economic Impact)研究,以了解企業通過部署Akamai邊緣安全產品可能獲得的收益。“在使用Akamai邊緣安全產品之前,受訪客戶的挑戰通常是如何縮短受到惡意攻擊時的宕機時間、如何避免數據泄露和賬戶被盜等風險,對有效的安全方案保護收入和品牌信譽以及簡化、高性價比的IT安全環境提出要求。在應用了Akamai邊緣安全產品以后,客戶的主要成果就是在于成本是否降低,收入是否有提升。“Akamai大中華區產品市場經理劉炅說。
Akamai大中華區產品市場經理劉炅
根據報告,除了上述量化收益,受訪客戶還談到了使用Akamai邊緣安全產品獲得的非量化收益,包括:網站受到攻擊時的表現得以改善。部署Akamai產品前后,網站受到攻擊時的預計加載時間分別為101.7毫秒和70毫秒;客戶流失率降低了5.88%,而跳出率下降了11.8%;點擊率有所提高,轉化率提高了6.3%,客戶滿意度也得以提升。
最后就是靈活性的分析。受訪客戶表示他們可以從多個公共云提供商中進行選擇,而不必局限于一家云提供商。他們可以在前端部署Akamai邊緣安全產品,通過一種獨立于云服務商的方式提供安全服務。選擇云提供商的能力提高了定價和服務的靈活性。
總計而言,疫情之下,企業對邊緣安全的需求更加迫切。Akamai的邊緣安全產品以期節點廣、層次多、靈活性高的優勢可以保證企業整體的安全策略以及防護的統一性。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。