html5中提供了worker 可以讓javascript多線程 具體是不是真正的多線程我沒去研究,只是知道,你可以看下
創(chuàng)新互聯(lián)建站專注于成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站開發(fā)。公司秉持“客戶至上,用心服務(wù)”的宗旨,從客戶的利益和觀點(diǎn)出發(fā),讓客戶在網(wǎng)絡(luò)營銷中找到自己的駐足之地。尊重和關(guān)懷每一位客戶,用嚴(yán)謹(jǐn)?shù)膽B(tài)度對(duì)待客戶,用專業(yè)的服務(wù)創(chuàng)造價(jià)值,成為客戶值得信賴的朋友,為客戶解除后顧之憂。
PS: html5以前的 基本可以確定 不管用什么庫和方法去模擬多線程 本質(zhì)上都是單線程的 尤其是為了解決界面阻塞 想通過多線程在另外線程中組裝數(shù)據(jù)的做法基本都不行。
最好的辦法就是在耗時(shí)函數(shù)開始的過程中加進(jìn)度條等待耗時(shí)函數(shù)執(zhí)行完畢~
1、iframe的創(chuàng)建比一般的DOM元素慢了1-2個(gè)數(shù)量級(jí)
iframe的創(chuàng)建比其他包括scripts和css的DOM元素的創(chuàng)建慢了1-2個(gè)數(shù)量級(jí)。當(dāng)然頁面一般不會(huì)包含太多的iframe,所以創(chuàng)建DOM節(jié)點(diǎn)花費(fèi)的時(shí)間還不會(huì)占很大比重。
2、阻塞頁面加載
及時(shí)觸發(fā)window的onload事件是非常重要的。onload事件觸發(fā)使瀏覽器的“忙”指示器停止,告訴用戶當(dāng)前網(wǎng)頁已經(jīng)加載完畢。當(dāng)onload事件加載延遲后,它給用戶的感覺是這個(gè)網(wǎng)頁非常慢。
window的onload事件需要在所有iframe加載完畢后(包含里面的元素)才會(huì)觸發(fā)。通過Javascript動(dòng)態(tài)設(shè)置iframe的src可以避免這種阻塞情況。
3、唯一的連接池
瀏覽器只能開少量的連接到web服務(wù)器。絕大部分瀏覽器,主頁面和其中的iframe是共享這些連接的。這意味著iframe在加載資源時(shí)可能用光了所有的可用連接,從而阻塞了主頁面資源的加載。如果iframe中的內(nèi)容比主頁面的內(nèi)容更重要,這當(dāng)然是好的。但通常情況下,iframe里的內(nèi)容是沒有主頁面重要的。這時(shí)iframe用光可用連接就不值得了。
4、不利于SEO
搜索引擎的檢索程序無法解讀iframe。另外,iframe本身不是動(dòng)態(tài)語言,樣式和腳本都需要額外導(dǎo)入。
綜上,iframe應(yīng)謹(jǐn)慎使用。
首先,很多命令都是阻塞的,比如DOM操作、localStorage的讀取。但是這里談?wù)撟枞麤]有什么意義,因?yàn)椴僮骱芸炀屯瓿闪恕?/p>
其次,Node.js里面很多IO可以是阻塞的,但是猜想題主問的是瀏覽器環(huán)境下的JavaScript,所以就不討論了。
再其次,Webworker里面有很多操作可以是阻塞的,但是這同樣沒有什么意義,因?yàn)閣orker與主線程之間是只能夠使用異步通訊的。
無阻塞加載js
瀏覽器加載靜態(tài)資源和js的方式都是線性加載,所以一般情況可以將js放到/body前,防止UI線程的阻塞。
而某些時(shí)候我們既希望js在整個(gè)網(wǎng)頁的頭部就加載,又擔(dān)心js阻塞導(dǎo)致網(wǎng)站加載緩慢,就可以用到無阻塞加載js技術(shù)。
Dynamic Script Elements 動(dòng)態(tài)腳本元素
DOM允許我們使用Javascript動(dòng)態(tài)創(chuàng)建HTML的幾乎所有文檔內(nèi)容,一個(gè)新的script元素可以非常容易的通過標(biāo)準(zhǔn)DOM創(chuàng)建:
var script = document.createElement ("script"); script.type = "text/javascript"; script.src = "file1.js"; document.body.appendChild(script);
新的script元素加載file1.js源文件。此文件當(dāng)元素添加到頁面后立刻開始下載。此技術(shù)的重點(diǎn)在于:無論在何處啟動(dòng)下載,文件的下載和運(yùn)行都不會(huì)阻塞其他頁面處理過程。
當(dāng)文件使用動(dòng)態(tài)腳本節(jié)點(diǎn)下載時(shí),返回的代碼通常立即執(zhí)行(除了Firefox和Opera,它們將等待此前的所有動(dòng)態(tài)腳本節(jié)點(diǎn)執(zhí)行完畢)。
大多數(shù)情況下,我們希望調(diào)用一個(gè)函數(shù)就可以實(shí)現(xiàn)Javascript文件的動(dòng)態(tài)下載。下面的函數(shù)封裝實(shí)現(xiàn)了標(biāo)準(zhǔn)實(shí)現(xiàn)和IE實(shí)現(xiàn):
function loadScript(url, callback){ var script = document.createElement ("script") ; script.type = "text/javascript"; if (script.readyState){ //IE script.onreadystatechange = function(){ if (script.readyState == "loaded" || script.readyState == "complete"){ script.onreadystatechange = null; callback(); } }; } else { //Others script.onload = function(){ callback(); }; } script.src = url; document.getElementsByTagName("head")[0].appendChild(script); } loadScript("file1.js", function(){ //調(diào)用 alert("File is loaded!"); });
此函數(shù)接受兩個(gè)參數(shù):Javascript文件的Url和一個(gè)當(dāng)Javascript接收完成時(shí)觸發(fā)的回調(diào)函數(shù)。屬性檢查用于決定監(jiān)視哪種事件。最后一步src屬性,并將javascript文件添加到head。
動(dòng)態(tài)腳本加載是非阻塞Javascript下載中最常用的模式,因?yàn)樗梢钥鐬g覽器,而且簡單易用。
js是單線程的,所以當(dāng)某一步計(jì)算耗時(shí)過多,就會(huì)產(chǎn)生阻塞現(xiàn)象。
一般采用 異步 ?的方式實(shí)現(xiàn)非阻塞,es5之前用閉包,es6有了一個(gè)新的概念promise。
主要有兩個(gè)可能出問題的地方:1.ajax請求是同步的(open方法的參數(shù)中,可以設(shè)置)
2.ajax請求的服務(wù)器端asp頁面可能使用了session,導(dǎo)致頁面被鎖死。關(guān)閉ajax所請求的頁面的session(是ajax請求的頁面,不是ajax所在的頁面)