Comment afficher une boîte de dialogue de confirmation lorsque vous cliquez sur un lien <a>?

269

Je veux que ce lien ait une boîte de dialogue JavaScript qui demande à l'utilisateur « Êtes-vous sûr? O / N ».

<a href="delete.php?id=22">Link</a>

Si l'utilisateur clique sur «Oui», le lien devrait se charger, si «Non», rien ne se passera.

Je sais comment faire cela dans les formulaires, en utilisant onclickune fonction qui retourne trueou false. Mais comment faire cela avec un <a>lien?

Christoffer
la source
Comment nous pouvons atteindre cet angularjs1.x
Bhaskara Arani

Réponses:

597

Gestionnaire d'événements en ligne

De la manière la plus simple, vous pouvez utiliser la confirm()fonction dans un onclickgestionnaire en ligne .

<a href="delete.php?id=22" onclick="return confirm('Are you sure?')">Link</a>

Gestion avancée des événements

Mais normalement, vous souhaitez séparer votre code HTML et Javascript , je vous suggère donc de ne pas utiliser de gestionnaires d'événements en ligne, mais de mettre une classe sur votre lien et d'y ajouter un écouteur d'événements.

<a href="delete.php?id=22" class="confirmation">Link</a>
...
<script type="text/javascript">
    var elems = document.getElementsByClassName('confirmation');
    var confirmIt = function (e) {
        if (!confirm('Are you sure?')) e.preventDefault();
    };
    for (var i = 0, l = elems.length; i < l; i++) {
        elems[i].addEventListener('click', confirmIt, false);
    }
</script>

Cet exemple ne fonctionne que dans les navigateurs modernes (pour IEs plus anciens , vous pouvez utiliser attachEvent(), returnValueet fournir une implémentation pour getElementsByClassName()ou utiliser une bibliothèque comme jQuery qui aidera les questions multi-navigateurs). Vous pouvez en savoir plus sur cette méthode avancée de gestion des événements sur MDN .

jQuery

Je voudrais rester loin d'être considéré comme un fanboy de jQuery, mais la manipulation DOM et la gestion des événements sont deux domaines où cela aide le plus avec les différences de navigateur. Juste pour le plaisir, voici à quoi cela ressemblerait avec jQuery :

<a href="delete.php?id=22" class="confirmation">Link</a>
...
<!-- Include jQuery - see http://jquery.com -->
<script type="text/javascript">
    $('.confirmation').on('click', function () {
        return confirm('Are you sure?');
    });
</script>
kapa
la source
Était-ce vraiment si simple! Suis-je gêné ou quoi! J'ai juste supposé que cela ne fonctionnait que sur les formulaires. La boîte de dialogue de confirmation fonctionne-t-elle pour chaque élément cliquable?
Christoffer
1
@Tophe La boîte de dialogue de confirmation elle-même n'a rien à voir avec des éléments spécifiques.
kapa
1
Pour quelque chose d'aussi simple que cela, est-il vraiment nécessaire de séparer le HTML et le JavaScript? Quels problèmes prévoyez-vous en laissant une fonction aussi simple et courte en ligne?
Ciaran Gallagher
5
@CiaranG Cela commence toujours comme ceci :), puis vous ajoutez ceci et cela, etc. Si vous parvenez à accepter la séparation des préoccupations, vous vous sentirez plus propre si vous vous débarrassez de la plupart de ces gestionnaires en ligne. Ils n'ont tout simplement rien à voir avec votre code HTML. Du moins à mon avis, et au moins dans la plupart des cas. Il y a toujours des circonstances spéciales - la paresse ne doit pas en faire partie.
kapa
@Ulysnep Selon votre suggestion de modification, il y avait un bogue lors de l'omission du point-virgule après confirm(…)dans le gestionnaire en ligne. Je n'ai pas pu reproduire cela.
user4642212
15

Je suggère d'éviter le JavaScript en ligne:

var aElems = document.getElementsByTagName('a');

