Làm cách nào để hiển thị hộp thoại xác nhận khi nhấp vào liên kết <a>?


269

Tôi muốn liên kết này có một hộp thoại JavaScript hỏi người dùng có chắc không? Y / NÔNG .

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

Nếu người dùng nhấp vào Có Có, thì liên kết sẽ tải, nếu không có thì không có gì xảy ra.

Tôi biết làm thế nào để làm điều đó trong các hình thức, bằng cách sử dụng onclickchạy một hàm trả về truehoặc false. Nhưng làm thế nào để tôi làm điều này với một <a>liên kết?


Làm thế nào chúng ta có thể đạt được angularjs1.x này
Bhaskara Arani

Câu trả lời:


597

Xử lý sự kiện nội tuyến

Theo cách đơn giản nhất, bạn có thể sử dụng confirm()hàm trong onclicktrình xử lý nội tuyến .

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

Xử lý sự kiện nâng cao

Nhưng thông thường, bạn muốn tách HTML và Javascript của mình , vì vậy tôi khuyên bạn không nên sử dụng các trình xử lý sự kiện nội tuyến, mà hãy đặt một lớp trên liên kết của bạn và thêm một trình lắng nghe sự kiện vào nó.

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

Ví dụ này sẽ chỉ hoạt động trong các trình duyệt hiện đại (ví IES cũ hơn, bạn có thể sử dụng attachEvent(), returnValuevà cung cấp một thực hiện cho getElementsByClassName()hoặc sử dụng một thư viện như jQuery sẽ giúp các vấn đề qua trình duyệt). Bạn có thể đọc thêm về phương thức xử lý sự kiện nâng cao này trên MDN .

jQuery

Tôi muốn tránh xa việc bị coi là một fanboy của jQuery, nhưng thao tác DOM và xử lý sự kiện là hai lĩnh vực giúp ích nhiều nhất cho sự khác biệt của trình duyệt. Để cho vui, đây là giao diện của 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>

Nó thực sự dễ dàng! Tôi xấu hổ hay sao! Tôi chỉ cho rằng chỉ làm việc trên các hình thức. Liệu hộp thoại xác nhận hoạt động cho mọi yếu tố có thể nhấp?
Christoffer

1
@Tophe Hộp thoại xác nhận không liên quan gì đến các yếu tố cụ thể.
kapa

1
Đối với một cái gì đó đơn giản như thế này, có thực sự cần thiết phải tách HTML và JavaScript không? Vấn đề gì bạn sẽ thấy trước bằng cách để một hàm nội tuyến đơn giản và ngắn như vậy?
Ciaran Gallagher

5
@CiaranG Nó luôn bắt đầu như thế này :), sau đó bạn thêm cái này và cái kia, v.v ... Nếu bạn xoay sở để giải quyết các mối quan tâm, bạn sẽ cảm thấy sạch sẽ hơn nếu bạn thoát khỏi hầu hết các trình xử lý nội tuyến này. Họ không có gì để làm trong HTML của bạn. Ít nhất là theo ý kiến ​​của tôi, và ít nhất là trong hầu hết các trường hợp. Luôn có những trường hợp đặc biệt - sự lười biếng không nên là một trong số đó.
kapa

@Ulysnep Theo đề xuất chỉnh sửa của bạn , đã xảy ra lỗi khi bỏ dấu chấm phẩy sau khi confirm(…)xử lý nội tuyến. Tôi không thể tái tạo điều đó.
dùng4642212

15

Tôi khuyên bạn nên tránh JavaScript nội tuyến:

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

Bản demo của Fiddle JS .

Các cập nhật ở trên để giảm không gian, mặc dù duy trì sự rõ ràng / chức năng:

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

Bản demo của Fiddle JS .

Một bản cập nhật hơi muộn, để sử dụng addEventListener()(như được đề xuất, bởi bažmegakapa , trong các bình luận bên dưới):

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

Bản demo của Fiddle JS .

Ở trên liên kết một chức năng với sự kiện của từng liên kết riêng lẻ; Điều này có khả năng khá lãng phí, khi bạn có thể liên kết xử lý sự kiện (sử dụng ủy quyền) với một yếu tố tổ tiên, chẳng hạn như sau:

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

Bản demo của Fiddle JS .

Bởi vì xử lý sự kiện được gắn vào bodyphần tử, thường chứa một loạt các phần tử khác, có thể nhấp, nên tôi đã sử dụng hàm tạm thời ( actionToFunction) để xác định phải làm gì với nhấp chuột đó. Nếu phần tử được nhấp là một liên kết và do đó có một tagNamephần a, việc xử lý nhấp được truyền cho reallySure()hàm.

