為什麼要參加鐵人賽?每個人的答案不盡相同,我呢?因為之前JS學得2266,導致開發專案時一直碰壁,有問題就Google,就算問題解決了,卻還是不知問題的根源,下次再遇到,還是一樣。想必有很多人都有類似的經歷,尤其是初學者,如此的惡性循環讓我痛定思痛,我要學好JavaScript!!!
參加鐵人賽,是希望能藉此將我所學的,藉由文字表達出來。唯有透過表達,不管是文字或是言語,才能釐清觀念,而不是心裡那種模模糊糊、似懂非懂的概念。
正在看這篇文章的非參賽者,也許你也想參與,但因為工作因素,或是看了他人文章,認為自己寫的搬不上檯面,亦認為自己不善表達,這些因素而放棄。我身邊也有這樣的人,我鼓勵他們,當你想要達成一件目標的時候,如果決心夠堅定,時間根本不是問題。也不要擔心文章太簡單,沒有內容,寫錯被噹,試問,哪個資深的前輩不是這樣過來的呢?萬丈高樓平地起阿!不過目前看來,只有我參賽XD。
這系列的文章,我會把它定位在筆記的形式,不只是寫給各位看的,更是寫給我自己看的。
當中,或許有些地方解釋不盡完善,觀念錯誤,請各位不吝指教,
最後希望這JS筆記,能幫助一同在路上奮鬥的夥伴。
使用者在瀏覽器網址列,輸入網址(url),送出請求(request)至網路伺服器。伺服器收到請求後,根據請求的內容,回傳一份由JS、HTML、CSS構成的訊息。
瀏覽器收到後,開始解析,進入建立Web頁面的階段。首先解析HTML,建立DOM,並儲存於記憶體中。套用CSS樣式,若無,則套用預設樣式於HTML,根據HTML與CSS的描述,呈現頁面。
建立頁面的時候,如遇到script元素,表示這段內容是用來執行JS程式碼的,這時,瀏覽器會停止載入HTML,瀏覽器內部的JS引擎會執行JS程式碼。
<p>JS執行前</p>
<script src="./app.js"></script>
<p>JS執行後</p>
●在兩段HTML元素之間插入script元素,觀察執行過程,首先會顯示:
●當解析到script元素,瀏覽器會進入JS並且執行:
●直到按下確定,這段JS才算執行完畢,繼續解析剩餘的HTML成DOM:
如果再遇到script元素,就重複剛剛的步驟。
以上為建立頁面的過程,接下來進入Web應用程式的第二個步驟:事件處理。
JS讓網頁具有互動性,所謂的互動性是指,針對不同的事件觸發產生不同的反應,譬如點擊滑鼠、滾動卷軸、計時限制、按下特定鍵盤之類的,那要怎麼知道這些的事件被觸發呢?
我們可以在剛剛的第一階段設置事件監聽器,在整個Web應用程式生命週期結束之前,事件監聽器會一直監控Web中是否有指定的事件觸發。
當有事件觸發的時候,它的過程是這樣的:
事件會依發生的順序放入事件佇列中,事件佇列可以看成一個容器,裡面放著待處理的事件。
瀏覽器會一直檢查事件佇列是否有待辦事件,如有,它會依照放入的先後順序處理,該事件處理完成,將之移出佇列,繼續處理下一個事件,直到全部處理完畢,再繼續監控佇列,直到又有新的事件進入,它又再次處理,一直循環此過程。
瀏覽器執行JS的過程,是單執行緒(single-threaded),也就是說,它一次只能處理一個事件,當有數個事件時,就只能排排站,讓瀏覽器依序處理,為了因應這樣的特性,才有事件佇列的機制。
以下為範例。
HTML
<p>滑鼠水平座標:<span id="position"></span> </p>
<p>滑鼠點擊次數:<span id="count">0</span> </p>
<script src="./app.js"></script>
JS
var x = 1;
document.addEventListener("mousemove", function (e) {
document.getElementById('position').textContent = e.clientX;
})
document.addEventListener('click', function () {
document.getElementById('count').textContent = x++;
})
我們設置2個事件,分別是監聽滑鼠水平移動的座標以及點擊次數。
在生命週期第一階段頁面建置完成後,進入第二階段,事件處理。假設我們移動滑鼠後再點擊,這兩個事件會依序進入事件佇列中,瀏覽器再從事件佇列中先處理水平移動的座標,完成後,將事件移出佇列,再處理點擊次數,完成再移出佇列。關於佇列的細節,我們會在同步與非同步再說明,這邊只要記得事件會進入佇列,等待瀏覽器處理。
以上就是Web應用程式的生命週期,第二階段會一直循環,直到我們把瀏覽器關掉,它的生命週期也隨之結束。
參考來源:
忍者:JavaScript開發技巧探秘 第二章
抱歉 冒昧請問您 事件佇列(queue) 這個用法是從哪裡引用來的呢?
目前我查到的大部分都是 任務佇列(task queue),而且也不會縮寫成 (queue)
這個說法是 忍者:JavaScript開發技巧探秘 第二章 裡面有的嗎?
你指的是
事件會依發生的順序放入事件佇列(queue)中,事件佇列可以看成一個容器,裡面放著待處理的事件。
這段?
不是 單純 事件佇列(queue) 這個說法
我先聲明,我的的確確沒有抄襲,這部分你誤會了
有疑慮的部分,我會持續跟你溝通,直到你解開誤解
解釋事件佇列(queue)的段落是我自己打的,
事件佇列(queue)這個用詞,可能不是很正確,我剛查過的確是任務佇列(task queue)居多,
我想釐清你的意思是?觀念有抄襲?
重點來了,我也用 事件佇列(queue) 這個用詞,這麼巧您自己打也會和我一樣喔?
所以這算抄襲?那只能請主辦單位評判了
我沒抄襲,就這樣
很遺憾地,不是通篇一樣,所以要證明抄襲需要走法律途徑,主辦單位無法評斷。
但您自己摸著良心說,內容完全沒有參考到我的文章嗎?
話已至此..............
大家來心平氣和來談吧,針鋒相對不能解決問題。
function部分,我在參考書籍的時候,內容順序就隨著書的章節排下來,篇排順序跟書一樣。
事件佇列(queue),說實話,我只知道原理,沒特別注意名稱就很自然而然地打出來,
跟你同名,網路又找不到相同的,真的只是單純巧合。
如果我真的要抄襲,不會只抄'事件佇列(queue)'這幾個字,也不會只用一次。
而是把整篇文章COPY過來,然後玩文字遊戲,改改文字,讓文章看起來不要相同就好。
若你真的介意,我可以改掉。
至於字串跟陣列的範例,我有參考MDN,可能才讓你誤解。
直到你告知這件事,我才看過你文章,之前完全沒看過。
不管怎樣,你我都素昧平生,大家都是因為熱愛這技術,才藉由鐵人賽挑戰自己,分享自己所學的,不是嗎?
我希望能把時間花在提升自己,進而為前端的學習風氣,注入正能量。
若因此交惡,相信彼此不都樂見。
我能說的,都說了,接受與否在於你,若接受了,大家就當交個朋友吧。