原來 Clipboard 還能復制圖像?原理是什么

在寫了 這個 29.7 K 的剪貼板 JS 庫有點東西! 這篇文章之后,收到了小伙伴提的兩個問題:

1.clipboard.js 這個庫除了復制文字之外,能復制圖像么?

2.clipboard.js ?這個庫依賴的 document.execCommand API 已被廢棄了,以后應該怎么辦?

(圖片來源:https://developer.mozilla.org/zh-CN/docs/Web/API/Document/execCommand)

接下來,本文將圍繞上述兩個問題展開,不過在看第一個問題之前,我們先來簡單介紹一下 剪貼板 ????。

剪貼板(英語:clipboard),有時也稱剪切板、剪貼簿、剪貼本。它是一種軟件功能,通常由操作系統提供,作用是使用復制和粘貼操作短期存儲數據和在文檔或應用程序間轉移數據。它是圖形用戶界面(GUI)環境中最常用的功能之一,通常實現為匿名、臨時的數據緩沖區,可以被環境內的大部分或所有程序使用編程接口訪問。—— 維基百科

通過以上的描述我們可以知道,剪貼板架起了一座橋梁,使得在各種應用程序之間,傳遞和共享信息成為可能。然而美中不足的是,剪貼板只能保留一份數據,每當新的數據傳入,舊的便會被覆蓋。

了解完 剪貼板 ???? 的概念和作用之后,我們馬上來看一下第一個問題:clipboard.js 這個庫除了復制文字之外,能復制圖像么?

一、clipboard.js 能否復制圖像?

clipboard.js 是一個用于將 文本 復制到剪貼板的 JS 庫。沒有使用 Flash,沒有使用任何框架,開啟 gzipped 壓縮后僅僅只有 3kb

(圖片來源:https://clipboardjs.com/#example-text)

當你看到 “A modern approach to copy text to clipboard” 這個描述,你是不是已經知道答案了。那么實際的情況是怎樣呢?下面我們來動手驗證一下。在 這個 29.7 K 的剪貼板 JS 庫有點東西! 這篇文章中,阿寶哥介紹了在實例化 ClipboardJS 對象時,可以通過 options 對象的 target 屬性來設置復制的目標:

//?https://github.com/zenorocha/clipboard.js/blob/master/demo/function-target.html
let?clipboard?=?new?ClipboardJS('.btn',?{target:?function()?{return?document.querySelector('div');}
});

利用 clipboard.js 的這個特性,我們可以定義以下 HTML 結構:

<div?id="container"><img?src="http://cdn.semlinker.com/abao.png"?width="80"?height="80"/><p>大家好,我是阿寶哥</p>
</div>
<button?class="btn">復制</button>

然后在實例化 ClipboardJS 對象時設置復制的目標是 #container 元素:

const?clipboard?=?new?ClipboardJS(".btn",?{target:?function?()?{return?document.querySelector("#container");}
});

之后,我們點擊頁面中的 復制 按鈕,對應的效果如下圖所示:

觀察上圖可知,頁面中的圖像和文本都已經被復制了。對于文本來說,大家應該都很清楚。而對于圖像來說,到底復制了什么?我們又該如何獲取已復制的內容呢?針對這個問題,我們可以利用 HTMLElement 對象上的 onpaste 屬性或者監聽元素上的 paste 事件。

這里我們通過設置 document 對象的 onpaste 屬性,來打印一下粘貼事件對應的事件對象:

document.onpaste?=?function?(e)?{console.dir(e);
}

當我們點擊 復制 按鈕,然后在頁面執行 粘貼 操作后,控制臺會打印出以下內容:

通過上圖可知,在 ClipboardEvent 對象中含有一個 clipboardData 屬性,該屬性包含了與剪貼板相關聯的數據。詳細分析了 clipboardData 屬性之后,我們發現已復制的圖像和普通文本被封裝為 DataTransferItem 對象。

為了更方便地分析 DataTransferItem 對象,阿寶哥重新更新了 document 對象的 onpaste 屬性:

在上圖中,我們可以清楚的看到 DataTransferItem 對象上含有 kindtype 屬性分別用于表示數據項的類型(string 或 file)及數據對應的 MIME 類型。利用 DataTransferItem 對象提供的 getAsString 方法,我們可以獲取該對象中保存的數據:

相信看完以上的輸出結果,小伙伴們就很清楚第一個問題的答案了。那么如果想要復制圖像的話,應該如何實現呢?其實這個問題的答案與小伙伴提的第二個問題的答案是一樣的,我們可以利用 Clipboard API 來實現復制圖像的問題及解決 document.execCommand API 已被廢棄的問題。

接下來,我們的目標就是實現復制圖像的功能了,因為要利用到 Clipboard API,所以阿寶哥先來介紹一下該 API。

二、Clipboard API 簡介

Clipboard 接口實現了 Clipboard API,如果用戶授予了相應的權限,就能提供系統剪貼板的讀寫訪問。在 Web 應用程序中,Clipboard API 可用于實現剪切、復制和粘貼功能。該 API 用于取代通過 document.execCommand API 來實現剪貼板的操作。

在實際項目中,我們不需要手動創建 Clipboard 對象,而是通過 navigator.clipboard 來獲取 ?Clipboard 對象:

在獲取 Clipboard 對象之后,我們就可以利用該對象提供的 API 來訪問剪貼板,比如:

navigator.clipboard.readText().then(clipText?=>?document.querySelector(".editor").innerText?=?clipText);

以上代碼將 HTML 中含有 .editor 類的第一個元素的內容替換為剪貼板的內容。如果剪貼板為空,或者不包含任何文本,則元素的內容將被清空。這是因為在剪貼板為空或者不包含文本時,readText 方法會返回一個空字符串。

在繼續介紹 Clipboard API 之前,我們先來看一下 Navigator API: clipboard 的兼容性:

(圖片來源:https://caniuse.com/mdn-api_navigator_clipboard)

異步剪貼板 API 是一個相對較新的 API,瀏覽器仍在逐漸實現它。由于潛在的安全問題和技術復雜性,大多數瀏覽器正在逐步集成這個 API。對于瀏覽器擴展來說,你可以請求 clipboardRead 和 clipboardWrite 權限以使用 clipboard.readText() 和 clipboard.writeText()。

好的,接下來阿寶哥來演示一下如何使用 clipboard 對象提供的 API 來操作剪貼板,以下示例的運行環境是 Chrome 87.0.4280.88

三、將數據寫入到剪貼板

3.1 writeText()

writeText 方法可以把指定的字符串寫入到系統的剪貼板中,調用該方法后會返回一個 Promise 對象:

<button?onclick="copyPageUrl()">拷貝當前頁面地址</button>
<script>async?function?copyPageUrl()?{try?{await?navigator.clipboard.writeText(location.href);console.log("頁面地址已經被拷貝到剪貼板中");}?catch?(err)?{console.error("頁面地址拷貝失敗:?",?err);}}
</script>

對于上述代碼,當用戶點擊 拷貝當前頁面地址 按鈕時,將會把當前的頁面地址拷貝到剪貼板中。

3.2 write()

write 方法除了支持文本數據之外,還支持將圖像數據寫入到剪貼板,調用該方法后會返回一個 Promise 對象。

<button?onclick="copyPageUrl()">拷貝當前頁面地址</button>
<script>async?function?copyPageUrl()?{const?text?=?new?Blob([location.href],?{type:?'text/plain'});try?{await?navigator.clipboard.write(new?ClipboardItem({"text/plain":?text,}),);console.log("頁面地址已經被拷貝到剪貼板中");}?catch?(err)?{console.error("頁面地址拷貝失敗:?",?err);}}
</script>

在以上代碼中,我們先通過 Blob API 創建 Blob 對象,然后使用該 Blob 對象來構造 ClipboardItem 對象,最后再通過 write 方法把數據寫入到剪貼板。介紹完如何將數據寫入到剪貼板,下面我們來介紹如何從剪貼板中讀取數據。

對 Blob API 感興趣的小伙伴,可以閱讀 你不知道的 Blob 這篇文章。

四、從剪貼板中讀取數據

4.1 readText()

readText 方法用于讀取剪貼板中的文本內容,調用該方法后會返回一個 Promise 對象:

<button?onclick="getClipboardContents()">讀取剪貼板中的文本</button>
<script>async?function?getClipboardContents()?{try?{const?text?=?await?navigator.clipboard.readText();console.log("已讀取剪貼板中的內容:",?text);}?catch?(err)?{console.error("讀取剪貼板內容失敗:?",?err);}}
</script>

對于上述代碼,當用戶點擊 讀取剪貼板中的文本 按鈕時,如果當前剪貼板含有文本內容,則會讀取剪貼板中的文本內容。

4.2 read()

read 方法除了支持讀取文本數據之外,還支持讀取剪貼板中的圖像數據,調用該方法后會返回一個 Promise 對象:

<button?onclick="getClipboardContents()">讀取剪貼板中的內容</button>
<script>
async?function?getClipboardContents()?{try?{const?clipboardItems?=?await?navigator.clipboard.read();for?(const?clipboardItem?of?clipboardItems)?{for?(const?type?of?clipboardItem.types)?{const?blob?=?await?clipboardItem.getType(type);console.log("已讀取剪貼板中的內容:",?await?blob.text());}}}?catch?(err)?{console.error("讀取剪貼板內容失敗:?",?err);}}
</script>

對于上述代碼,當用戶點擊 讀取剪貼板中的內容 按鈕時,則會開始讀取剪貼板中的內容。到這里 clipboard 對象中涉及的 4 個 API,阿寶哥都已經介紹完了,最后我們來看一下如何實現復制圖像的功能。

五、實現復制圖像的功能

在最后的這個示例中,阿寶哥將跟大家一步步實現復制圖像的核心功能,除了復制圖像之外,還會同時支持復制文本。在看具體代碼前,我們先來看一下實際的效果:

在上圖對應的網頁中,我們先點擊 復制 按鈕,則圖像和文本都會被選中。之后,我們在點擊 粘貼 按鈕,則控制臺會輸出從剪貼板中讀取的實際內容。在分析具體的實現方式前,我們先來看一下對應的頁面結構:

<div?id="container"><img?src="http://cdn.semlinker.com/abao.png"?width="80"?height="80"?/><p>大家好,我是阿寶哥</p>
</div>
<button?onclick="writeDataToClipboard()">復制</button>
<button?onclick="readDataFromClipboard()">粘貼</button>

上面的頁面結構很簡單,下一步我們來逐步分析一下以上功能的實現過程。

5.1 請求剪貼板寫權限

默認情況下,會為當前的激活的頁面自動授予剪貼板的寫入權限。出于安全方面考慮,這里我們還是主動向用戶請求剪貼板的寫入權限:

async?function?askWritePermission()?{try?{const?{?state?}?=?await?navigator.permissions.query({name:?"clipboard-write",});return?state?===?"granted";}?catch?(error)?{return?false;}
}

5.2 往剪貼板寫入圖像和普通文本數據

要往剪貼板寫入圖像數據,我們就需要使用 navigator.clipboard 對象提供的 write 方法。如果要寫入圖像數據,我們就需要獲取該圖像對應的 Blob 對象,這里我們可以通過 fetch API 從網絡上獲取圖像對應的響應對象并把它轉化成 Blob 對象,具體實現方式如下:

async?function?createImageBlob(url)?{const?response?=?await?fetch(url);return?await?response.blob();
}

而對于普通文本來說,只需要使用前面介紹的 Blob API 就可以把普通文本轉換為 Blob 對象:

function?createTextBlob(text)?{return?new?Blob([text],?{?type:?"text/plain"?});
}

在創建完圖像和普通文本對應的 Blob 對象之后,我們就可以利用它們來創建 ClipboardItem 對象,然后再調用 write 方法把這些數據寫入到剪貼板中,對應的代碼如下所示:

async?function?writeDataToClipboard()?{if?(askWritePermission())?{if?(navigator.clipboard?&&?navigator.clipboard.write)?{const?textBlob?=?createTextBlob("大家好,我是阿寶哥");const?imageBlob?=?await?createImageBlob("http://cdn.semlinker.com/abao.png");try?{const?item?=?new?ClipboardItem({[textBlob.type]:?textBlob,[imageBlob.type]:?imageBlob,});select(document.querySelector("#container"));await?navigator.clipboard.write([item]);console.log("文本和圖像復制成功");}?catch?(error)?{console.error("文本和圖像復制失敗",?error);}}}
}

在以上代碼中,使用了一個 select 方法,該方法用于實現選擇的效果,對應的代碼如下所示:

function?select(element)?{const?selection?=?window.getSelection();const?range?=?document.createRange();range.selectNodeContents(element);selection.removeAllRanges();selection.addRange(range);
}

通過 writeDataToClipboard 方法,我們已經把圖像和普通文本數據寫入剪貼板了。下面我們來使用 navigator.clipboard 對象提供的 read 方法,來讀取已寫入的數據。如果你需要讀取剪貼板的數據,則需要向用戶請求 clipboard-read 權限。

5.3 請求剪貼板讀取權限

這里我們定義了一個 askReadPermission 函數來向用戶請求剪貼板讀取權限:

async?function?askReadPermission()?{try?{const?{?state?}?=?await?navigator.permissions.query({name:?"clipboard-read",});return?state?===?"granted";}?catch?(error)?{return?false;}
}

當調用 askReadPermission 方法后,將會向當前用戶請求剪貼板讀取權限,對應的效果如下圖所示:

5.4 讀取剪貼板中已寫入的數據

創建好 askReadPermission 函數,我們就可以利用之前介紹的 navigator.clipboard.read 方法來讀取剪貼板的數據了:

async?function?readDataFromClipboard()?{if?(askReadPermission())?{if?(navigator.clipboard?&&?navigator.clipboard.read)?{try?{const?clipboardItems?=?await?navigator.clipboard.read();for?(const?clipboardItem?of?clipboardItems)?{console.dir(clipboardItem);for?(const?type?of?clipboardItem.types)?{const?blob?=?await?clipboardItem.getType(type);console.log("已讀取剪貼板中的內容:",?await?blob.text());}}}?catch?(err)?{console.error("讀取剪貼板內容失敗:?",?err);}}}
}

其實,除了點擊 粘貼 按鈕之外,我們還可以通過監聽 paste 事件來讀取剪貼板中的數據。需要注意的是,如果當前的瀏覽器不支持異步 Clipboard API,我們可以通過 clipboardData.getData 方法來讀取剪貼板中的文本數據:

document.addEventListener('paste',?async?(e)?=>?{e.preventDefault();let?text;if?(navigator.clipboard)?{text?=?await?navigator.clipboard.readText();}?else?{text?=?e.clipboardData.getData('text/plain');}console.log('已獲取的文本數據:?',?text);
});

而對于圖像數據,則可以通過以下方式進行讀取:

const?IMAGE_MIME_REGEX?=?/^image\/(p?jpeg|gif|png)$/i;document.addEventListener("paste",?async?(e)?=>?{e.preventDefault();if?(navigator.clipboard)?{let?clipboardItems?=?await?navigator.clipboard.read();for?(const?clipboardItem?of?clipboardItems)?{for?(const?type?of?clipboardItem.types)?{if?(IMAGE_MIME_REGEX.test(type))?{const?blob?=?await?clipboardItem.getType(type);loadImage(blob);return;}}}}?else?{const?items?=?e.clipboardData.items;for?(let?i?=?0;?i?<?items.length;?i++)?{if?(IMAGE_MIME_REGEX.test(items[i].type))?{loadImage(items[i].getAsFile());return;}}}
});

以上代碼中的 loadImage 方法用于實現把復制的圖片插入到當前選區已選擇的區域中,對應的代碼如下:

function?loadImage(file)?{const?reader?=?new?FileReader();reader.onload?=?function?(e)?{let?img?=?document.createElement("img");img.src?=?e.target.result;let?range?=?window.getSelection().getRangeAt(0);range.deleteContents();range.insertNode(img);};reader.readAsDataURL(file);
}

在前面代碼中,我們監聽了 document 對象的 paste 事件。除了該事件之外,與剪貼板相關的常見事件還有 copycut 事件。篇幅有限,阿寶哥就不繼續展開介紹了,感興趣的小伙伴可以自行閱讀相關資料。

好的,至此本文就已經結束了,希望閱讀完本文之后,大家對異步的 Clipboard API 會有些了解,有寫得不清楚的地方,歡迎你隨時跟阿寶哥交流喲。

六、參考資源

  • 維基百科 - 剪貼板

  • MDN - Clipboard

  • MDN - execCommand

  • Web.dev - async-clipboard

推薦閱讀

若川知乎高贊:有哪些必看的 JS庫?
我在阿里招前端,我該怎么幫你?(現在還可以加模擬面試群)
如何拿下阿里巴巴 P6 的前端 Offer
如何準備阿里P6/P7前端面試--項目經歷準備篇
大廠面試官常問的亮點,該如何做出?
如何從初級到專家(P4-P7)打破成長瓶頸和有效突破
若川知乎問答:2年前端經驗,做的項目沒什么技術含量,怎么辦?

末尾

你好,我是若川,江湖人稱菜如若川,歷時一年只寫了一個學習源碼整體架構系列~(點擊藍字了解我)

  1. 關注若川視野,回復"pdf" 領取優質前端書籍pdf,回復"1",可加群長期交流學習

  2. 我的博客地址:https://lxchuan12.gitee.io?歡迎收藏

  3. 覺得文章不錯,可以點個在看呀^_^另外歡迎留言交流~

精選前端好文,伴你不斷成長

若川原創文章精選!可點擊

小提醒:若川視野公眾號面試、源碼等文章合集在菜單欄中間【源碼精選】按鈕,歡迎點擊閱讀,也可以星標我的公眾號,便于查找

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276241.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276241.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276241.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機大數據的前景方向_計算機方向,網絡與信息安全和大數據哪個前景好一點?...

大數據是我目前的研究方向之一&#xff0c;我也曾經做過網絡安全相關的項目&#xff0c;主要涉及的是各種網絡環境下數據傳輸的安全處理方案。另外&#xff0c;我曾經給高校的學生做過網絡安全的系列講座&#xff0c;系統地整理過網絡安全的相關內容&#xff0c;所以我來談一談…

Smarty 顯示大括號 | 在Smarty中計算數組元素的長度 | Smarty字符串拼接

參考鏈接&#xff1a;http://hi.baidu.com/bdusnb/item/289d160e6a9c92cd9157183d 參考鏈接&#xff1a;http://hi.baidu.com/mayimu789/item/b565088d047da0d05f0ec16f 參考鏈接&#xff1a;http://blog.sina.com.cn/s/blog_8155e74d0101el2k.html Smarty 3 &#xff1a;大…

ftp協議分析(一)

作者: 肖建彬 | 可以轉載, 轉載時務必以超鏈接形式標明文章原始出處和作者信息及版權聲明網址&#xff1a;http://www.xiaojb.com/archives/it/ftp.shtml根據是使用port模式還是passive模式&#xff0c;ftp使用不同的tcp端口號&#xff0c;在詳細描述ftp前&#xff0c;我們來簡…

JavaScript 元編程

大家好&#xff0c;我是若川。今天給分享一篇來自freecodecamp的好文。我是freecodecamp杭州社區組織者之一&#xff0c;有一群小伙伴一起組織線下分享活動&#xff0c;不過2020年我們杭州社區幾乎沒有活躍&#xff0c;我也沒有什么貢獻。另外&#xff0c;我的公眾號「若川視野…

python 異常處理模塊_擴展Python模塊系列(五)----異常和錯誤處理

在上一節中&#xff0c;討論了在用C語言擴展Python模塊時&#xff0c;應該如何處理無處不在的引用計數問題。重點關注的是在實現一個C Python的函數時&#xff0c;對于一個PyObject對象&#xff0c;何時調用Py_INCREF和Py_DECREF。在編寫C語言代碼時&#xff0c;需要了解Python…

常見的php筆試題(附答案)搜集整理

轉載鏈接&#xff1a;http://www.yaojinbu.com/p/139.html 常見的php筆試題&#xff08;附答案&#xff09;搜集整理 1.在PHP中&#xff0c;當前腳本的名稱&#xff08;不包括路徑和查詢字符串&#xff09;記錄在哪個預定義變量中&#xff1f;而鏈接到當前頁面的URL又記錄在哪個…

Js整理備忘(02)——運算符

1、運算符的表示以及優先級 Javascript&#xff08;以下簡寫為Js&#xff09;的大部分運算符與C或Java是類似的。 記得剛學C語言時老師講的優先級口訣&#xff0c;非常好記&#xff1a;“括、單、算、移、關”“位、邏、條、賦、逗”&#xff0c;此處也可以套用一下&#xff0c…

手寫一個合格的前端腳手架

為什么我們需要一套腳手架為什么我們需要一套腳手架&#xff0c;它能幫助我們解決哪些痛點問題。?前端項目配置越來越繁瑣、耗時&#xff0c;重復無意義的工作?項目結構不統一、不規范?前端項目類型繁多&#xff0c;不同項目不同配置&#xff0c;管理成本高?腳手架也可以是…

第一篇cnblog!

本人才疏學淺&#xff0c;終于通過了cnblog的審核&#xff0c;興奮之余&#xff0c;發表感言——不容易啊&#xff01;在我的博聞里面&#xff0c;隨筆類當然就是技術類的比較多的&#xff0c;特別是實例類的。理論類的大部分放在文章板塊&#xff0c;本人e文特別好(哈哈&#…

解決error 1045: Access denied for user: 'root@localhost' (Using password: YES)

轉載連接&#xff1a;http://jianfw2009.blog.163.com/blog/static/13431366020111016112459158/ 1、先停止mysql服務2、在mysql的目錄下找到my.ini&#xff0c;在[mysqld]后面加上skip-grant-tables3、啟動mysql服務,打開Command Line Client以空密碼登錄4、退出mysql,并停止服…

fillcolor是什么意思_fill是什么意思

1. (使)裝滿;(使)注滿;(使)充滿If you fill a container or area, or if it fills, an amount of something enters it that is enough to make it full.e.g.Fill a saucepan with water and bring to a slow boil...往平底鍋里加滿水,小火煮沸。e.g.She made sandwiches, fill…

利用JMeter進行壓力測試(1)(轉)

轉自&#xff1a;http://www.cnblogs.com/game-over/archive/2010/01/08/1642685.html壓力測試以軟件響應速度為測試目標&#xff0c;尤其是在較短時間內大量并發用戶的同時訪問時&#xff0c;軟件的性能和抗壓能力。 JMeter是一款開源的壓力測試工具&#xff0c;目前最新Rele…

MyISAM InnoDB 區別

轉載鏈接&#xff1a;http://www.php100.com/html/webkaifa/database/Mysql/2011/0326/7789.html MyISAM 和 InnoDB 講解 InnoDB和MyISAM是許多人在使用MySQL時最常用的兩個表類型&#xff0c;這兩個表類型各有優劣&#xff0c;視具體應用而定。基本的差別為&#xff1a;MyISAM…

Git 內部原理圖解——對象、分支以及如何從零開始建倉庫

我們中的許多人每天都在使用 git&#xff0c;但是有多少人知道它的內部是怎么運作的呢&#xff1f;例如我們使用 git commit 時發生了什么&#xff1f;提交&#xff08;commit&#xff09;與提交之間保存的是什么&#xff1f;兩次提交之間難道只是文件的差異&#xff08;dif…

wpsmac和pc版的區別_Mac版WPS Office和微軟Office 2019哪個更好?

眾所周知&#xff0c; macOS系統生態下&#xff0c;有許多界面精美、功能強大、體驗出色的軟件&#xff0c;但提到辦公套件&#xff0c;人們首先想到的還是微軟 Office 套件&#xff0c;其中的Word、 Excel 以及PPT&#xff0c;但用戶體驗并不如意。但現在&#xff0c;蘋果用戶…

A tutorial video for MindManager for free

MindManager 2016 for Windows Essential Training 本人學習的時候使用的是MindManager 2018版本的&#xff0c;和2016版本差異不大。 轉載于:https://www.cnblogs.com/kelamoyujuzhen/p/10253278.html

Google, 請不要離開我們!

雖然我是.net陣營, 力挺Silverlight, 但是我真心希望谷歌留在中國, 如果她能夠靠談判求的言論自由的權利, 那將對中國的擁有自由信仰的一族產生重大的影響. 谷歌離開了中國, 不是她想拋棄中國市場, 而是中國決策者背叛了人性. 在此留下 Google 2010年1月14日的logo, 智慧的幽默…

高級php面試題及部分答案

轉載鏈接&#xff1a;http://www.2cto.com/kf/201304/201112.html 一. 基本知識點 1.1 HTTP協議中幾個狀態碼的含義:503 500 401 403 404 200 301 302。。。 200 : 請求成功&#xff0c;請求的數據隨之返回。 301 : 永久性重定向。 302 : 暫時行重定向。 401 : 當前請求需要用…

iec104點號_IEC104報文流程(有常用類型標識解釋)

參數地址圍類別97版基地址2002版基地址遙信1H------400H1H------4000H遙測701H------900H4001H------5000H遙控B01------B806001H------6100H設點B81H------C00H6201H------6400H電度C01H------C80H6401H------6600H遙測和遙信個數不設置上限&#xff0c;可以沒有上限限制&…

本周ASP.NET英文技術文章推薦[04/08 - 04/14](附贈自彈超級瑪麗主題曲)

摘要 本期共有6篇文章&#xff1a; ASP.NET編譯問題的公開Hotfix補丁 期待下個版本AjaxPro 的發布 在ASP.NET 2.0中使用MultiView控件實現多頁面表單 數據綁定的技巧&#xff1a;嵌套Eval語句 在ASP.NET 2.0中訪問并更新數據&#xff1a;使用數據源控件以編程方式訪問數據 AD…