<a>リンクをクリックしたときに確認ダイアログを表示する方法


269

このリンクに、ユーザーに「本当によろしいですか?」Y / N」。

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

ユーザーが「はい」をクリックするとリンクが読み込まれ、「いいえ」の場合は何も起こりません。

or onclickを返す関数を実行して、フォームでそれを行う方法を知っています。しかし、リンクを使用してこれを行うにはどうすればよいですか?truefalse<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()returnValueとの実装を提供するgetElementsByClassName()か、クロスブラウザの問題で役立つjQueryのようなライブラリを使用します)。この高度なイベント処理メソッドの詳細については、MDNを参照してください

jQuery

jQueryファンボーイと見なされることから遠ざけたいのですが、DOMの操作とイベント処理は、ブラウザーの違いで最も役立つ2つの領域です。ちょうど楽しみのために、これは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で何もする必要はありません。少なくとも私の意見では、少なくともほとんどの場合。常に特別な状況があります-怠惰はそれらの1つであってはなりません。
kapa 2013

@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スニペットの理由は何ですか?
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によるAnsは非常に簡単で、面倒ではありません
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 2014

1
この単純なことのための2つのライブラリ?
maracuja-juice 2017

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
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を使用することを探している人がいても、以下の答えは私にとってはうまくいきます。

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