for (var i = 0, len = aElems.length; i < len; i++) {
    aElems[i].onclick = function() {
        var check = confirm("Are you sure you want to leave?");
        if (check == true) {
            return true;
        }
        else {
            return false;
        }
    };
}​

Démo JS Fiddle .

Les éléments ci-dessus ont été mis à jour pour réduire l'espace, tout en maintenant la clarté / la fonction:

var aElems = document.getElementsByTagName('a');

for (var i = 0, len = aElems.length; i < len; i++) {
    aElems[i].onclick = function() {
        return confirm("Are you sure you want to leave?");
    };
}

Démo JS Fiddle .

Une mise à jour quelque peu tardive, à utiliser addEventListener()(comme suggéré, par bažmegakapa , dans les commentaires ci-dessous):

function reallySure (event) {
    var message = 'Are you sure about that?';
    action = confirm(message) ? true : event.preventDefault();
}
var aElems = document.getElementsByTagName('a');

for (var i = 0, len = aElems.length; i < len; i++) {
    aElems[i].addEventListener('click', reallySure);
}

Démo JS Fiddle .

Ce qui précède lie une fonction à l'événement de chaque lien individuel; ce qui est potentiellement très coûteux, lorsque vous pouvez lier la gestion des événements (en utilisant la délégation) à un élément ancêtre, tel que le suivant:

function reallySure (event) {
    var message = 'Are you sure about that?';
    action = confirm(message) ? true : event.preventDefault();
}

function actionToFunction (event) {
    switch (event.target.tagName.toLowerCase()) {
        case 'a' :
            reallySure(event);
            break;
        default:
            break;
    }
}

document.body.addEventListener('click', actionToFunction);

Démo JS Fiddle .

Parce que la gestion des événements est attachée à l' bodyélément, qui contient normalement une foule d'autres éléments cliquables, j'ai utilisé une fonction intérimaire ( actionToFunction) pour déterminer quoi faire avec ce clic. Si l'élément cliqué est un lien et a donc un tagNameof a, la gestion des clics est transmise à la reallySure()fonction.

Références:

David dit de réintégrer Monica
la source
Je vous remercie. La solution de confirmation en ligne courte a fonctionné. Pourquoi proposez-vous d'éviter le code en ligne? Je m'éloigne généralement du CSS en ligne pour des raisons évidentes, mais quelles sont les raisons des courts extraits de javascript?
Christoffer
Pour la même raison que le CSS en ligne est déconseillé, il est plus difficile à maintenir, et il conduit à un HTML plus compliqué et nécessite une quantité excessive de travail à mettre à jour si les exigences changent.
David dit de réintégrer Monica
Je suis d'accord avec le point de ne pas utiliser de gestionnaires en ligne. Mais si nous attachons quand même nos gestionnaires au script, le modèle avancé devrait être utilisé ( addEventListener). +1 cependant.
kapa
@ bažmegakapa: Je ... suis plutôt d'accord; mais je dois avouer que je ne suis pas encore devenu à l'aise avec le addEventListener()modèle.
David dit de réintégrer Monica
Vous pouvez remplacer if(check == true)par if(check).
Anonyme
14
<a href="delete.php?id=22" onclick = "if (! confirm('Continue?')) { return false; }">Confirm OK, then goto URL (uses onclick())</a>
codeur
la source
5

Vous pouvez également essayer ceci:

<a href="" onclick="if (confirm('Delete selected item?')){return true;}else{event.stopPropagation(); event.preventDefault();};" title="Link Title">
    Link Text
</a>
Wolfack
la source
Les réponses données par @kapa sont très faciles et moins
compliquées
1

jAplus

Vous pouvez le faire, sans écrire de code JavaScript

<head>
   <script src="/path/to/jquery.js" type="text/javascript" charset="utf-8"></script>
   <script src="/path/to/jquery.Aplus.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
...
   <a href="delete.php?id=22" class="confirm" title="Are you sure?">Link</a>
...
</body>

Page de démonstration

