11499 sujets

JavaScript, DOM et API Web HTML5

Bonjour

Suite à cette discussion, quelqu'un aurait il une solution simple à proposer pour retrouver les 10 premières balises <a> actuellement affichées à l'écran ?

Merci de vos conseils
En javascript, quand tu fais un getElementByTagName, tu reçois une collection d'objets, ordonnée comme dans le DOM et tu peux les parcourirs de 0 a 9.
Ce que tu souhaites c'est sélectionner les <a> qui sont visibles à l'écran c'est ça ? Donc si il y en a 20 au dessus (non visible) tu ne veux pas qu'ils soient targeté, est-ce cela ?
JENCAL a écrit :
Oui dans ce cas c'est différents, si le script doit se basé sur les element visible sur le VIEWPORT en utilisant withinviewport

exemple ici : http://patik.com/code/within-viewport/

Merci, c'est effectivement plus simple d'utiliser une propriété qui existe que de faire des calculs récursifs pour trouver la position du haut d'une balise et la comparer à la valeur actuelle du scroll de l'écran.
Je suppose que cette propriété n'est pas disponible sur les anciennes versions des navigateurs, mais je n'en ai besoin que sur les tablettes, donc avec des versions récentes de navigateurs.
Edit: ah oui! ce n'est pas une propriété, c'est un script à récupérer, mais c'est tout bon!
Modifié par PapyJP (01 Mar 2016 - 12:21)
Finalement j'ai écrit un petit script de quelques lignes en m'inspirant de celui que JENCAL m'avait signalé.
Encore merci
Peux-tu poster un lien, il m'intéresse Smiley smile merci !
Modifié par Gili (01 Mar 2016 - 13:56)
Gili a écrit :
Peux-tu poster un lien, il m'intéresse Smiley smile merci !

Volontiers, quand ça tournera comme je le veux.
Pour le moment, la chose qui marche c'est:

function getVisibleLinks() {
	var anchors = document.getElementsByTagName('a');
	var visibleLinks = [];
	var windowHeight = document.documentElement.clientHeight;
	for(var i = 0; i < anchors.length; i++) {
		var anchor = anchors[i];
		var anchorRect = anchor.getBoundingClientRect(), anchorTop = anchorRect.top;
		if(anchorTop > 0 && anchorTop < windowHeight) visibleLinks[visibleLinks.length] = anchor;
	}
	for(var i = 0; i < visibleLinks.length; i++) alert(visibleLinks[i].innerHTML);
}

ça recherche tout les liens visibles sur l'écran et affiche leur contenu.
La suite du script:
1) ne sélectionner que certains liens en fonction de certains attributs
2) les cloner dans une div qui apparait près du bouton
3) s'assurer que dans cette div les distances sont assez grandes (c'est le but du jeu)
4) ... et un tas de petits trucs du genre ne mettre cette moulinette en action que quand ça en vaut la peine, sans doute à coup de @media-queries en fonction de la taille de l'écran
Bref, plein de petites choses faciles à faire, mais qui nécessitent un peu d'huile de cerveau et de mise au point![/i][/i]
C'était surtout pour getVisibleLinks() Smiley smile Je ne connaissais pas getBoundingClientRect().
Merci du partage ! Par contre attention si tu lances cette fonction au scroll ça peut vite devenir gourment. Peut être temporiser l'appel de fonction ? https://jsfiddle.net/jonathansampson/m7G64/

Bonne journée Smiley smile
Gili a écrit :
Par contre attention si tu lances cette fonction au scroll ça peut vite devenir gourmand.

Non, j'ai prévu de mettre un bouton sur lequel cliquer pour effectuer la fonction.
Et c'est justement ça le truc: le bouton n’apparaîtra que si la taille du viewport est trop petite.
En fait il faudrait avoir une façon de déterminer s'il y a ou non un dispositif de pointage (souris ou touchpad), mais ça n'est apparemment pas prévu dans les standards.
On peut tester si la fonction "ontouchstart" est supportée, mais ça ne signifie rien quant à l'existence d'une souris, ça dit simplement que le navigateur reconnait l'évènement.
A moins que quelqu'un ait une astuce pour traiter ce problème?
Modifié par PapyJP (01 Mar 2016 - 17:54)
A par initialiser une variable à false et la mettre à true avec mousemove(), je ne vois pas d'autre solution.
Modifié par Gili (01 Mar 2016 - 18:06)
Gili a écrit :
A part initialiser une variable à false et la mettre à true avec mousemove(), je ne vois pas d'autre solution.

Voilà une très bonne idée, mais tu mets ça comment dans ton code JS?