2009-06-30 18 views
5

Korzystanie ExtJS 2.2.1, mam element kontenera, który powinien załadować kawałek HTML z serwera przy użyciu:ExtJS: autoLoad nie działa w IE

autoLoad: { url: 'someurl' } 

to działa prawidłowo w Firefoksie , ale dla IE7 powoduje to błąd składni w ext-all-debug.js na linii 7170:

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

Naprawiłem to obracając tę ​​funkcję w tym:

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

Następnie autoLoad działa dobrze w obu przeglądarkach, ale jest kilka dziwnych błędów, a poza tym naprawdę nie chcesz tego naprawiać w bibliotece ExtJS, ponieważ będzie to niemożliwe do zachowania (szczególnie w minified ext-all.js, który jest jak pół megagwiazda Javascript w jednym wierszu).

Nie mogłem znaleźć wiele informacji na temat tego błędu.

Wariacje że próbowałem:

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

I versa wizy bez <script> tagów. W kodzie HTML też nie ma kodu JavaScript, ale powinno być możliwe, ponieważ ostatecznie użyjemy Javascript wewnątrz zwróconego kodu HTML.

Problem nie leży w HTML, ponieważ nawet z najprostszym możliwym HTML, błąd jest taki sam.

AKTUALIZACJA - Reakcja na Donovan:

Najprostszym przypadkiem gdzie jest to stosowane jest to jedno:

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

Nie ma tu zaangażowany magazyn danych. Typ odpowiedzi to także text\html, a nie json, więc nie można go mylić. Jak już wspomniano, działa dobrze w Firefoksie, aw Firefoksie pełni tę samą funkcję eval, ale bez błędu. Więc nie jest tak, że Firefox podąża inną ścieżką wykonania, to jest to samo, ale bez błędu na eval.

+0

Żadna z "odpowiedzi" nie odnosi się do faktu, że błąd występuje tylko w IE. Nadal doświadczamy tego samego w Ext 3.3.0. –

+0

Cześć Julian, jeśli spojrzysz w FireBug, co jest zwracane z serwera? Ext wykonuje połączenie z serwerem, po którym umiera w IE, byłoby pomocne, gdyby żądanie i odpowiedź zostały wysłane (w tym nagłówki). –

+0

Polecam używanie Charles Proxy, aby uzyskać informacje o Robu, ponieważ narzędzia do debugowania IE są okropne –

Odpowiedz

2

I znajduje się źródło problemu i nie było rzeczywiście z ExtJS. W aplikacji była sekcja, która wysłuchała zdarzenia "requestcomplete" Ext.Ajax i próbowała odszyfrować response.responseText do json, nawet jeśli odpowiedzią był HTML (który występuje tylko w jednym lub dwóch przypadkach). IE nie był tym rozbawiony.

1

Jeśli automatycznie ładujesz panel lub element, to proces dekodowania JSON nie powinien nawet brać udziału w tym procesie. UpdateManager po prostu odsyła do Ext.Element.update (..), który pobiera ciąg html.

Jedynym powodem, dla którego mogę myśleć, że twoja odpowiedź zostanie przeanalizowana jako JSON, jest to, że używasz JSONStore, aby o to poprosić - z czego korzystasz?

Powinieneś być w stanie zrobić coś prostego, jak to:

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

LUB

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

Response to UPDATE:

który wygląda prawidłowa dopóki coś dziwnego się nie dzieje za pomocą metody WMS.Routing.Route (...). Aktualnie pracuję nad aplikacją ExtJS, więc mogłem szybko przetestować różne odpowiedzi serwera i nie mogłem odtworzyć twojego problemu. Przeanalizowałem także źródła ExtJS 2.2.1 i nadal nie widzę niczego w powiązanej aktualizacji elementu i aktualizacji UpdateManager, która spowodowałaby wywołanie Ext.util.JSON.decode (...), które widzisz.

Wyobrażam sobie, że jest to niepowiązane żądanie AJAX w innej części aplikacji. Jeśli jeszcze tego nie zrobiłeś, użyłbym firebug/firebug lite, aby pomóc w debugowaniu tego - w szczególności staraj się uzyskać ślad stosu, aby upewnić się, że źródłem problemu jest właśnie ta funkcja AutoLoad.

+0

Dzięki, zobacz moją aktualizację. – JulianR

1

Nie wiem, czym jest problem, ale chciałem zwrócić uwagę, że twoja "poprawka" sprawia, że ​​po prostu zwraca json jako ciąg zamiast obiektu eval, więc oczywiście nie ma już błędu - usunąłeś funkcję. Mogło tak być po prostu:

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

Generalnie błędy losowe, jak to zazwyczaj nie wskazują na błąd w Ext, a zwłaszcza nie w funkcji stosowanych powszechnie jako Ext.decode. Sądzę, że w JSON jest coś, czego IE nie lubi ignorować innych przeglądarek, lub, co bardziej prawdopodobne, dzieje się coś nieoczekiwanego w twojej aplikacji, co nie wynika z twojego opisu. Czy próbowałeś sprawdzić dziennik żądań w Firebug, aby zobaczyć, jak faktycznie wygląda JSON? Czy próbowałeś najpierw uzyskać wynik wywołania trasy w zmiennej, aby zweryfikować jej zawartość przed wypełnieniem panelu? Spróbuj także ustawić opcję "włamania na wszystkie błędy" w Firebug na true - wiele razy, gdy uzyskasz losową funkcję z Ext na początku śledzenia stosu, winowajcą jest w rzeczywistości jakiś kod aplikacji, który nie był przy nadziei.

4

Sprawdź swój JSON. FF pozwala na końcowe przecinki w obiektach JSON, podczas gdy IE tego nie robi. na przykład

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

będzie działać w trybie FF, ale w IE spowoduje błąd składniowy. Aby nie być błąd składni JSON musiałyby być:

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

Miałem ten sam problem, przepraszam za mój angielski, jestem z Mejico, mam nadzieję, że mogę pomóc ... mój problem został wywołany po przesłaniu formularza do logowania, mój PHP zwraca JSON z odpowiedzią w przypadku niepowodzenia tak:

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

ale nie było wysłać resposne kiedy to sukces, dobrze, gdy ma prawdziwy sukces, wówczas ExtJS to starałem się rozszyfrować moją odpowiedź JSON, ale nie było nic do dekodowania, i Domyślam się, że w moim przypadku znowu problem ... Rozwiązałem tylko wysyłanie odpowiedzi na prawdziwy sukces, FF, Chrome, Safari, nie łapię problemu, ale Opera i IE8 robi ... Mam nadzieję, że pomogę komuś, do widzenia