PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Konqueror 3.5 und Bildwechsel



BlueJay
04-10-2006, 12:04
Konqueror-Bug?
Bei Ändern eines Bildes wird dessen Darstellung nicht upgedatet

BS: gentoo (x86-64) 2.6.16.19
KDE: 3.5.4
Komponente: Konqueror
Gilt für alle Konqueror 3.5-Varianten auf gentoo (x-86-64)!

Beschreibung:
Wird mit Javascript ein Bildwechsel durchgeführt, so wird die Darstellung des Bildes nicht upgedatet, wenn das Bild nicht in einem Bereich liegt, was den Event ausgelöst hat.

Beispiel: Klick auf Bild rechts unten soll via Javascript/DOM ein Bild links oben ändern. Es kommt häufig vor, dass dann der korrekte Name des Bildes im Kontext-Menu angezeigt wird, aber das Bild selbst ist noch das vorige (Darstellung nicht upgedatet).

Mit Neuzeichnen via Javascript ist nix zu machen, der Fehler liegt in der Grafikdarstellung selbst.

Bild:

Der Effekt bezieht sich auf den PC (rechts unten und) und Mitte oben.
Angezeigt werden sollte ein PC mit hellem Bildschirm (pic_2a.gif), der Name erscheint auch korrekt im Kontenxtmenu, tatsächlich angezeigt wird ein PC mit dunklem Bildschirm (pic_2.gif), das Bild vor dem Updatezyklus.

(Sieht aus wie Bug 111873 bei den Digicam-Developern)

undefined
04-10-2006, 13:33
Ja das ist ein Bug und der ist bekannt. Ich kämpfe schon seit Wochen mit dem Problem und habe auch schon daran gedacht zu downgraden. Es Nervt Tierisch - Generell alle Dynamischen Renderings wie z.B. innerHTML etc. gehen nicht wenn man nur den CDATA Node neu Schreibt.


function XMLRequester( u, o, mh, ge, t )
{
var url = unescape(u);
var xo = INITXMLRequester();
var out = '';


if ( ! is_moz )
mh.innerHTML = lng['PLEASEWAIT'];

var listener = function()
{
if ( is_moz )
dump("Content-Type: " + xo.getResponseHeader("Content-Type") + "\n");

switch( xo.readyState ) {
case 0:
mh.innerHTML = lng['AJAXWAITRESPONCE'];
case 1:
mh.innerHTML = lng['AJAXDATASEND'];
case 2:
mh.innerHTML = lng['AJAXWAITRESPONCE'];
case 3:
mh.innerHTML = '';
break;
case 4:
if ( xo.status == 200 ) {
mh.innerHTML = '';
var da = xo.responseText;
if( da.length > 1 ) {
// alert( unescape( da ) + " " + ge );
if ( t ) {
/** BUGFIX:KHTML 3.5.3 Konqueror need a event befor innerHTML! */
if ( ge.hasAttributes ) ge.style.display = '';
ge.innerHTML = eval( unescape( da ) );
} else
ge.value = eval( unescape( da ) );
} else {
ge.innerHTML = lng['AJAXEMPTYDATA'] + da;
}
/** BUGFIX:Opera need explicit to destroy XMLHttpRequest */
if ( is_opera )
xo.abort();

} else if ( xo.status == 403 ) {
mh.innerHTML = lng['AJAXSERVERERROR'];
}
}
}

if ( o.length >= 3 ) {
xo.open( "POST", encodeURI( url ), true );
xo.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' );
xo.setRequestHeader( 'Accept-Charset', 'utf-8, unicode-1-1;q=0.8' );
xo.setRequestHeader( 'Accept', 'text/plain, text/html, application/xhtml+xml' );
xo.setRequestHeader( 'Content-Length', o.length );
xo.onreadystatechange = listener;
xo.send( o );
} else {
alert(lng['MISSINGAJAX']);
}
return false;
}

BlueJay
04-10-2006, 14:17
na, habe gerade einen Patsch ausprobiert, der zumindest bei den Settings:
"Zwischenspeicher verwenden, wenn möglich" (und lokal) zu greifen scheint:


function zeige(nr)
{ document.images['i'+nr].src=leer.src; // Konqueror Patsch, die faule Sau!
document.images['i'+nr].src=ima[f[nr]].src;
}