erik
la source
11
Merci pour le partage, mais bien sûr, vous utilisez Javascript, vous ajoutez une bibliothèque entière pour gérer quelque chose de très simple. Est-ce que ça vaut le coup? Je ne connais pas cette bibliothèque, je vais lire à ce sujet, si vous l'utilisez également à d'autres fins, peut-être vaut-il la charge supplémentaire ...
Marcos Buarque
1
Deux bibliothèques pour cette chose simple?
maracuja-juice
0

Cette méthode est légèrement différente de l'une des réponses ci-dessus si vous attachez votre gestionnaire d'événements à l'aide de addEventListener (ou attachEvent).

function myClickHandler(evt) {
  var allowLink = confirm('Continue with link?');
  if (!allowLink) {
    evt.returnValue = false; //for older Internet Explorer
    if (evt.preventDefault) {
      evt.preventDefault();
    }
    return false;
  }
}

Vous pouvez attacher ce gestionnaire avec:

document.getElementById('mylinkid').addEventListener('click', myClickHandler, false);

Ou pour les anciennes versions d'Internet Explorer:

document.getElementById('mylinkid').attachEvent('onclick', myClickHandler);
Chad Killingsworth
la source
Si vous vous souciez des anciens IE, n'oubliez pas window.event.
kapa
0

Juste pour le plaisir, je vais utiliser un seul événement sur l'ensemble du document au lieu d'ajouter un événement à toutes les balises d'ancrage:

document.body.onclick = function( e ) {
    // Cross-browser handling
    var evt = e || window.event,
        target = evt.target || evt.srcElement;

    // If the element clicked is an anchor
    if ( target.nodeName === 'A' ) {

        // Add the confirm box
        return confirm( 'Are you sure?' );
    }
};

Cette méthode serait plus efficace si vous disposiez de plusieurs balises d'ancrage. Bien sûr, il devient encore plus efficace lorsque vous ajoutez cet événement au conteneur contenant toutes les balises d'ancrage.

Florian Margaine
la source
0

La plupart des navigateurs n'affichent pas le message personnalisé transmis à confirm().

Avec cette méthode, vous pouvez afficher une fenêtre contextuelle avec un message personnalisé si votre utilisateur a modifié la valeur d'un <input>champ.

Vous ne pouvez l'appliquer qu'à certains liens , ou même à d'autres éléments HTML de votre page. Ajoutez simplement une classe personnalisée à tous les liens qui nécessitent une confirmation et appliquez le code suivant:

$(document).ready(function() {
  let unsaved = false;
  // detect changes in all input fields and set the 'unsaved' flag
  $(":input").change(() => unsaved = true);
  // trigger popup on click
  $('.dangerous-link').click(function() {
    if (unsaved && !window.confirm("Are you sure you want to nuke the world?")) {
      return; // user didn't confirm
    }
    // either there are no unsaved changes or the user confirmed
    window.location.href = $(this).data('destination');
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


<input type="text" placeholder="Nuclear code here" />
<a data-destination="https://en.wikipedia.org/wiki/Boom" class="dangerous-link">
    Launch nuke!
</a>

Essayez de modifier la valeur d'entrée dans l'exemple pour obtenir un aperçu de son fonctionnement.

Salvioner
la source
-2

UTILISATION DE PHP, HTML ET JAVASCRIPT pour l'invite

Juste si quelqu'un cherche à utiliser php, html et javascript dans un seul fichier, la réponse ci-dessous fonctionne pour moi.

<a class="btn btn-danger" href="<?php echo "delete.php?&var=$var"; ?>" onclick="return confirm('Are you sure want to delete this?');"><span class="glyphicon glyphicon-trash"></span></a>

la raison pour laquelle j'ai utilisé du code php au milieu est parce que je ne peux pas l'utiliser depuis le début ..

le code ci-dessous ne fonctionne pas pour moi: -

echo "<a class='btn btn-danger' href='delete.php?&var=$var' onclick='return confirm('Are you sure want to delete this?');'><span class='glyphicon glyphicon-trash'></span></a>";

et je l'ai modifié comme dans le 1er code, puis je lance comme ce dont j'ai besoin .. J'espère que je peux aider quelqu'un qui a besoin de mon cas.

Shah Abd Hafiz
la source