JavaScript是一門(mén)廣泛運(yùn)用于Web前端頁(yè)面上的編程語(yǔ)言,廣為人知的是JavaScript在處理前端動(dòng)態(tài)性方面擁有眾多優(yōu)秀的功能。但是,還有一個(gè)問(wèn)題始終困擾著開(kāi)發(fā)者,那就是JavaScript無(wú)法直接復(fù)制內(nèi)容至剪切板。
雖然網(wǎng)頁(yè)的復(fù)制功能已經(jīng)相當(dāng)普及,但是從Web頁(yè)面上復(fù)制固定的文本到剪切板卻不是一件很容易的事情,因?yàn)镴S中并沒(méi)有提供復(fù)制到剪切板的方式。我們可以嘗試寫(xiě)一個(gè)簡(jiǎn)單的函數(shù):
function copyToClipboard(text) { var input = document.createElement('input'); input.style.position = 'fixed'; input.style.opacity = 0; input.value = text; document.body.appendChild(input); input.select(); document.execCommand('copy'); document.body.removeChild(input); }
但是,很明顯這個(gè)函數(shù)并不能完全實(shí)現(xiàn)復(fù)制到剪切板的功能, 因?yàn)樗皇菍?nèi)容寫(xiě)到一個(gè)輸入框里,點(diǎn)擊“復(fù)制”按鈕,瀏覽器將選中這個(gè)輸入框中的文本,既然用戶能夠點(diǎn)擊“復(fù)制”按鈕,為什么不直接手工復(fù)制呢?
實(shí)際上,這就是JS無(wú)法復(fù)制的最根本原因,因?yàn)闉g覽器的安全策略的限制,JS無(wú)法直接操作剪切板的內(nèi)容。瀏覽器的安全限制是很嚴(yán)格的,它不允許JS訪問(wèn)任何非JS源的元素和屬性,而剪切板屬于系統(tǒng)級(jí)功能,屬于非JS源。
解決這個(gè)問(wèn)題較為麻煩,你需要借助瀏覽器的Flash插件或者Silverlight控件進(jìn)行復(fù)制。Flash、Silverlight等插件可以通過(guò)瀏覽器提供的相應(yīng)方法調(diào)用操作系統(tǒng)底層API,實(shí)現(xiàn)對(duì)剪切板的操作。這種方式雖然能夠解決粘貼板無(wú)法復(fù)制的問(wèn)題,但是由于平臺(tái)差異性很大而導(dǎo)致的可用性和兼容性問(wèn)題也十分麻煩。
在jQuery等框架出現(xiàn)前,為了解決這個(gè)問(wèn)題,開(kāi)發(fā)者們不得不另外單獨(dú)編寫(xiě)Flash或者Silverlight插件,而這對(duì)于絕大多數(shù)前端開(kāi)發(fā)者來(lái)說(shuō),顯然十分麻煩。而框架的出現(xiàn),可以一定程度上解決這個(gè)問(wèn)題,例如若要用jQuery實(shí)現(xiàn)復(fù)制功能,可以使用Clipboard.js這個(gè)插件,非常方便。
綜上所述,JavaScript無(wú)法復(fù)制文本的問(wèn)題并非JS的功能缺陷,而是瀏覽器的安全限制強(qiáng)制導(dǎo)致的結(jié)果。盡管有了很多解決方案,但仍然是個(gè)十分麻煩的問(wèn)題。