2009-06-30 51 views
5

工作中使用ExtJS的2.2.1,我有這應該利用來加載從服務器一段HTML的容器元素:ExtJS的:自動加載不能在IE

autoLoad: { url: 'someurl' } 

這工作正常,在Firefox ,但對於IE7這導致在內線,全debug.js語法錯誤在行7170:

this.decode = function(json){ 
    return eval("(" + json + ')'); 
}; 

我通過開啓該功能到這個固定的:

this.decode = function(json){ 
    return eval('(function(){ return json; })()'); 
}; 

然後自動加載運行良好兩個瀏覽器,但後來有一些奇怪的錯誤,此外,你真的不想在ExtJS的庫來解決這個問題,因爲這將是難以維護(尤其是在縮小的EXT-all.js這是就像一條線上的半個Javascript腳本一樣)。

我一直沒能找到很多關於這個錯誤。

的變化,我試過:

// With <script> tags around all the HTML 
autoLoad: { url: 'someurl', scripts: true } 
// With <script> tags around all the HTML 
autoLoad: { url: 'someurl', scripts: false } 

,反之亦然沒有<script>標籤。 HTML中沒有任何Javascript,但它應該是可能的,因爲最終我們將在返回的HTML中使用Javascript。

的問題是不是在HTML,因爲即使是最簡單的可能HTML,錯誤是一樣的。

更新 - 響應多諾萬:

哪裏,這是使用最簡單的情況是這樣的一個:

changeRolesForm = new Ext.Panel({ 
     height: 600, 
     items: [{ autoScroll: true, autoLoad: WMS.Routing.Route("GetRolesList", "User") + '?userID=' + id}] 
    }); 

沒有這裏涉及到數據存儲。響應類型也是text\html,而不是json,所以不能混淆它。正如所說的,它在Firefox中運行得很好,在Firefox中,它也執行相同的功能,但沒有錯誤。所以它不像Firefox遵循不同的執行路徑,它是一樣的,但沒有eval上的錯誤。

+0

沒有任何「答案」解決了錯誤只發生在IE中的事實。我們在Ext 3.3.0中仍然遇到同樣的情況。 – 2011-02-10 22:11:58

+0

嗨朱利安,如果你看看FireBug,從服務器返回什麼?如果請求和響應已發佈(包括頭文件),Ext會在服務器調用服務器之後進行調用 – 2011-02-11 21:36:00

回答

2

我找到問題的根源,它確實不是ExtJS的。應用程序中有一部分聽取Ext.Ajax'requestcomplete'事件,並嘗試將response.responseText解碼爲json,即使響應是HTML(僅在一種或兩種情況下)。 IE沒有被這個感覺好笑。

1

如果你autoLoad'ing到面板或元素,然後一個JSON解碼甚至不應該參與這一進程。 UpdateManager只是遵循Ext.Element.update(..),它接受一個html字符串。

我認爲你的反應會被解析爲JSON的唯一原因是,如果你使用的是JSONStore要求它 - 你有什麼用?

你應該能夠做一些簡單的像這樣:

 
var panel = new Ext.Panel({ 
    autoLoad: 'someurl' // this is the short form, you can still use the object config 
}); 

OR

 
var element = Ext.get('element id').update({ 
    url: 'someurl' 
}); 

響應更新:

這看起來是正確的,只要奇怪的事情是不會發生與WMS.Routing.Route(...)方法一起使用。我實際上目前正在自己​​開發一個ExtJS應用程序,所以我能夠快速測試一些不同的服務器響應,並且無法重現您的問題。我也relooked在ExtJS的2.2.1源,仍然可以看到在相關元素的更新和UpdateManager沒有什麼會撥打電話給你看到Ext.util.JSON.decode(...)。

我想象它從你的應用程序的另一部分中不相關的AJAX請求。如果你還沒有,我會使用firebug/firebug lite來幫助調試 - 特別是嘗試獲取堆棧跟蹤,以確保問題的根源確實在於此autoLoad。

1

我不知道問題是什麼,但我想指出你的「修復」使得它簡單地返回json作爲一個字符串而不是一個eval'd對象,所以當然沒有錯誤了 - 你刪除了功能。它也可能只是簡單地:

this.decode = function(json){ 
    return json; 
} 

一般來說,這樣的隨機誤差通常不表明分機的錯誤,尤其是不能作爲常用的Ext.decode功能。我猜想,無論是JSON中的某些東西,IE不喜歡其他瀏覽器忽略的內容,或者更有可能的是,在您的應用程序中出現了某些意想不到的情況,這在描述中並不明顯。你有沒有試過在Firebug中檢查你的請求日誌,看看JSON實際上是什麼樣子?你有沒有嘗試過讓你的路由調用的結果變成一個變量首先驗證其內容之前填充面板?此外,嘗試將Firebug中的「打破所有錯誤」選項設置爲true - 當您從堆棧跟蹤頂部的Ext獲得隨機函數時,很多時候,罪魁禍首實際上是一些您不是的應用程序代碼期待。

4

檢查您的JSON。 FF允許JSON對象中的尾隨逗號,而IE不允許。例如

{foo:'bar',baz:'boz',} 

將在FF工作,但在IE中會拋出一個語法錯誤。爲了在那裏不會有語法錯誤的JSON將需要:

{foo:'bar',baz:'boz'} 
1

我有同樣的問題,原諒我的英語,我來自Mejico,我希望我可以幫助...當我提交表單登錄時,我的問題被觸發,我的PHP返回一個JSON的響應失敗像這樣:

$respuesta = "{success: false, msgError: 'El usuario o contrase&ntilde;a son incorrectos'}"; 

,但我無法發送resposne當它的成功,以及當它有一個真正的成功,那麼,ExtJS的,它試圖解碼我JSON響應,但沒有什麼解碼,我猜測這就是在我的情況下,這個問題......我解決了只是回傳一個真正的成功,FF,鉻,Safari的反應,不要問題,但Opera和IE8 ......我希望我幫助別人,再見