ďťż

[JS][AJAX] Problem w IE

       

Podstrony


telcocafe

http://www.andrzej-a...wnload/category
Jak to naprawić? Skrypt testowałem na IE6. Problem: zamiast zastąpić tekst, nowa treść jest wyświetlana nad starą. Problem pewnie z DOM-em, ale nie wiem jak to naprawić. Próbowałem różnie.
Aha, jeszcze jedno. Zawartość offsetHeight całego diva (który ma zostać zastąpiony) wyświetla jako wysokość czcionki, przez co podczas wykonywania zapytania, tymczasowy div ma wielkość linijki. Co z tym zrobić?



Linijki od 52-65 pliku ajax.js zastąpić
self.XMLHttpRequestObject.onreadystatechange = function () { if (self.XMLHttpRequestObject.readyState == 4) { if (self.XMLHttpRequestObject.status == 200) { self.parseXMLa(); self.objectID.innerHTML = self.data.content; if (self.script) eval(self.data.script); } else alert('Error ' + self.XMLHttpRequestObject.status + '!'); } };

Wtedy powinno działać. Nie wiem czemu na kIEpskim nie działało bo niestety za bardzo nie mogę potestować u siebie.
Lecz szczerze mówiąć lepiej użyć innej klasy ajaxa gdyż aktualna z której korzystasz wykorzystuje własny loader który się po prostu nie sprawdza.

Natomiast na upartego to trzeba się pobawić zawartością loadera w linijce 90 tegoż samego pliku a jeszcze lepiej by było gdyby ten loader nie pokazywał sie w divie w którym są gwiazdki lecz poprostu jako mały kwadracik na środku. A wtedy zamiast bawić się z replaceChild itd poprostu zamieniamy zawartość innerHTML.

Jeżeli jest sie jeszcze bardziej upartym to pisz na priv w sprawie podesłania mi potrzebnych plików to wtedy zobaczymy co jest nie tak.
Użytkownik polasek edytował ten post 18 styczeń 2008, 21:04

Natomiast na upartego to trzeba się pobawić zawartością loadera w linijce 90 tegoż samego pliku a jeszcze lepiej by było gdyby ten loader nie pokazywał sie w divie w którym są gwiazdki lecz poprostu jako mały kwadracik na środku. A wtedy zamiast bawić się z replaceChild itd poprostu zamieniamy zawartość innerHTML.
Właśnie innerHTML nie działa w kIEpskim. Inaczej bym się nie bawił tym.
// Edytowano
Gdy robię z innerHTML pojawia się błąd: "Nieznany błąd czasu wykonania." w linijce następnej - czyli po przypisaniu do innerHTML treści.
Użytkownik andrzej_aa edytował ten post 18 styczeń 2008, 23:04
Szczerze mówiąc nie doszedłem do błędu. Aczkolwiek zrobiłem takie coś
function Ajax(objectID, evalscript) { var self = new Object(); var test=document.getElementById(objectID); self.el = document.getElementById(objectID); self.script = evalscript; self.mode = 'GET'; self.setMode = function (mode) { switch (mode) { case 1: self.mode = 'GET'; break; case 2: self.mode = 'POST'; break; } }; self.async = true; self.postData = null; self.temp = 3; self.XMLHttpRequestObject = false; if (window.XMLHttpRequest) self.XMLHttpRequestObject = new XMLHttpRequest(); else if (window.ActiveXObject) { try { self.XMLHttpRequestObject = new ActiveXObject('MSXML2.XMLHTTP'); } catch(e) { try { self.XMLHttpRequestObject = new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) { self.XMLHttpRequestObject = false; errMessage(e); } } } if (!self.XMLHttpRequestObject) alert(AjaxLang[0]); self.data = { 'script' : '', 'content' : '' }; self.getConnection = function (url) { if (!self.XMLHttpRequestObject) return; self.XMLHttpRequestObject.open(self.mode, url, self.async); if (self.mode == 'POST') self.XMLHttpRequestObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); var tmp = self.setTemp(); test.innerHTML = tmp.innerHTML; self.XMLHttpRequestObject.onreadystatechange = function () { if (self.XMLHttpRequestObject.readyState == 4) { if (self.XMLHttpRequestObject.status == 200) { self.parseXMLa(); test.innerHTML = self.data.content; if (self.script) eval(self.data.script); } else alert('Error ' + self.XMLHttpRequestObject.status + '!'); } }; self.XMLHttpRequestObject.send(self.postData); }; self.addPostData = function (key, value) { if (self.postData == null) self.postData = key + '=' + escape(value); else self.postData += '&' + key + '=' + escape(value); }; self.parseXMLa = function () { var data = self.XMLHttpRequestObject.responseXML.documentElement.childNodes; for (var i = 0; i < data.length; i++) { if (data[i].nodeType == 1) { switch (data[i].nodeName) { case 'script': self.data.script = data[i].firstChild.nodeValue; break; case 'content': self.data.content = data[i].firstChild.nodeValue; break; } } } }; self.setTemp = function () { return '<div style="position: absolute; left: ' + getXPosition(self.el) + 'px; top: ' + getYPosition(self.el) + 'px; width: ' + self.el.offsetWidth + 'px; height: ' + self.el.offsetHeight + 'px; opacity: 0.5; filter: alpha(opacity=50); background-color: #000000; z-index: 99999;"><div style="position: absolute; top: 40%; text-align: center; width: 100%;">' + self.getTemp() + '</div></div>'; ; }; self.getTemp = function () { switch (self.temp) { case 0: return ''; case 1: return '<img src="./images/loading.gif" width="16" height="16" alt="" />'; case 2: return AjaxLang[1]; case 3: return '<img src="./images/loading.gif" width="16" height="16" alt="" /> ' + AjaxLang[1]; } }; return self; }
Jeżeli to nie zadziała to jednak użyj gotowej biblioteki do ajaxa. Ja wiem, że pisałeś sam własną ale czasem warto skorzystać z gotowego. Tylko tyle mogę pomóc.



