11486 sujets

JavaScript, DOM et API Web HTML5

Bonjour,
Avec une fonction javascript j'écris par innerHTML du texte au format HTML dans un DIV en display none.
La fonction se termine par un display block, le texte au format html s'affiche alors correctement sur l'écran, il contient des liens (HREF) qui s'affichent correctement aussi (soulignés), cependant quand je passe la souris sur les liens il ne se passe rien (elle ne se transforme pas en main) et je ne peux pas cliquer sur les liens. Comme si la page affichée était muette ! Comment repasser la main pour que les liens redeviennent opérationnels lorsqu'on clique dessus ?
Le code (200 lignes en js, plus de 300 en php et html sans compter toutes les autres fonctions) risque d'être assez pénible à étudier, mais sans avoir trouvé la solution, je crois avoir trouvé la cause.
Je pense que ça vient du fait que l'insertion par js du code html dans un div n'est pas directement déclenchée par un clic de l'utiilisateur !
Je m'explique: au départ il y a bien un clic utilisateur qui déclenche un processus, mais pour traiter cette demande spécifique de l'utilisateur j'ai besoin de lire des fichiers .txt qui contiennent le code à insérer, or la lecture de fichiers .txt par javascript n'étant pas conseillée, je procède de la manière suivante:
le clic de l'utilisateur lance une petite fonction javascript qui se contente (une fois de plus de recharcher la page d'accueil avec un code retour spécifique en ligne de commande), lors du rechargement de la page d'accueil avec ce code retour PHP après avoir régénéré la page lit les fichiers textes dont j'ai besoin range les contenus dans des strings au format js (qui deviennent donc des données globales pour js), puis appelle directement la fonction js (via un echo contenant du javascript qui appelle directement la fonction javascript), fonction qui va maintenant pouvoir lire les strings en données globales pour les installer dans les div par innerHTML. En fait c'est dans ce cas la fin de chargement de la page d'accueil qui appelle directement js et non directement un clic !
Tout s'affiche correctement mais les liens affichés restent muets.
Si vous avez une solution, autre que de lire des fichiers textes avec du js, je suis preneur.
Merci
bouts de code: passage de paramètres via PHP à la fonction js et appel de la fonction d'affichage: affiche
100 lignes PHP/HTML puis:

echo '<script type="text/javascript"><!--
var islocked=false;
var indexcourant=0;
var nbre='.($n-1).';
var cheminmax="'.$prefixmax.'";
var cheminmin="'.$xprefix.'";
var mesphotos=['.$names.'];
var largeurs=['.$stringl.'];
var hauteurs=['.$stringh.'];
var extjs=['.$extforjs.'];
var codert='.$codrt.';
var ypage="'.$xpage.'";
var ycv='.$xcv.';
if(ycv>0)
{
var cvparam1="'.$ycomment1.'";
var cvparam2="'.$ycomment2.'";
var filetxt1="'.$txtfile1.'";
var filetxt2="'.$txtfile2.'";
affiche(ycv-1, 0);
}
--></script>'; // construction du tableau pour js, (var nbre = $n-1 car la ligne 0 (nom du répertoire et
?>
<!--</div>-->
<?php

début fonction affiche:

