IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Bloquer tous les liens d'une page web


Sujet :

JavaScript

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Zazz Blammymatazz
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Zazz Blammymatazz

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Bloquer tous les liens d'une page web
    Bonjour, mon objectif est le suivant :
    Lors de l'execution d'un script (qui peut prendre du temps), il faut que les liens hypertextes soient bloqués, ainsi que signaler à l'utilisateur qu'un traitement est en cours (modifier le pointeur de la souris, etc...)

    j'ai écrit les fonctions bloquer(objet) et debloquer(objet) qui activent/désactivent le lien "objet" et ça marche

    Maintenant, je voudrais qu'au lieu de définir le lien à modifier, les fonctions s'appliquent à tous les liens hypertexte de la page et ce pour empêcher l'utilisateur de changer de page pendant l'exécution d'un script (je l'ai mit sur des boutons pour l'instant)

    voici les codes :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <script type="text/javascript" src="bloquer.js"></script>
    PAGE 1
    </br>
    <a href="page2.html" id="p2">page 2</a>
    </br>
    <a href="page3.php" id="p3"> page 3 </a>
    </br>
    <a href="testmysql.php" id="testmysql"> testmysql </a>
    </br>
    <button onclick="bloquer(p2);"> BLOQUER </button> 
    <button onclick="debloquer(p2);"> DEBLOQUER</button>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function bloquer(objet){ 
    	var href;
    	href    = (objet.nodeName.toLowerCase() == 'a') ? objet.getAttribute("href") : null;
    	if(href && href != null){
    		objet.setAttribute("href_back", href);
    		objet.removeAttribute("href");
    	}
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function debloquer(objet){
    	var href;
    	href= objet.getAttribute("href_back");
    	if(href && href != null){
    			objet.setAttribute("href", href);
    	}
    }
    merci de votre aide

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    En javascript, ça me paraît compliqué, mais si l'utilisation de jquery ne t'es pas interdite en tout cas c'est hyper simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $('a').click(function() {
          return false;
    });
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par Spartacusply
    En javascript, ça me paraît compliqué
    Non, pas particulièrement en fait, mais il faut faire soi-même la boucle sur tous les éléments souhaités (ici, les balises <a>) que jQuery fait en interne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var $liens = document.getElementsByTagName('a'), nbLiens = $liens.length;
    while(nbLiens--){
        $liens[nbLiens].onclick = function(){
            return false;
        }
    }
    Alors c'est sûr qu'on a trois ou quatre lignes de code en plus, mais on économise toutes celles de jQuery.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Zazz Blammymatazz
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Zazz Blammymatazz

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    J'ai téléchargé et placé la bibliothède jquery avec mes autres fichiers

    j'ai donc ceci qui marche bien c'est ce que je voulais faire:

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function bloquer2(){
    $('a').click(
    		function() {
    			return false;
    	});
    }

    la syntaxe est particulière je trouve

    Aussi, je dois maintenant faire la fonction inverse qui soit réactive tous les liens ou annule bloquer2()

    j'ai essayé avec return true, fonction vide, ou pas de paramètre dans click, cela ne semble pas être la manière de faire
    Mes compétences en js sont très limitées
    --
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var $liens = document.getElementsByTagName('a'), nbLiens = $liens.length;
    while(nbLiens--){
        $liens[nbLiens].onclick = function(){
            return false;
        }
    }
    ce code me conviendrait aussi, il faudrait que je sache faire l'inverse dans une autre fonction


    Merci

  5. #5
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    C'est normal, car ta première fonction (qui retourne false) est toujours exécutée même après avoir déclaré une autre fonction au click. Il est nécessaire de "détacher" l'évènement pour pouvoir le réécrire entièrement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        function debloquer() {
            $('a').unbind("click");
            $('a').click(
                    function() {
                        return true;
                    });
        }
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Zazz Blammymatazz
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Zazz Blammymatazz

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Merci, cela fonctionne bien.




    Sinon, est ce possible d'agir sur le pointeur de la souris, faire en sorte qu'il passe en mode "chargement", ou autre
    j'ai déjà mis des alert() pour prévenir les utilisateurs (en début de fonctions et lors d'un clic sur un lien bloqué), mais j'aimerais que l'exécution du traitement se voit facilement

    merci !

  7. #7
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Oui en faisant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function bloquer2(){
    $('a').click(
    		function() {
    			return false;
    	});
    $('body *').css('cursor','wait!important');
    }
    Et en oubliant pas le sens inverse lorsque c'est terminé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $('body *').css('cursor','default');
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Zazz Blammymatazz
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Zazz Blammymatazz

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    La console javascript ne trouve pas d'erreur mais le curseur reste identique

    Edit : $('body *').css('cursor','wait'); met le curseur en forme de rond (comme quand un programme crash sur 7), cependant cela ne fonctionne que lorsque je survole les 2 boutons, et non la page toute entière

    EDIT2 : non en fait ça fonctionne sur tous les élements cliquables, ce qui m'intéresse au final, mais wait!important ne fonctionne pas

    merci beaucoup pour ton aide

    On vient de me demander de faire la même chose avec les boutons, l'ennui c'est que je ne sais pas faire et je pense qu'en supprimant l'action du 'onclick' on ne puisse la rétablir après

    de toute façon ça ne fonctionne pas :

    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    $('blo').setAttribute("onclick", function() { return false; });

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <button id='blo'onclick="bloquerLiens();"> BLOQUER LES LIENS</button>

    Code erreur : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Uncaught TypeError: undefined is not a function bloquerLiens.js:21
    debloquerLiens bloquerLiens.js:21
    onclick

  9. #9
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    var $liens = document.getElementsByTagName('a')
    pourquoi ne pas utiliser la collection document.links disponible

    On vient de me demander de faire la même chose avec les boutons...
    regarde en fait si l'application d'une DIV sur toute ta page, avec une légère opacité, ne serait pas préférable et plus facile à gérer !

    ...je pense qu'en supprimant l'action du 'onclick' on ne puisse la rétablir après
    dans ce cas il te faut la sauvegarder avant de la modifier.

  10. #10
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Comme l'a dit NoSmoking, il y a un moyen beaucoup plus propre de faire ça : utiliser un overlay. Un <div> qui recouvre toute la page avec un z-index très élevé. Tous les clics atteignent cet overlay et non les liens en arrière-plan. D'ailleurs, bien souvent, cet overlay est un peu opaque et contient un message indicateur à l'utilisateur du genre "Veuillez patienter".
    One Web to rule them all

  11. #11
    Membre actif

    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 183
    Points : 274
    Points
    274
    Par défaut
    Il y a aussi une solution propre, mais qui bloquera les liens mais pas les events des liens, c'est de simplement mettre un event.preventDefault() sur l'event click de document.documentElement ou document.body

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Zazz Blammymatazz
    Inscrit en
    Avril 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Zazz Blammymatazz

    Informations forums :
    Inscription : Avril 2014
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Pour finir je n'ai pas eu besoin de bloquer les boutons

    voici mes fonctions pour ceux que ça pourrait interesser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function bloquerLiens(){
    	alert("Les liens hypertextes seront désactivés le temps du traitement");
    	$('a').css('color','lightgray');
    	$('a').css('text-decoration','none');
    	$('a').click(function() {
     
    					alert("Les liens sont désactivés, un traitement est en cours");
    					return false; 
    				});
    	$('body *').css('cursor','wait');
    	$('blo').setAttribute('onclick', function() { return false; });
    }
     
    function debloquerLiens(){
    	alert("Traitement terminé, les liens sont réactivés");
     
    	$('a').css('color','default');
    	$('a').css('text-decoration','default');
    	$('a').unbind("click");
    	$('a').click(function(){});
    	$('body *').css('cursor','default');
    	$('blo').setAttribute("onclick", function() { return true; });
    }
    merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Récupérer tous les liens d'une page
    Par micatmidog dans le forum Langage
    Réponses: 13
    Dernier message: 03/11/2006, 01h37
  2. Récupérer tous les liens d'une page html
    Par lapras123 dans le forum C
    Réponses: 28
    Dernier message: 08/08/2006, 11h30
  3. [RegEx] récupérer tous les liens d'une page
    Par italiasky dans le forum Langage
    Réponses: 15
    Dernier message: 08/04/2006, 18h55
  4. [TWebBrowser] Comment trouver tous les liens dans une page ?
    Par xenos dans le forum Composants VCL
    Réponses: 1
    Dernier message: 15/01/2006, 23h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo