以前網站要實現了一個線上預覽檔案的功能,其中後台管理時用到了ajax上傳。我用的是一個jquery外掛程式ajaxfileupload.js
今天同事使用時突然報錯了(以前沒有問題,我們用的都是Firefox瀏覽器,後來我讓她用其他瀏覽器沒有問題),我試了一下也出錯了。alertSyntaxError: missing ; before statementerror 這個應該是js語法錯誤。記得當時也出現過這個錯誤,不過後來怎麼解決的忘記了(當然也可能是我記錯了可能)。
調用ajaxfileupload上傳的部分代碼如下
1 $.ajaxFileUpload
2 (
3 {
4 url:'eb_price.php?'+parm,
5 secureuri:false,
6 fileElementId:'f_file',
7 dataType: 'json',
8 success: function (data, status)
9 {
10 fun(data)
11 },
12 error: function (data,status,e)
13 {
14 alert(e+status)// 商品;
15
16 }
17 }
18 );
經過分析是在調用jQuery.uploadHttpData( xml, s.dataType ); 由於語法錯誤拋出了異常
View Code
1 try {
2 status = isTimeout != "timeout" ? "success" : "error";
3 // Make sure that the request was successful or notmodified
4 if ( status != "error" )
5 {
6 // process the data (runs the xml through httpData regardless of callback)
7 var data = jQuery.uploadHttpData( xml, s.dataType );
8 // If a local callback was specified, fire it and pass it the data
9 if ( s.success )
10 s.success( data, status );
11
12 // Fire the global callback
13 if( s.global )
14 jQuery.event.trigger( "ajaxSuccess", [xml, s] );
15 } else
16 jQuery.handleError(s, xml, status);
17 } catch(e)
18 {
19 status = "error";
20 jQuery.handleError(s, xml, status, e);
21 }
由於要返回的資料類型是dataType:'json'格式的;感覺錯誤出在json字串的解析上面。即把json格式的字元轉換為對象;
uploadHttpData: function( r, type ) {
var data = !type;
bug(r);//bug為封裝的firebug的console.log();
data = type == "xml" || data ? r.responseXML : r.responseText;
bug(data);
// If the type is "script", eval it in global context
if ( type == "script" )
jQuery.globalEval( data );
// Get the JavaScript object, if JSON is used.
if ( type == "json" )
eval( "data = " + data );
// evaluate scripts within html
if ( type == "html" )
jQuery("<div>").html(data).evalScripts();
return data;
}
兩次輸出的結果
可以看到 第二次bug(data);data的內容多出了一段html代碼,都這樣了不錯才怪呢。這段代碼我看著很熟悉,突然想到了。好像是Firefox的魔鏡外掛程式,嵌入的;
在firebug的網路面板中,可以看到返回的資料貌似是正常的
只不過後來又遭到了修改。
你隨便開啟一個網頁在firebug中可以看到這個隱藏的div;
現在一切都清楚了,
我同事之所以以前用Firefox沒事,現在突然出現了這個問題,,就是因為兩天前 Firefox魔鏡升級了。(貌似你以前沒有安裝魔鏡,在這次更新過程中,會自動安裝。此前把魔鏡禁用了,升級為Firefox應用中心後,它就成了啟用狀態了。這隻是我的猜想)。
另外這個外掛程式肯定不會在每次請求中都會內嵌程式碼;這段代碼跟播放視頻的播放器有關係,通過它在播放器周圍顯示一個框框,提示你可以單獨拿出來播放。
外掛程式之所以會在ajax上傳後返回的結果中嵌入,是因為ajaxfileupload中的ajax並不是我們平時所用的那個ajax。它只是建立了一個隱藏的iframe,並在裡面建立了表單檔案域的等,把檔案提交到伺服器。然後將iframe中的內容,即web伺服器返回的結果,經過處理返回給調用它的代碼。
解決方案:
1.換瀏覽器。(因為這個功能只是我們的後台人員在用,當然可以這麼做^_^)
2.卸載外掛程式。
3.js判斷是否存在此代碼。若存在替換為空白字串;
不過最好的方式還是這個外掛程式不要修改原來網頁的結構。感覺在實現原來效果的情況下,而不修改結構是可以實現的。
2011 8.19 昨晚回到家後去Firefox社區逛了一圈。遇到這個問題的不光是我一個。會在fckeditor編輯器裡插入那個用於彈出視頻的代碼
並有回複:問題已經修複發行5.0.1版 – 超 頻