html頁面不經過後臺邏輯直接動態獲取js文件

最近有個任務是要在頁面上讀取服務器上實現預存好的json文本數據,而後經過jqplot在頁面上將json數據顯示成圖表;並且要有查詢功能,服務器上的json數據,根據時間順序分割成一個個的小文件,根據時間便可獲取惟一的json文件……javascript

一開始我立刻就想到前臺經過xmlhttprequest想後臺服務器發出異步請求,而後後臺根據請求讀取對應的json文件,而後解析成文件流,再往頁面寫……這樣子實現起來並不難,可是頭說,這樣太笨重了,一個小小的獲取服務器本地的json數據,根本不須要後臺邏輯加傳輸的,所有放到前臺去作!前端

這就意味着我失去了後臺這個強大有力的支持,單單靠js來獲取json文件數據,一點頭緒都沒有,由於js沒有什麼文件操做的對象和函數(IE下彷佛有,可是不通用……),很傷腦筋,後來想到一個解決方案:java

咱們的json數據是存放在一個個的js文件中的,因而我想到了動態加載script元素,使用document.createElement("script");方法建立script元素,而後加到head元素中去,並且咱們的json數據都是規範過的,有對應惟一約定好的變量名,這樣只要加載成功就能夠動態地經過拼接變量名獲得裏面存儲的json數據了,最後,能夠成功讀取json數據了,這中間也遇到的不少問題,可是有個比較致命的問題讓我放棄了這種方法!chrome

這個問題在IE8中是沒有的,而在chrome中就比較鬱悶,由於script的加載,並非append語句一執行,js文件裏的腳本就立刻可使用,他還有一個加載的過程,並且是異步的,不等它加載完成,後面的代碼就已經開始執行了:json

var js=document.createElement("script");
js.type="text/javascript";
js.src="/js.js";
var head=document.getElementByTagName("head")[0];
head.append(js);
//假如jsonData就是加載的js文件中json的變量名
alert(jsonData);
這樣的執行下來,alert這一句就會報錯了,說是變量名沒有定義,可是使用chrome審查元素的功能看的時候,發現個人script元素確實加進去了,並且稍後,我再去alert(jsonData)的時候,就能夠顯示出object了,這樣子問題就很大了,我哪裏知道它何時加載完成啊,後來也有解決方:

var js=document.createElement("script");
js.type="text/javascript";
js.src="/js.js";
var head=document.getElementByTagName("head")[0];
head.append(js);
//加這一句,寫上回調函數:
js.onload=function()
{
  //假如jsonData就是加載的js文件中json的變量名
   alert(jsonData);
}

這樣的話,就會alert說你的jsonData是object了,可是這樣仍然有問題,由於我要加載的js文件不止一個,並且有些用戶要求查詢的數據是不存在的,也就是說有的src路徑是不存在的,並且,我是須要等到全部的js文件獲取好了以後,將裏面的全部json數據讀取出來而且顯示,或者說,每加載一個js文件就讀取一次json數據就將這個數據顯示出來,一直到結束,可是由於有些限制,數據沒法一個一個顯示,只能一塊兒顯示,因此我必須知道這些js文件何時加載完成,或者說告訴我哪個js文件是最後一個加載結束……顯然這裏有很大的困難,至少我如今沒有想到什麼好的辦法來解決這個問題,只能放棄這種方案。

最後仍是回到了服務器上,可是,除了服務器自己以外並無任何後臺實現,服務器純粹是做爲一個容器而已,方案就是使用xmlhttprequest經過url地址同步獲取js文件!哈哈,覺得這個可讓他同步獲取而不是異步,這樣我就好控制了,剩下的問題就是在前端拼接出文件路徑和文件名來!服務器

相關文章
相關標籤/搜索