จะแสดงข้อความยืนยันเมื่อคลิกลิงค์ <a> ได้อย่างไร


269

ฉันต้องการให้ลิงค์นี้มีข้อความจาวาสคริปต์ที่ถามผู้ใช้“ คุณแน่ใจหรือไม่? Y / N

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

หากผู้ใช้คลิกที่ "ใช่" ลิงค์ควรโหลดถ้า "ไม่" จะไม่มีอะไรเกิดขึ้น

ฉันรู้วิธีที่จะทำในรูปแบบที่ใช้onclickเรียกใช้ฟังก์ชั่นที่ให้ผลตอบแทนหรือtrue falseแต่ฉันจะทำสิ่งนี้กับ<a>ลิงค์ได้อย่างไร


เราจะบรรลุ angularjs1.x นี้ได้อย่างไร
Bhaskara Arani

คำตอบ:


597

ตัวจัดการเหตุการณ์แบบอินไลน์

ในวิธีที่ง่ายที่สุดคุณสามารถใช้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>

ตัวอย่างนี้จะทำงานเฉพาะในเบราว์เซอร์ที่ทันสมัย (สำหรับ IEs เก่าที่คุณสามารถใช้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>

มันง่ายจริง ๆ ! ฉันอายหรืออะไรนะ! ฉันแค่คิดว่ามันใช้ได้กับแบบฟอร์มเท่านั้น กล่องโต้ตอบการยืนยันทำงานสำหรับองค์ประกอบที่คลิกได้ทุกรายการหรือไม่
Christoffer

1
@Tophe โต้ตอบยืนยันตัวเองไม่มีอะไรเกี่ยวข้องกับองค์ประกอบที่เฉพาะเจาะจง
kapa

1
สำหรับสิ่งที่ง่ายอย่างนี้จำเป็นต้องแยก HTML และ JavaScript ออกจากกันหรือไม่ คุณคาดการณ์ปัญหาอะไรโดยการปล่อยฟังก์ชั่นอินไลน์แบบง่ายและสั้น?
Ciaran Gallagher

5
@CiaranG มันเริ่มต้นเช่นนี้เสมอ :) จากนั้นคุณเพิ่มสิ่งนี้และอื่น ๆ ถ้าคุณจัดการกับการแยกข้อกังวลคุณจะรู้สึกสะอาดขึ้นถ้าคุณกำจัดตัวจัดการอินไลน์เหล่านี้ส่วนใหญ่ พวกเขาไม่มีอะไรทำใน HTML ของคุณ อย่างน้อยก็ในความคิดของฉันและอย่างน้อยก็ในกรณีส่วนใหญ่ มีสถานการณ์พิเศษเสมอ - ความเกียจคร้านไม่ควรเป็นหนึ่งในนั้น
kapa

@ 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 ซอ

การปรับปรุงข้างต้นเพื่อลดพื้นที่ แต่ยังคงความชัดเจน / ฟังก์ชั่น:

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

การปรับปรุงล่าช้าค่อนข้างที่จะใช้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 ซอ

ด้านบนเชื่อมโยงฟังก์ชันกับเหตุการณ์ของแต่ละลิงก์ ซึ่งอาจสิ้นเปลืองมากเมื่อคุณสามารถผูกการจัดการเหตุการณ์ (โดยใช้การมอบหมาย) กับองค์ประกอบบรรพบุรุษเช่นต่อไปนี้:

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

เนื่องจากการจัดการเหตุการณ์แนบมากับbodyองค์ประกอบซึ่งโดยปกติจะมีโฮสต์ขององค์ประกอบอื่นคลิกได้ฉันได้ใช้ฟังก์ชันชั่วคราว ( actionToFunction) เพื่อกำหนดว่าจะทำอย่างไรกับการคลิกนั้น หากองค์ประกอบที่คลิกคือลิงค์ดังนั้นจึงมีองค์ประกอบtagNameของaการจัดการการคลิกจะถูกส่งผ่านไปยังreallySure()ฟังก์ชั่น

อ้างอิง:


ขอบคุณ. โซลูชันการยืนยันแบบอินไลน์แบบสั้นทำงานได้ ทำไมคุณแนะนำให้หลีกเลี่ยงรหัสแบบอินไลน์ ฉันมักจะหลีกเลี่ยง CSS แบบอินไลน์ด้วยเหตุผลที่ชัดเจน แต่เหตุผลอะไรในตัวอย่างของจาวาสคริปต์สั้น ๆ
Christoffer

ด้วยเหตุผลเดียวกันกับที่ CSS ในบรรทัดไม่สามารถมองเห็นได้มันยากที่จะรักษาและนำไปสู่ ​​HTML ที่ยุ่งกว่าและต้องใช้จำนวนงานมากเกินไปในการอัปเดตหากข้อกำหนดมีการเปลี่ยนแปลง
เดวิดบอกว่าคืนสถานะโมนิก้า

ฉันเห็นด้วยกับจุดที่ไม่ได้ใช้ตัวจัดการแบบอินไลน์ แต่ถ้าเราแนบตัวจัดการของเรากับสคริปต์แล้วควรใช้โมเดลขั้นสูง ( addEventListener) +1 แม้ว่า
kapa

@ bažmegakapa: ฉัน ... มักจะเห็นด้วย แต่ฉันต้องยอมรับว่าฉันยังไม่คุ้นเคยกับaddEventListener()โมเดล
เดวิดบอกว่าคืนสถานะโมนิก้า

คุณสามารถแทนที่ด้วยif(check == true) if(check)
ไม่ระบุชื่อ


5

คุณสามารถลองสิ่งนี้:

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

Ans ที่ @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
ห้องสมุดสองแห่งสำหรับสิ่งง่าย ๆ นี้หรือไม่?
maracuja-juice

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

คุณสามารถแนบ handler นี้ด้วย:

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

หรือสำหรับ Internet Explorer เวอร์ชันเก่า:

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

หากคุณกำลังดูแลเกี่ยวกับ IEs window.eventเก่าอย่าลืม
kapa

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ในไฟล์เดียวคำตอบด้านล่างนี้ใช้ได้สำหรับฉัน .. ฉันแนบมากับการใช้ไอคอน bootstrap "ถังขยะ" สำหรับลิงก์

<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 จากนั้นฉันเรียกใช้เป็นสิ่งที่ฉันต้องการ .. ฉันหวังว่าฉันจะสามารถช่วยใครบางคนกรณีของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.