Application sur template de phpBB

Résolu
MChauban Messages postés 7 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 2 février 2010 - 29 janv. 2010 à 14:42
MChauban Messages postés 7 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 2 février 2010 - 2 févr. 2010 à 11:51
Je développe une application PHP/HTML/AJAX en utilisant le framework de phpbb. Ce code fonctionne sur l'environnement de dév IE7 mais pas avec les autres IE8, CHROME, FIREFOX. C'est donc sûrement que j'ai fait un truc pas très nette. N'étant pas destiné à une utilisation externe, je n'ai pas de lien public à proposer...

Ce qui marche avec IE7 et que j'aimerai pouvoir reproduire ailleurs:
Dans une page un FORM "newite" englobe un ensemble de critères qui permettent d'affiner l'objet de la création des slots entres autres les notions usages et nombre de slots/connexions à ouvrir.
Donc cette page permet à un utilisateur via une liste déroulante de choisir le nombre de slots qu'il veut 1 à 8. En fonction de ce nombre j'utilise une fonction JS sur le onchange de la liste qui va charger dans un DIV de la même page une seconde page PHP/HTML contenant le nombre de slot passé en paramètre. Ceci fonctionne avec tous les navigateurs lorsque l'on choisi un nombre dans la liste. En revanche l'appel à la fonction phpbb
onload_functions.push('slots_onchange(document.getElementById("newite"))');
avec pour valeur par défaut 1 ne fonctionne que sur IE7. Mais là n'est pas le majeur problème. Pour chaque slot généré dans la seconde page et affiché dans la page principal la fonction
function socket_onclick(id)
est associée.

note la variable f reçoit this.form dans l'appel soit la référence au formulaire newite contenant tous les critères.

la fonction qui charge la page dans le DIV:
function slots_onchange(f)
{
  var xhr_object = null;
  var httpRequest = false;

  // Prépration
  if(window.XMLHttpRequest) // Firefox
     xhr_object = new XMLHttpRequest();
  else if(window.ActiveXObject) // Internet Explorer
     xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
  else { // XMLHttpRequest non supporté par le navigateur
     alert("{L_MSGERR_NOXMLHTTREQUEST}");
     return;
  }

  // Initialisation
  var position = "socketdiv"; // nom du DIV qui va recevoir le contenu
  var method = "POST";
  var filename = "{S_SOCKETURL}";
  var sloid    = f.elements['sloid'].options[f.elements['sloid'].selectedIndex].value; 
  var data     = null;
   
  if(sloid != "")
     data = "sloid=" + sloid;

  // Récupération du nombre de slots à afficher

// On ouvre la requete vers la page désirée
xhr_object.open(method, filename, true);
xhr_object.onreadystatechange = function(){
if ( xhr_object.readyState == 4 )
{
// j'affiche dans la DIV spécifiées le contenu retourné par le fichier
document.getElementById(position).innerHTML = xhr_object.responseText;
}
}
  if(method == "POST")
     xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  
  xhr_object.send(data);
}


Ci dessous la seconde page qui sera affichée dans le DIV. (elle est alimentée par PHP)
<!-- IF S_REGISTERED -->
<!-- BEGIN rowsockets -->
,
<!-- END rowsockets -->

<!-- ENDIF -->


Ensuite dans la page principale j'ai la fonction JS qui répond à socket_onclick.

function socket_onclick(id)
{

// Detect the click on socket picture
  var lheight   = 400;
  var lwidth    = 600;
  var filename  = "{S_SOCKETPOPURL}";
  var lf        = document.getElementById("newite");
  var usaid     = lf.elements['usaid'].options[lf.elements['usaid'].selectedIndex].value;
  var data      = null;
  var mytop     = (screen.height-lheight)/2;
  var myleft    = (screen.width-lwidth)/2;
  var myoptions = "top=" + mytop + ", left=" + myleft + ", scrollbars=auto, resizable=no, location=no, menubar=no, status=no, menubar=no, Width=" + lwidth + ", Height=" + lheight;

  data = "&slotid=" + id;

  if(usaid != "")
    data = data + "&usaid=" + usaid;

  // Appel popup
  window.open(filename + data, "extension", myoptions);

}


Le clique sur une image représentant un connexion va ouvrir dans un popup la liste des connexions possibles en fonction de l'usage destiné au pool de connection. L'usage est récupéré dans une seconde liste nommée "usaid" dans le form "newite". Donc avec IE7 la popup s'ouvre et reçoit bien les paramètres. Avec Firefox
var lf        document.getElementById("newite");
ne génère pas d'erreur mais il semblerait que lf soit pas affecté et du coup
var usaid     lf.elements['usaid'].options[lf.elements
lui est fatal. J'ai essaye d'ajouter juste après
alert("hello");
qui n'est même pas exécuté.


Pouvez-vous m'aider ?
Merci.
Mark.

1 réponse

MChauban Messages postés 7 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 2 février 2010
2 févr. 2010 à 11:51
Bon alors c'était impossible de trouver avec ce que j'avais posté. Mais j'ai trouvé. Dans certains cas, usage n'est plus une liste mais un simple affichage car selon comment on rentre dans cette page l'usage est défini une fois pour toute.

J'ai donc ajouté une condition telle que si c'est une liste alors
lf.elements['usaid'].options[lf.elements['usaid'].selectedIndex].value;

Sinon
lf.elements['usaid'].value;


Voilà.
Mark.
3
Rejoignez-nous