function affiche(idx, qui)
{

30 lignes de code puis ce qui est le cas ici (au 1er appel qui=0 (cas spécifique)) on ne déroule pas tout le code du 1er coup, on se rappelle par lanceur au bout de 100ms:

if(qui<2) // lancement par précédent ou suivant et clic sur la mini-photo
{
//document.getElementById('photo').setAttribute("src", cheminmin+mesphotos Smiley idx +'.jpg'); // ?????????????
setTimeout(lanceur,100); // on temporise le temps que la page noire se charge sinon on observe une déformation de l'image précédente avant son remplacement par la nouvelle image
return;
} else
{

(lanceur rappelle affiche avec les mêmes paramètres mais avec qui=2) ce qui fait qu'au 2ème passage on déroule tout le code et 200 lignes plus loin on termine la fonction par:

} else
{
iddroite.style.opacity=0.5;
ximgid.setAttribute("src", cheminmin+mesphotos Smiley idx +'.jpg');
text1id.innerHTML=cvparam1;
text2id.innerHTML=cvparam2;
divmodalx.style.display="block"; // zone noire + textes
divmodal2.style.display="block"; // sous-zone de clics
}

bout de code HTML (DIV) auquel s'applique cette fonction (mis en place par PHP dans le cas spécifique):

<div id="modale1">
<img src=# id="photo"/>
</div>
<div id="modalex">
<div id="encaps">
<div id="supyphot"><img src=# id="xphoto"/><div id="text1"></div></div>
<div id="text2"></div>
</div>
</div>
<div id="modale2">
<div id="zonarrowg" onmouseover="opacifie(this)" onmouseout="eclaircie(this)">
<div id="contarrowg">
<a href="javascript:precedent()"><img src="images/arrowg.png" id="arrowg">
</div>
</div>
<div id="zonarrowd" onmouseover="opacifie(this)" onmouseout="eclaircie(this)">
<div id="contcroix">
<a href="javascript:fermer()"><img src="images/croix.png" id="croix">
</div>
<div id="contarrowd">
<a href="javascript:suivant()"><img src="images/arrowd.png" id="arrowd">
</div>
</div>
</div>

bout de CSS:

#modale2
{
display: none; /*--masqué par défaut--*/
position: fixed; left: #; top: #;
width: #; height: #;
z-index: 1200;
}
#photo
{
opacity:1;
margin: 0px;
padding: 0px;
position: relative;
width: #; height: #;
z-index: 1300;
}
#modalex
{
display: none; /*--masqué par défaut--*/
background: black;
position: fixed; left: #; top: #;
width: #; height: #;
opacity: 1;
z-index: 1100;
}
#encaps
{
opacity:1;
/*background: yellow;*/
background:url('images/parchemin.jpg') no-repeat center fixed;
-webkit-background-size: cover;
background-size: cover;
margin: 0px;
padding: 0px;
position: absolute;
border: 2px solid red;
width: #; height: #;
left: #; top: 0px;
z-index: 1300;
}
#supyphot
{
position: absolute;
margin: 0px;
padding: 0px;
width: #; height: #;
left: 0px; top: 0px;
z-index: 1400;
}
#xphoto
{
position: absolute;
display: inline-block;
margin: 0px;
padding: 0px;
border: 1px solid black;
width: #; height: #;
left: 0px; top: 0px;
z-index: 1400;
}
#text1
{
position: absolute;
display: inline-block;
margin: 5px;
padding: 0px;
overflow: hidden;
/*border: 1px solid green;*/
width: #; height: #;
left: #; top: 0px;
z-index: 1500;
}
#text2
{
position: absolute;
margin: 5px;
padding: 0px;
overflow: hidden;
/*border: 1px solid green;*/
width: #; height: #;
left: 0px; top: #;
z-index: 1500;
}

Je ne suis pas sûr que tout ceci apporte plus d'éléments que ma première formulation
salut,
d'une parte, il serait préférable d'utiliser les balises codes appropriées afin de faciliter la lecture à ceux qui tenteront de t'aider. D'autre part, il est sans doute inutile de joindre l'ensemble de ton code mais simplement tenter d'isoler la partie concernée.

Sans avoir réellement vu ce que tu as envoyé, je penserais à un simple problème de positionnement de tes liens qui seraient recouverts par un autre élément HTML et qui empêcherait donc d'avoir accès au clic du lien.
Sans doute que tu utilises des positionnements absolues ?
c'est ce que j'ai fait dans une reponse precedente, j'ai tente d'isoler les parties concernees (il y en a un peu partout), mais oui j'utilise des positionnements absolus à l'interieur d'un container lui-meme positionne en fixe. Cependant le DIV recevant le texte a le z-index le plus grand !!!!
Bonjour,

Comme le dit Zelalsan, isolez le code, puis mettez-le sur un CodePen par exemple. Le simple fait d'exécuter cette action devrait vous montrer la faille avant même d'avoir besoin d'un alsanaute...
Si vous avez lu le message de 20h30 après "le clic utilisateur....." vous constaterez qu'il n'y a pas un simple bout de code à isoler puisque le processus démarre par du code js puis repasse par le rechargement complet de la page d'accueil pour aller chercher php puis revient sous js à partir d'un echo direct de php. Dans mon message de 21h07, c'est cependant ce que j'ai essayé de faire, isoler les bouts de code concernés. Mais je comprends très bien que ça soit difficile à exploiter. Si je mets les programmes complets ce sera bien pire car le processus sur lequel je rencontre ce problème n'est qu'un processus parmi beaucoup d'autres qui sont traités par ces mêmes programmes et qui eux fonctionnent très bien, tout vous envoyer, c'est 17 fichiers php, 3 css, 1 fichier js et chacun des fichiers php et js encapsulant plusieurs fonctions.
J'ai bien regardé le fonctionnement des z-index qui me paraissaient être une bonne piste, mais, a priori, je les utilise correctement (uniquement avec des blocks positionnés absolus ou fixe). J'ai toutefois un doute car lors de la mise au point du positionnement de mes div, il y a eu un moment où ils étaient mal positionnés (trop à gauche ou trop à droite), mais que je n'arrive pas à reproduire, où en cliquant un peu partout ça s'était tout à coup mis à fonctionner pour la partie visible...
"Isoler un jour de code" c'est par exemple remplacer la partie php/bdd par du html en dur, voir même supprimer complettement la partie ajax puisqu'elle est inutile pour la problématique annoncée. Ici seul le résultat affiché compte, On se moque de la manière dont le html est généré.
Modifié par Olivier C (22 Jul 2016 - 12:35)
J'ai trouvé, mais à mon avis c'est un mauvais fonctionnement ou un fonctionnement que j'estime inattendu des navigateurs et en particulier de l'exploitation des process liés à z-index. Pour ceux que ça intéresse, voici l'explication ci-dessous:
Pour comprendre, décrivons tout d'abord les cas qui fonctionnent parfaitement:
J'ai un div A de couleur peu importe, disons noire, de taille T encapsulant un div A1 de taille t plus petite et destiné à recevoir une image ou du texte. J'ai également un div B de couleur noire de taille T égale à A contenant aux extrêmités horizontales des petites images < et > et en haut à droite un X permettant de faire le passage aux documents suivants ou de fermer le document en cours, ce div B contient également des sous-div qui permettent avec le css approprié de faire passer en surbrillance les <, > et X lorsqu'on s'en approche.
Les div A et B sont placés en fixed exactement au même endroit de l'écran et par des z-index de la manière suivante:
A est le plus profond, B est au-dessus de A, et A1 (qui est encapsulé par A) est au-dessus de B donc au-dessus de tout.
L'image ou le texte de A1 apparaît donc correctement avec une bande noire de chaque côté contenant le <, > et X et comme les instructions de gestion de <, >, X sont juste au-dessous de A1, la surbrillance des éléments fonctionne correctement pendant le survol de l'image ou du texte contenu dans A1.
Là où ça ne fonctionne plus, c'est quand le texte de A1 contient des liens, les liens s'affichent correctement mais pour ce qui est de leur fonctionnement les navigateurs ne tiennent pas compte du z_index et considèrent qu'ils sont dans A qui est au-dessous de tout, c'est la raison pour laquelle ils restent muets.
Certains vont me répondre: vous n'avez qu'à faire passer A au-dessus de B, le résultat c'est que les liens fonctionnent bien, mais la gestion de la surbrillance des <, > et X ne fonctionne plus au survol de l'image ou du texte pour la même raison que celle qui vient d'être expliquée.
Ce qui m'intéresserait surtout maintenant c'est de savoir si, à votre avis, ce fonctionnement des navigateurs est normal: en résumé: ils tiennent compte du z-index pour l'affichage des liens, mais pas pour leur déclenchement !
Athur01 a écrit :

A est le plus profond, B est au-dessus de A, et A1 (qui est encapsulé par A) est au-dessus de B donc au-dessus de tout.

Ce qui m'intéresserait surtout maintenant c'est de savoir si, à votre avis, ce fonctionnement des navigateurs est normal: en résumé: ils tiennent compte du z-index pour l'affichage des liens, mais pas pour leur déclenchement !


Alors un peu de lecture sur les z-index t'aurais tout de suite renseigné Smiley smile

Si A est le plus profond et que A1 est dans A bah il est au meme niveau que A le zindex de A1 n'est pris en charge que dans A.. rien à voir avec B qui est HORS de A DONC A1 avec n'importe quel z-index restera au niveau du z-index de A...

Faut pas faire n'importe quoi il y a des règles Smiley cligne
Oui, je viens de revérifier car c'est un développement déjà ancien que j'ai voulu adapter, contrairement à ce que je dis dans ma réponse précédente et à la mémoire que j'en avais gardé, B n'a pas un fond noir et si les photos ou les textes s'affichent correctement dans A1 bien qu'en dessous de B c'est tout simplement que B n'a pas de fond, donc l'affichage correct se fait pas transparence de B. A part des instructions pour gérer les clics B ne contient que les <, > et X blancs qui s'affichent sur le fond noir de A.
Tout ceci ne résout pas complètement mon problème car si je sors A1 de son encapsulement pour le mettre indépendant et haut dessus de B, les liens dans le texte de A1 vont fonctionner puis qu'ils seront au-dessus de tout, par contre la surbrillance des <, >, X ne fonctionnera que lorsque le curseur sera en dehors de A1, mais plus quand je m'en approcherais tout en étant encore sur A1.
Merci.
Si vous ne souhaitez pas remettre en cause l'existant alors mettez le lien sur l'élément le plus au-dessus des autres, "B" si j'ai bien compris, mais je n'en suis pas sûr car m'y perds dans toute ces descriptions (c'est pourquoi un petit exemple en ligne...).
C'est pas grave, je m'en suis arrangé. Je vous remercie beaucoup, pour votre aide.
Bonne journée