Bonjour,

J'ai un problème qui me semble assez mystérieux à vous soumettre.

J'utilise l'excellent script lightbox plus pour mes galeries de photos. Problème : malgré un parfait fonctionnement avec IE, Firefox et Opera, impossible de le faire fonctionner avec Mozilla et Netscape.

Pour tester, j'ai récupéré le code XHTML 1.1 généré par PHP, pour Mozilla ou Netscape, dans le fichier photo.php5. Je l'ai collé dans une page statique, photo.html. A ma grande surprise, ça a marché. J'ai alors cherché du côté du code HTML d'où pouvait provenir cette erreur.

Il faut savoir que j'utilise les templates PHPLib pour générer du HTML, et que je teste le navigateur pour lui envoyer soit du XHTML 1.1, soit du XHTML 1.0 Strict. Voici mon script :
<?php
// Si le navigateur gère xhtml+xml => XHTML 1.1
if(stristr($_SERVER['HTTP_ACCEPT'], 'application/xhtml+xml'))
{
	$doctype = '<?xml version="1.0" encoding="iso-8859-1"?>'."\n".'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">';
	$contentType = 'application/xhtml+xml';
	$lang = 'xml:lang="fr"';
	$xml = 'xml:';
}

// Sinon => XHTML 1.0 Strict
else
{
	$doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
	$contentType = 'text/html';
	$lang = 'xml:lang="fr" lang="fr"';
	$xml = '';
}

header('Content-type:'.$contentType.';charset=ISO-8859-1');
$tpl->set_var('Doctype', $doctype);
$tpl->set_var('ContentType', $contentType);
$tpl->set_var('Lang', $lang);
$tpl->set_var('Xml', $xml);
?>
Et bien j'ai réussi à résoudre ce problème simplement en empêchant la génération de XHTML 1.1, en rempaçant le premier test, par celui-ci :
if(false && stristr($_SERVER['HTTP_ACCEPT'], 'application/xhtml+xml'))
Le test est ainsi inutile, je le sais, mais c'était pour tester. Ainsi lightbox plus fonctionne parfaitement avec tous les naviagateurs testés. Ca m'oblige juste à générer obligatoirement du XHTML 1.0 Strict (ce qui n'est pas forcément plus mal, vous me direz).

Je serais bien curieux de trouver la solution à ce mystérieux problème. Comment le PHP peut-il intéragir avec le HTML ou le JS !?

Des idées ? Smiley murf
Merci.
Modifié par 84mickael (28 Dec 2006 - 00:37)
Merci pour ce lien intéressant.

J'avais bon espoir, j'ai remplacé tous les document.createElement par createElement, et ajouté la fonction suivante :
function createElement(element)
{
	if(typeof document.createElementNS != 'undefined')
	{
		return document.createElementNS('http://www.w3.org/1999/xhtml', element);
  	}
  	else if(typeof document.createElement != 'undefined')
  	{
		return document.createElement(element);
  	}
  	else
  	{
  		return false;
  	}
}
Et bien ça ne marche toujours pas ! Smiley ohwell

Voici le fichier JavaScript de Lightbox plus, si ça peut aider.

Reste à savoir pourquoi ça marche dans le cas d'un fichier statique en XHTML 1.1, et pas dans le cas d'un fichier généré par PHP !
Modifié par 84mickael (28 Dec 2006 - 00:38)
84mickael a écrit :
Reste à savoir pourquoi ça marche dans le cas d'un fichier statique en XHTML 1.1, et pas dans le cas d'un fichier généré par PHP !
Si tu ouvres le fichier en local, comme ton navigateur ne reçoit pas de headers HTTP, je ne suis pas sûr qu'il le considère avec le type mime application/xhtml+xml, ce qui explique que dans ce cas-là tu ne rencontres pas le problème.

Il ne te reste plus qu'à débugger le Javascript si tu veux voir d'où vient exactement le problème...

Sinon, il y a deux ou trois autres choses qui changent quand le fichier XHTML est servi avec le type mime application/xhtml+xml. A creuser, donc...
Intéressant...

Je vais laisse tomber le xHTML 1.1 car je n'en ai pas de réelle utilité, mais je compte bien résoudre ce problème. Ca m'intéresse, et puis si ça peut aider l'auteur à faire évoluer son script...

Alors, quelles incompatibilités entre application/xhtml+xml et Javascript ?

- document.createElement
- document.write
- ... ?
Modifié par 84mickael (26 Oct 2006 - 21:21)
- innerHtml (je crois)
- Les noms de balises sont en minuscules.
- Les éléments table n'ont pas de fils tbody implicite.
- ...

(une recherche sur ton moteur de recherche préféré complètera sans doute cette liste)
Bien vu. Après moult tests, c'est effectivement le type MIME application/xhtml+xml qui pose problème.

Ce n'est pas moi qui ait fait le script, et je ne le comprends pas bien, mais je vais de ce pas informer l'auteur. Il m'a déjà répondu une fois, et il sort des mises à jour régulières... donc je suis optimiste.

Je tiendrai au courant...
Modifié par 84mickael (27 Oct 2006 - 12:54)
L'auteur, très réactif, a déjà résolu le problème, et répondu à mon e-mail. Il a simplement remplacé
caption.innerHTML = self._imgs[self._open].title;
par
try { caption.innerHTML = self._imgs[self._open].title; } catch(e) {}
Ca fait que le titre associé à une photo ne s'affiche pas quand on ne peut pas utiliser innerHTML. Quand j'aurai le temps j'essaierai de modifier ça pour qu'il s'affiache quand même, en créant un nouvel élément. Il faut juste que je trouve à quoi attacher cet élément.

Je me demande bien pourquoi ça fonctionne en application/xhtml+xml, alors que son script est bourré de document.createElement... mais ça fonctionne !
Modifié par 84mickael (27 Oct 2006 - 13:09)
84mickael a écrit :
Je me demande bien pourquoi ça fonctionne en application/xhtml+xml, alors que son script est bourré de document.createElement... mais ça fonctionne !
En effet, c'est bizarre.

Peut-être que le comportement des navigateurs a changé et qu'ils implémentent cette méthode en créant l'élément avec le namespace par défaut ?