<a> 링크를 클릭 할 때 확인 대화 상자를 표시하는 방법은 무엇입니까?


269

이 링크에 사용자에게 " 정말입니까? " 예 / 아니요 ”.

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

이 예제 는 최신 브라우저에서만 작동합니다 (이전 IE의 경우 attachEvent(), 사용할 수 있고 브라우저 간 문제를 해결하는 jQuery와 같은 라이브러리를 returnValue구현 getElementsByClassName()하거나 사용할 수 있음). 이 고급 이벤트 처리 방법에 대한 자세한 내용 은 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).
익명

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
이 간단한 것에 대한 두 개의 라이브러리?
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;
  }
}

이 핸들러를 다음 중 하나로 첨부 할 수 있습니다.

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

또는 이전 버전의 인터넷 익스플로러 :

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

오래된 IE에 관심이 있다면 잊지 마십시오 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 및 자바 스크립트 를 사용하려는 경우 아래 답변이 저에게 효과적입니다. 링크에 부트 스트랩 아이콘 "휴지통"을 사용했습니다.

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

그리고 첫 번째 코드에서와 같이 수정 한 다음 필요한 것만으로 실행합니다. 내 사건이 필요없는 누군가를 도울 수 있기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.