Người giới thiệu:


Cảm ơn bạn. Các giải pháp xác nhận nội tuyến ngắn làm việc. Tại sao bạn đề nghị tránh mã nội tuyến? Tôi thường tránh xa CSS nội tuyến vì những lý do rõ ràng, nhưng những lý do trong đoạn mã javascript ngắn là gì?
Christoffer

Vì chính xác cùng một lý do mà CSS nội tuyến không thể truy cập được, việc bảo trì sẽ khó khăn hơn và dẫn đến HTML lộn xộn hơn và đòi hỏi một lượng công việc không phù hợp để cập nhật nếu các yêu cầu thay đổi.
David nói phục hồi Monica

Tôi đồng ý với quan điểm không sử dụng xử lý nội tuyến. Nhưng nếu chúng ta đính kèm các trình xử lý của mình vào tập lệnh, thì mô hình nâng cao sẽ được sử dụng ( addEventListener). +1 mặc dù.
kapa

@ bažmegakapa: Tôi ... có xu hướng đồng ý; nhưng tôi phải thú nhận rằng tôi chưa trở nên thoải mái với addEventListener()mô hình.
David nói phục hồi Monica

Bạn có thể thay thế if(check == true)bằng if(check).
Ẩn danh

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

5

Bạn cũng có thể thử điều này:

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

Ans được đưa ra bởi @kapa rất dễ dàng và ít lộn xộn
dipenparmar12

1

jAplus

Bạn có thể làm điều đó mà không cần viết mã 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>

Trang demo


11
Cảm ơn bạn đã chia sẻ, nhưng tất nhiên bạn đang sử dụng Javascript, bạn đang thêm toàn bộ thư viện để xử lý một cái gì đó rất đơn giản. Nó có đáng không? Tôi không biết thư viện đó, tôi sẽ đọc về nó, nếu bạn sử dụng nó cho các mục đích khác, có lẽ nó đáng để tải thêm ...
Marcos Buarque

1
Hai thư viện cho điều đơn giản này?
maracuja-nước ép

0

Phương pháp này hơi khác so với một trong các câu trả lời ở trên nếu bạn đính kèm trình xử lý sự kiện của mình bằng addEventListener (hoặc 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;
  }
}

Bạn có thể đính kèm trình xử lý này với một trong hai:

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

Hoặc cho các phiên bản cũ hơn của trình duyệt Internet Explorer:

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

Nếu bạn quan tâm đến IE cũ, đừng quên window.event.
kapa

0

Để giải trí, tôi sẽ sử dụng một sự kiện duy nhất trên toàn bộ tài liệu thay vì thêm một sự kiện vào tất cả các thẻ neo:

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

Phương pháp này sẽ hiệu quả hơn nếu bạn có nhiều thẻ neo. Tất nhiên, nó sẽ trở nên hiệu quả hơn nữa khi bạn thêm sự kiện này vào thùng chứa có tất cả các thẻ neo.


0

Hầu hết các trình duyệt không hiển thị thông báo tùy chỉnh được chuyển đến confirm().

Với phương pháp này, bạn có thể hiển thị cửa sổ bật lên với thông báo tùy chỉnh nếu người dùng của bạn thay đổi giá trị của bất kỳ <input>trường nào .

Bạn chỉ có thể áp dụng điều này cho một số liên kết hoặc thậm chí các yếu tố HTML khác trong trang của bạn. Chỉ cần thêm một lớp tùy chỉnh cho tất cả các liên kết cần xác nhận và áp dụng sử dụng mã sau đây:

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

Hãy thử thay đổi giá trị đầu vào trong ví dụ để có bản xem trước về cách thức hoạt động của nó.


-2

SỬ DỤNG PHP, HTML VÀ JAVASCRIPT để nhắc nhở

Chỉ cần ai đó tìm kiếm sử dụng php, html và javascript trong một tệp duy nhất, câu trả lời dưới đây có hiệu quả với tôi .. tôi đã đính kèm với biểu tượng "thùng rác" được sử dụng cho liên kết.

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

Lý do tôi sử dụng mã php ở giữa là vì tôi không thể sử dụng nó ngay từ đầu ..

đoạn mã dưới đây không hoạt động với tôi: -

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

và tôi đã sửa đổi nó như trong mã thứ 1 sau đó tôi chạy đúng như những gì tôi cần .. Tôi hy vọng rằng tôi có thể giúp ai đó trong trường hợp của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.