self przejmuje wartość this więc druga linijka odpada. To jest tzw. klasa. Dlatego również ze zmienną test nic nie pójdzie. Ale jutro może jeszcze pokombinuję. Tak poza tym, to przedobrzyłeś :-) var tmp = new String, a później odwołujesz się do niej z innerHTML. Rozumiem, pośpiech ;-) Ale dziękuję za zainteresowanie i pomoc.
Jeśli chodzi o biblioteki, to wolę pracować na własnych narzędziach. Również dlatego robię CMS-a (również by się lekko podszkolić w językach :-P).

Ja wiem co to jest klasa :) Sam ja stosuje ale kIEpski jak widzisz coś mu nie pasuje a jak korzystasz z test to juz nie wyskakuje ci ten błąd co wcześniej :)
Dobry sposobem byłoby zaopatrzenie twojego ajaxa w zdarzenia takie jak onloading, onloaded,onSuccess itd. To diametralni rozwiązałoby twój problem :)
Użytkownik polasek edytował ten post 19 styczeń 2008, 07:20
Hmm . . . Coś musiałem przeoczyć, bo jak testowałem, było to samo.
A co mam z tymi zdarzeniami zrobić, bo niezbyt rozumiem?
// Edytowano
Jak (poza DOM-em) zmienić zawartość div-a w kIEpskim? Może to coś pomoże . . .
Użytkownik andrzej_aa edytował ten post 19 styczeń 2008, 13:05
obj.xmlHttpRequest.onreadystatechange = function() { (...) switch (obj.xmlHttpRequest.readyState) { case 1: obj._onloading(); break; case 2: obj._onloaded(); break; case 3: obj._onInteractive(); break; case 4: obj._onComplete(); break; } };
Kod pochodzi z advajax.

A potem w kodzie tych funkcji będziesz mógł sobie umieszczać co chcesz. A poza domem to chyba nie da się już zmienić zawartości DIV. do tego służy innerHTML.

Nie, takie zdarzenia nie są mi potrzebne. Nie tworzę biblioteki Ajaxa, a zwykłą klasę do mojego CMS-a.
Chodziło mi o document.all, ale ten też nie działa :-(
Co do innerHTML - można go zastąpić na przykład innerText, ale wtedy będzie to zwykły tekst :-)

No tak. Ale jak oddzielisz funkcje loadera od twojej biblioteki to sądze, że zniknie problem z podmianką zawartości div w IE. Spróbuj warto. A w funkcji kończącej wstawdocument.getElementById('id').innerHTML=tekst;

Zrobiłem tak: wyrzuciłem wyświetlanie tymczasowego div-a oraz wyświetlania treści. Przy statusie 200 wstawiłemself.objectID.innerHTML = 'test';Co się stało? Treść się wyświetliła nad gwiazdkami. Nie wiem o co chodzi. Opera wyświetla wszystko poprawnie (zamienia gwiazdki na tekst).
// Edytowano
To dziwne, ale w dokumencie wpisałemalert(document.getElementById('ratingBarDownload').innerHTML) ;Wyświetliło się puste okno. Dlaczego? (Kod wykonałem za elementem o tym identyfikatorze, dlatego wiem, że on istnieje).
// Edytowano
Wiem! wiem co zadziałało na głupIEgo! Elementem był akapit. Zmieniłem na div-a i już działa. Dziękuję za pomoc. Na głupIEgo chyba nic nie pomoże . . . Trzeba się męczyć.
// Edytowano
Cóż? Ja bym w ogóle wstawił kod blokujący wejście przez cIEnkiego, ale to będzie źle - dużo osób jeszcze nie zrozumiało, że należy używać normalnych narzędzi (ex. Firefox, Opera).
Rozwijać? To jest tylko klasa do mojego CMS-a, ale może . . . Dzięki za pomysł :-D
Chyba się zapędziłeś, bo to mój temat, ale rzeczywiście - można zamknąć.
Użytkownik andrzej_aa edytował ten post 19 styczeń 2008, 21:24
Nie znalazłem informacji o błędzie który wtedy występował i nadal nie mogę go znaleźć. Chyba pora zakazać używania w polskie głupIEgo :D
Generalnie popieram pisanie własnego kodu a szczególnie tej biblioteki ajaxa. Proponuje jej rozwinięcie i dalsza pracę nad takimi rzeczami. Powodzenia. Temat do zamknięcia.
Użytkownik polasek edytował ten post 19 styczeń 2008, 16:06
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.