Vorher wird kurz ein komplett anderes Bild geladen.

Weitere Erleichterung kannst du dem Konqueror auch verschaffen, indem du sicherstellst, dass alle Bilder, die du anforderst, auch tatsächlich vorhanden sind. Sonst scheint er beim Laden der "Folgebilder" zu schlampen.

Ich wusste nicht, ob ich den Bug schon gemeldet hatte, aber beim Suchen war nichts rausgekommen.


so long,
BlueJay

undefined
04-10-2006, 16:42
Das ist genau das was ich meine du mußt immer erst einen anderen Event vorraus senden bevor der Eigentliche kommt.
Siehe meinen Code hasAttributes. Seit kdelibs-3.5.3(khtml) haben die beim Rendern den Wurm drin und man kriegt ihn nicht weg. Das geht einem Stellenweise an die Nerven, ich habe drei Pages deshalb schon umbauen müssen.

BlueJay
04-10-2006, 19:07
... und das Gemeine ist, du musst etwas ANDERES laden, sonst scheint der intern eine Abkürzung zu nehmen.

Yepp, seit dieser Version versuche ich auch, drumherumzuprogrammieren. Und da haben wir sie wieder, die Browserweiche!

BlueJay
13-10-2006, 08:38
Na, der Konqueror 3.5.5 hat's gerafft. Dank an alle, die für den Bug gestimmt haben!

Aber:
Wie kommt man beim Konqueror javascript/mäßig an die Version?
navigator.appVersion zeigt nur einen leeren String.

so long,
BlueJay

Romanday
14-10-2006, 17:33
Aber:
Wie kommt man beim Konqueror javascript/mäßig an die Version?
navigator.appVersion zeigt nur einen leeren String.

so long,
BlueJay

Schwierig.

Du kannst im Konqueror unter Browser-Identifizierung pro
Seite eintragen was du möchtest.
+= Proxys und Firewalls können den UserAgent auch filtern.
Die meisten nehmen bei den Einstellungen irgendeine IE Version,
damit die JS Sripts auf anderen Seiten funktionieren.

Grund: Bei der JS Browser Identifizierung wird Konquerer meist
vergessen.

BlueJay
15-10-2006, 08:26
Du kannst im Konqueror unter Browser-Identifizierung pro
Seite eintragen was du möchtest.

Wer seine Browser vergewaltigt, ist selber schuld. :)


Bei der JS Browser Identifizierung wird Konquerer meist
vergessen.

... weil die Deppen trotz W3C statt auf Ausnahmen auf den Regelfall abfragen. :D

undefined
16-10-2006, 09:31
Also bei KHTML sind immer noch bei Ajax die Probleme vorhanden.
Den Agent bekommst du mit einem Regexp ;)


function getAgent()
{
var uAgent = navigator.userAgent.toLowerCase();
var is_opera = (uAgent.indexOf('opera') != -1);
var is_saf = ( ( uAgent.indexOf('applewebkit') != -1 && uAgent.indexOf('spoofer') == -1 ) || ( navigator.vendor == 'Apple Computer, Inc.' ) );
var is_ie = ( ( uAgent.indexOf('msie') != -1) && ( !is_opera ) );
var is_moz = ( ( navigator.product == 'Gecko') && ( !is_saf ) );
var is_khtml = ( navigator.vendor == 'KDE' || ( document.childNodes && !document.all && !navigator.taintEnabled ) );
var is_kon = ( uAgent.indexOf('konqueror') != -1 );
var is_netsc = ( uAgent.indexOf('netscape') != -1 );
if ( is_khtml ) {
var reg = new RegExp( '^.*khtml/' );
var Version = uAgent.replace( reg, '' );
Version = Version.replace( /\D/g, '' );
alert( Version );
}
return uAgent;
}

BlueJay
16-10-2006, 16:10
Also bei KHTML sind immer noch bei Ajax die Probleme vorhanden.


na dann werde ich mal noch eine Weile bei der (i)frame-Methode bleiben :)

Ach Moment, da war immer noch die Sache mit dem (nicht ausgelöstem) Meta-Refresh! Na, gut, dass es setTimeout gibt!

so long,
BlueJay