摘要:一個是使用錨鏈接,即的方式實現(xiàn)。做程序的人大多了解測試。傳統(tǒng)的測試方法就是在完成后手動去觸發(fā)事件,然后手動輸入來檢測是否得到預期的效果。引入了測試框架后工作簡單了很多。前篇傳送門給自己挖個坑,開始去開發(fā)富應用框架從的源碼開始說事件模型
URL 存在的意義在于使用者可以使用一段字符串就可以找到對應的資源。富應用中的內容改變都是通過 Javascript 去改變文檔內容,某種角度上來說整個網(wǎng)站其實只需要一個 URL。如果真的使用同一個URL的話,用戶就無法快速的通過特定字符串進入他想到達到資源。就像搜索引擎的表單都是 GET 而不是 POST,你可以把你搜索結果的鏈接發(fā)給你的朋友,然后他們也可以看到相同的內容。于是必須允許 URL 變化。
URL 變化卻不會讓網(wǎng)頁從新載入只有兩種方法。一個是使用錨鏈接,即 http://url/#path 的方式實現(xiàn)。另一種就是需要瀏覽器支持的 history.pushState ,后者 github 有使用,Pajax 方案也是使用了這種方法。由于是寫的第一版,目前只實現(xiàn)了錨鏈接的實現(xiàn)。
相關代碼傳送門:https://github.com/HaiyiYun/VintJS/blob/master/src/location.js
由于 URL 改變后瀏覽器沒有觸發(fā)新的請求,就意味著你需要通過 Javascript 去知道 URL 發(fā)生了變化。HTML5 的規(guī)范中同時規(guī)定了onhashchange 的方法,老式的瀏覽器和 IE 的 documentMode 下面都不支持,于是就需要使用 setInterval 方法來不斷的讀取當前 url ,如果 url 發(fā)生了變化就要觸發(fā)相應的事件。之前的事件模型在這里又派上了用途。直接 this.trigger("urlChange") 便完成了這里的工作,而不需要去考慮路由的代碼或者其他地方的代碼。
此時還需要的工作就是去解析新的 URL ,先獲取當前的絕對地址,然后去解析。具體參考 __checkUrl 的源碼。分成當前的 path ,這個會影響當前使用的路由,還有就是 search 的對象。這一塊的代碼是在閱讀了 Angularjs 的基礎上完成的,同時也引用了 Angularjs 的 hash_prefix 設置。谷歌開發(fā)文檔中有提到 Ajax Url 的規(guī)則,傳送門:https://developers.google.com/webmasters/ajax-crawling/docs/getting-started?hl=zh-CN ,#! 的規(guī)則是比較友好的做法,所以預留了這個設置。
完成解析工作后要做的就是去試著改變 URL。直接改變 URL,其中還包括 location.herf = "xxx" 和 location.replace("xxx") 兩種方式的區(qū)別。一種會在瀏覽器的歷史記錄里面留下痕跡,一種不會。然后需要改變 path ,改變 search 的對應的方法,還有就是獲取當前 url 、 path 、 search 的方法。
這些都完成之后, URL 相關的功能基本上就告一段落。接下來要做的就是路由,將當前的 path 解析至對應的路由上面去并去渲染頁面。
華麗麗的分隔符后開始說說 javascript 的測試。
做程序的人大多了解測試。寫完一個函數(shù)后就去測試一下,看看寫出來的代碼是不是能夠達到自己預期的目標。瀏覽器的 javascript 除了要驗證函數(shù)的輸入是否覆蓋全面、結果是否等于預期,還需要防止自己的代碼在一些特定的瀏覽器上面存在bug。傳統(tǒng)的測試方法就是在完成后手動去觸發(fā)事件,然后手動輸入來檢測是否得到預期的效果。在接觸具體的測試框架前,我自己的做法常常是在代碼里面寫一些測試的代碼,然后輸出檢測是否和預期相同。這種的問題就是如果需要檢驗多種瀏覽器的話,工作比較累贅。
引入了測試框架后工作簡單了很多。例如 Qunit,jasmine, 我現(xiàn)在用的是 jasmine ,傳送門:http://pivotal.github.io/jasmine/ 。寫完一個方法,然后寫一些簡單的測試用例,在所有瀏覽器上面允許就可以知道結果。而無需自己去手動觸發(fā)或者是寫代碼輸出然后去比照。
前篇傳送門:
給自己挖個坑,開始去開發(fā)javascript富應用框架
從 BackboneJS 的源碼開始說事件模型
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77943.html
摘要:彈出層是一個輕量級的庫用于管理工具提示和彈窗效果。一個帶有的跨瀏覽器富文本編輯器。由制作,適用于每天寫作的富文本編輯器。輕量的操作庫。是一個快速簡單輕量級的瀏覽器功能檢測庫。它沒有任何的依賴,并且壓縮后僅有。極小跨平臺的全屏插件。 在這里維持一個持續(xù)更新的地方 圖片 baguetteBox.js - 是一個簡單易用的響應式圖像燈箱效果腳本。demo Lightgallery.js -...
摘要:彈出層是一個輕量級的庫用于管理工具提示和彈窗效果。一個帶有的跨瀏覽器富文本編輯器。由制作,適用于每天寫作的富文本編輯器。輕量的操作庫。是一個快速簡單輕量級的瀏覽器功能檢測庫。它沒有任何的依賴,并且壓縮后僅有。極小跨平臺的全屏插件。 在這里維持一個持續(xù)更新的地方 圖片 baguetteBox.js - 是一個簡單易用的響應式圖像燈箱效果腳本。demo Lightgallery.js -...
摘要:彈出層是一個輕量級的庫用于管理工具提示和彈窗效果。一個帶有的跨瀏覽器富文本編輯器。由制作,適用于每天寫作的富文本編輯器。輕量的操作庫。是一個快速簡單輕量級的瀏覽器功能檢測庫。它沒有任何的依賴,并且壓縮后僅有。極小跨平臺的全屏插件。 在這里維持一個持續(xù)更新的地方 圖片 baguetteBox.js - 是一個簡單易用的響應式圖像燈箱效果腳本。demo Lightgallery.js -...
摘要:一個專注于瀏覽器端和兼容的包管理器。一個整合和的最佳思想,使開發(fā)者能快速方便地組織和編寫前端代碼的下一代包管理器。完全插件化的工具,能在中識別和記錄模式。健壯的優(yōu)雅且功能豐富的模板引擎。完整的經(jīng)過充分測試和記錄數(shù)據(jù)結構的庫。 【導讀】:GitHub 上有一個 Awesome – XXX 系列的資源整理。awesome-javascript 是 sorrycc 發(fā)起維護的 JS 資源列表...
閱讀 3247·2021-11-18 10:02
閱讀 1952·2021-09-22 10:54
閱讀 2995·2019-08-30 15:43
閱讀 2582·2019-08-30 13:22
閱讀 1583·2019-08-29 13:57
閱讀 1050·2019-08-29 13:27
閱讀 741·2019-08-26 14:05
閱讀 2529·2019-08-26 13:30