Як відобразити діалогове вікно підтвердження при натисканні посилання <a>?


268

Я хочу, щоб це посилання мало діалог JavaScript, який запитує користувача " Ви впевнені? Так / Ні ”.

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

Якщо користувач натисне "Так", посилання має завантажитися, якщо "Ні" нічого не відбудеться.

Я знаю, як це зробити у формах, використовуючи onclickфункцію, яка повертає trueабо false. Але як це зробити за допомогою <a>посилання?


Як ми можемо досягти цього angularjs1.x
Bhaskara

Відповіді:


596

Вбудований обробник подій

Найпростішим способом можна скористатися confirm()функцією в вбудованому onclickобробнику.

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

Розширена робота з подіями

Але зазвичай ви хочете розділити свої HTML та Javascript , тому я пропоную вам не використовувати вбудовані обробники подій, а поставити клас на своє посилання та додати до нього слухача подій.

<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>

Цей приклад буде працювати тільки в сучасних браузерах (для старих ІЕ ви можете використовувати attachEvent(), returnValueі забезпечити реалізацію getElementsByClassName()або використовувати бібліотеку як JQuery , який допоможе з крос-браузерні проблеми). Детальніше про цей розширений метод обробки подій ви можете прочитати на MDN .

jQuery

Я хотів би триматися далеко від того, щоб вважатись фанатом jQuery, але маніпуляція з DOM та обробка подій - це дві сфери, де це найбільше допомагає у відмінності від браузера. Просто для розваги, ось як би це виглядало з 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>

Це було насправді так просто! Мені соромно чи що! Я просто припускав, що працював лише над формами. Чи працює діалогове вікно підтвердження для кожного елемента, який можна натиснути?
Крістофер

1
@Tophe Сам діалог підтвердження не має нічого спільного з конкретними елементами.
капа

1
Для чогось такого простого, чи справді потрібно розділяти HTML та JavaScript? Які питання ви б передбачили, залишивши в інтернеті таку просту та коротку функцію?
Ciaran Gallagher

5
@CiaranG Це завжди починається так :), потім ви додаєте це і те, і т. Д. Якщо вам вдасться прийняти розділення проблем, ви відчуєте себе чистішими, якщо позбудетеся більшості цих вбудованих обробників. Вони просто не мають нічого робити у вашому HTML. Принаймні, на мою думку, і принаймні в більшості випадків. Завжди є особливі обставини - лінь не повинна бути однією з них.
капа

@Ulysnep Згідно з вашою пропозицією щодо редагування, під час опускання крапки з комою після confirm(…)введення вбудованого обробника виникла помилка . Я не міг цього відтворити.
user4642212

15

Я б рекомендував уникати вбудованого JavaScript:

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;
        }
    };
}​

Демонстрація JS Fiddle .

Наведене вище оновлено для зменшення простору, незважаючи на збереження чіткості / функції:

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?");
    };
}

Демонстрація JS Fiddle .

Дещо запізніле оновлення для використання addEventListener()(як запропонував bažmegakapa , у коментарях нижче):

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);
}

Демонстрація JS Fiddle .

Вищезазначене пов'язує функцію з подією кожної окремої ланки; що потенційно є досить марним, коли ви можете пов'язувати обробку подій (використовуючи делегування) з елементом предка, таким як:

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);

Демонстрація JS Fiddle .

Оскільки обробка подій приєднана до bodyелемента, який зазвичай містить безліч інших елементів, на які можна натиснути, я використав проміжну функцію ( actionToFunction), щоб визначити, що робити з цим клацанням. Якщо клацнути мишею елемент є посиланням, і , отже , має tagNameз a, клік-звернення передається вreallySure() функції.

Список літератури:


Дякую. Коротке вбудоване рішення підтвердження спрацювало. Чому ви пропонуєте уникати вбудованого коду? Зазвичай я тримаюсь подалі від вбудованого CSS з очевидних причин, але які причини у коротких фрагментах JavaScript?
Крістофер

Точно з тієї ж причини, що вбудований CSS недоцільний, підтримувати його складніше, і це призводить до того, що HTML-код Messier потребує оновлення, якщо вимоги будуть змінені.
Девід каже повернути Моніку

Я погоджуюся з тим, що не використовувати вбудовані обробники. Але якщо ми все-таки приєднаємо обробників до сценарію, слід використовувати просунуту модель ( addEventListener). Хоча +1.
капа

@ bažmegakapa: Я ... схильний погодитися; але мушу зізнатися, що мені ще не стало зручно з addEventListener()моделлю.
Девід каже, що поверніть Моніку

Ви можете замінити if(check == true)на if(check).
Анонім

14
<a href="delete.php?id=22" onclick = "if (! confirm('Continue?')) { return false; }">Confirm OK, then goto URL (uses onclick())</a>

5

Ви також можете спробувати це:

<a href="" onclick="if (confirm('Delete selected item?')){return true;}else{event.stopPropagation(); event.preventDefault();};" title="Link Title">
    Link Text
</a>

Відповіді, надані @kapa, дуже легкі і менш брудні
dipenparmar12

1

jAplus

Ви можете це зробити, не пишучи 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>

Демонстраційна сторінка


11
Дякуємо за обмін, але, звичайно, ви використовуєте Javascript, ви додаєте цілу бібліотеку для обробки чогось дуже простого. Чи варто того? Я не знаю цієї бібліотеки, я прочитаю про неї, якщо ви використовуєте її і для інших цілей, можливо, це вартує додаткового навантаження ...
Marcos Buarque

1
Дві бібліотеки для цієї простої речі?
маракуя-сік

0

Цей спосіб дещо відрізняється, ніж будь-який із наведених вище відповідей, якщо ви приєднаєте обробник подій за допомогою addEventListener (або 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;
  }
}

Ви можете приєднати цей обробник за допомогою будь-якого:

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

Або для старих версій Internet Explorer:

document.getElementById('mylinkid').attachEvent('onclick', myClickHandler);

Якщо ви дбаєте про старі IE, не забувайте window.event.
капа

0

Для задоволення я буду використовувати одну подію у всьому документі замість того, щоб додати подію до всіх тегів якоря:

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?' );
    }
};

Цей спосіб був би більш ефективним, якби у вас було багато якорних тегів. Звичайно, це стає ще ефективнішим, коли ви додаєте цю подію до контейнера, що містить усі теги прив’язки.


0

У більшості браузерів не відображається призначене для користувача повідомлення confirm().

За допомогою цього методу ви можете показати спливаюче вікно зі спеціальним повідомленням, якщо ваш користувач змінив значення будь-якого <input> поля.

Ви можете застосувати це лише до деяких посилань або навіть інших елементів HTML на своїй сторінці. Просто додайте спеціальний клас до всіх посилань, які потребують підтвердження, та застосуйте, використовуючи наступний код:

$(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>

Спробуйте змінити вхідне значення у прикладі, щоб отримати попередній перегляд того, як він працює.


-2

ВИКОРИСТАННЯ PHP, HTML і JAVASCRIPT для запиту

Просто, якщо хтось шукає використання php, html та javascript в одному файлі, відповідь нижче працює для мене .. Я додається з використанням піктограми завантажувальної програми "сміття" для посилання.

<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>

Причина, що я використовував PHP- код в середині, тому що я не можу використовувати його з самого початку ..

код нижче не працює для мене: -

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>";

і я змінив його, як у 1-му коді, тоді я запускаю як саме те, що мені потрібно .. Я сподіваюся, що я можу допомогти комусь, хто перебуває в моєму випадку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.