Як реалізувати діалогове вікно «підтвердження» у діалоговому вікні інтерфейсу Jquery?


148

Я намагаюся використовувати діалоговий інтерфейс JQuery UI Dialog для заміни некрасивого javascript:alert()вікна. У моєму сценарії у мене є список елементів, і поруч із кожною з них я мав би кнопку "видалити" для кожного з них. налаштування htsu psuedo буде наступним:

<ul>
    <li>ITEM <a href="url/to/remove"> <span>$itemId</span>
    <li>ITEM <a href="url/to/remove"><span>$itemId</span>
    <li>ITEM <a href="url/to/remove"><span>$itemId</span>
</ul>

<div id="confirmDialog">Are you sure?</div>

У частині JQ, на документі готовий, я спершу встановив би div, щоб бути модальним діалоговим вікном із необхідною кнопкою, і встановив ті "а", які потрібно запускати для підтвердження, перш ніж видаляти, як-от:

$("ul li a").click(function() {
  // Show the dialog    
  return false; // to prevent the browser actually following the links!
}

Гаразд, ось проблема. у діалоговому вікні init час не матиме уявлення про те, хто (елемент) запустить його, а також ідентифікатор елемента (!). Як я можу налаштувати поведінку цих кнопок підтвердження для того, щоб, якщо користувач все ж обрав ДА, він перейде за посиланням, щоб видалити його?


Існує простий у використанні плагін , щоб зробити це тут: stackoverflow.com/questions/6457750/form-confirm-before-submit

1
Looooong шукав рішення: stackoverflow.com/a/18474005/1876355
П'єр

Відповіді:


166

Мені просто довелося вирішити ту саму проблему. Ключовим фактором для роботи цього було те, що dialogнеобхідно частково ініціалізуватися в clickобробнику подій для посилання, з яким ви хочете використовувати функцію підтвердження (якщо ви хочете використовувати це для більш ніж одного посилання). Це пояснюється тим, що цільову URL-адресу посилання необхідно ввести в обробник події для натискання кнопки підтвердження. Я використовував клас CSS, щоб вказати, які посилання повинні мати поведінку підтвердження.

Ось моє рішення, вилучене, щоб бути прикладним.

<div id="dialog" title="Confirmation Required">
  Are you sure about this?
</div>

<script type="text/javascript">
  $(document).ready(function() {
    $("#dialog").dialog({
      autoOpen: false,
      modal: true
    });
  });

  $(".confirmLink").click(function(e) {
    e.preventDefault();
    var targetUrl = $(this).attr("href");

    $("#dialog").dialog({
      buttons : {
        "Confirm" : function() {
          window.location.href = targetUrl;
        },
        "Cancel" : function() {
          $(this).dialog("close");
        }
      }
    });

    $("#dialog").dialog("open");
  });
</script>

<a class="confirmLink" href="http://someLinkWhichRequiresConfirmation.com">Click here</a>
<a class="confirmLink" href="http://anotherSensitiveLink">Or, you could click here</a>

Я вважаю, що це спрацювало б для вас, якщо ви зможете генерувати свої посилання з класом CSS ( confirmLinkна моєму прикладі).

Ось jsfiddle з кодом у ньому.

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


2
+1 майже працює ... але дивіться відповідь від @lloydphillips на виправлення
rohancragg

Хтось ще помічає, що це спричинить повний PostBack всередині UpdatePanel? Як це виправити?
Гомер

3
Є щось у цій відповіді та у відповідях @lloydphillips, що просто не зовсім для мене. Оригінальне запитання посилається на кнопку "видалити" (посилання). Взагалі не доцільно використовувати посилання (HTTP GET) для операції, яка змінює стан (наприклад, DELETE). Обидва ці відповіді припускають, що у користувача включений JavaScript. Якщо javascript вимкнено, посилання запускаються, а операція видалення (або будь-яка інша) буде запущена без підтвердження, що може бути катастрофічно. Я сподівався знайти відповідь, яка стосувалась цього питання.
відлуння

@echo: Я думав про те саме. Щоб зробити це належним чином, я думаю, що повинна бути ще одна сторінка, яка запитує підтвердження, якщо JS відключений. Якщо JS, ця сторінка може бути пропущена. Можливо, через інший параметр get, як підтверджений = true. Дійсно важко і громіздко враховувати справи з JS і без них. Веб-розробка - це безлад.
robsch

1
@sree Звичайно. Ви можете витягнути функцію, яка взяла ім'я ідентифікатора для використання в якості параметра і здійснила дзвінки jQuery, щоб встановити обробники подій для переданого ідентифікатора.
Пол Морі

59

Я знайшов відповідь Павла не зовсім спрацював, оскільки те, як він встановлював параметри ПІСЛЯ діалогового діалогового вікна, коли подія натискання була невірною, була невірною. Ось мій код, який працював. Я не налаштовував це на приклад Павла, але різниця лише у котячого вуса в деяких елементах названа по-різному. Ви повинні мати можливість це опрацювати. Виправлення знаходиться у встановленні діалогового вікна для кнопок події клацання.

$(document).ready(function() {

    $("#dialog").dialog({
        modal: true,
        bgiframe: true,
        width: 500,
        height: 200,
        autoOpen: false
    });


    $(".lb").click(function(e) {

        e.preventDefault();
        var theHREF = $(this).attr("href");

        $("#dialog").dialog('option', 'buttons', {
            "Confirm" : function() {
                window.location.href = theHREF;
            },
            "Cancel" : function() {
                $(this).dialog("close");
            }
        });

        $("#dialog").dialog("open");

    });

});

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


1
Я не бачу, що ви зробили це було інакше, ніж відповідь Павла.
Грант Бірхмайер

2
Мені добре виглядає. Єдине, що я хотів би сказати, це використовувати onзамість цього click, оскільки це буде продовжувати працювати, якщо (наприклад) поле перемальовано за допомогою jQuery - api.jquery.com/on
Аарон Ньютон

1
га "різниця котячого вуса" - мені потрібно більше використовувати цю фразу.
Чад Горшинг

27

Я створив власну функцію для діалогу підтвердження інтерфейсу jquery ui. Ось код

function myConfirm(dialogText, okFunc, cancelFunc, dialogTitle) {
  $('<div style="padding: 10px; max-width: 500px; word-wrap: break-word;">' + dialogText + '</div>').dialog({
    draggable: false,
    modal: true,
    resizable: false,
    width: 'auto',
    title: dialogTitle || 'Confirm',
    minHeight: 75,
    buttons: {
      OK: function () {
        if (typeof (okFunc) == 'function') {
          setTimeout(okFunc, 50);
        }
        $(this).dialog('destroy');
      },
      Cancel: function () {
        if (typeof (cancelFunc) == 'function') {
          setTimeout(cancelFunc, 50);
        }
        $(this).dialog('destroy');
      }
    }
  });
}

Тепер, щоб використовувати це у своєму коді, просто напишіть наступне

myConfirm('Do you want to delete this record ?', function () {
    alert('You clicked OK');
  }, function () {
    alert('You clicked Cancel');
  },
  'Confirm Delete'
);

Продовжуй.


Це хороше рішення, воно дуже схоже на моє, яке я використовую для отримання URL-адреси ajax та швидкого відображення ... функція JQueryDialog (url) {$ ("# діалог"). Delete (); $ ("body"). append ("<div id = 'dialog' title = 'www.mysite.com'> </div>"); $ ("# діалог"). load (url) .dialog ({зміна: помилково, ширина: 770, висота: 470, модальний: вірно, кнопки: {"Закрити": функція () {$ (це) .dialog ( "закрити"); $ ("# діалог"). delete ();}}}); }
conners

6

Просте і коротке рішення, яке я щойно спробував, і воно працює

  $('.confirm').click(function() {
    $(this).removeClass('confirm');
    $(this).text("Sure?");
    $(this).unbind();
    return false;
  });

тоді просто додайте клас = "підтвердити" до свого посилання, і воно працює!


Повідомлення .text запитує "Звичайно?" але не дає вибору так / ні, добре / скасувати. Як користувач вказує, чи вони "впевнені" чи "не впевнені"?
Генкі

6

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

$("#btn").on("click", function(ev){
    ev.preventDefault();

    dialog.dialog("open");

    dialog.find(".btnConfirm").on("click", function(){
        // trigger click under different namespace so 
        // click handler will not be triggered but native
        // functionality is preserved
        $("#btn").trigger("click.confirmed");
    }
    dialog.find(".btnCancel").on("click", function(){
        dialog.dialog("close");
    }
});

Особисто я віддаю перевагу цьому рішенню :)

редагувати: Вибачте ... я дійсно повинен пояснити це детальніше. Мені це подобається, тому що, на мою думку, це елегантне рішення. Коли користувач натискає кнопку, яку спочатку потрібно підтвердити, подія скасовується, як це має бути. Якщо натиснути кнопку підтвердження, рішення полягає не в тому, щоб імітувати клацання посилання, а викликати ту саму нативну подію jquery (натискання) на оригінальну кнопку, яка б спрацьовувала, якби не було діалогового вікна підтвердження. Єдина відмінність полягає в іншому просторі імен подій (у даному випадку "підтверджено"), щоб діалогове вікно підтвердження не відображалося знову. Тоді власний механізм Jquery може перейняти, і все може працювати як слід. Ще однією перевагою є його використання для кнопок та гіперпосилань. Я сподіваюся, що я був досить зрозумілий.


Подумайте про редагування своєї публікації та скажіть громаді, чому ви віддаєте перевагу такому рішенню. Що робить це кращим для вас?
Fuzzical Logic

Я редагував публікацію. Сподіваюся, зараз це має більше сенсу. Коли я написав це, здавалося таким зрозумілим, що коментар не потребує. Яка різниця, коли я переглянув це через деякий час ... :)
BineG

Чудове, як дуже чисте рішення! Ніколи раніше не читайте про простори імен подій. Дякую за це!
гриффла

КРАСНО! ".. але запустити ту саму нативну подію jquery (натисніть) на оригінальну кнопку .." звучить beauutifulll !! Дякую за $("#btn").trigger("click.confirmed");
Ірф

4

Я знаю, що це старе питання, але ось моє рішення з використанням атрибутів даних HTML5 у MVC4:

<div id="dialog" title="Confirmation Required" data-url="@Url.Action("UndoAllPendingChanges", "Home")">
  Are you sure about this?
</div>

JS-код:

$("#dialog").dialog({
    modal: true,              
    autoOpen: false,
    buttons: {
        "Confirm": function () {
            window.location.href = $(this).data('url');
        },
        "Cancel": function () {
            $(this).dialog("close");
        }
    }
});

$("#TheIdOfMyButton").click(function (e) {
    e.preventDefault();
    $("#dialog").dialog("open");
});

Мені подобається це рішення, дякую. Легко зрозуміти, і працює для мене. Я не використовував частину @ Url.Action, але вона працює з URL-адресою, створеною моїм сервером MVC на базі сервера (PHP / Symfony2).
fazy

3

Це зробить?

$("ul li a").click(function(e) {
  e.preventDefault();
  $('#confirmDialog').show();

  var delete_path = $(this).attr('href');

  $('#confirmDialog a.ok').unbind('click'); //  just in case the cancel link 
                                            //  is not the  only way you can
                                            //  close your dialog
  $('#confirmDialog a.ok').click(function(e) {
     e.preventDefault();
     window.location.href = delete_path;
  });

});

$('#confirmDialog a.cancel').click(function(e) {
   e.preventDefault();
   $('#confirmDialog').hide();
   $('#confirmDialog a.ok').unbind('click');
});

Дякуємо за цю відповідь Я впевнений, що перевіряю його (і все-таки він виглядає функціональним). Однією з проблем, яку я бачив з багатьох відповідей тут, є відсутність загальності. Якщо на сторінці є інший набір елементів управління (або посилань тощо), які потребували підтвердження, нам здається, що нам потрібно багаторазове оголошення про взаємодію / дію. Старий спосіб JavaScript, тобто href = "javascript: підтвердити ('link_url');" є простим і елегантним і підходить для всіх подібних випадків. Звичайно, метод JavaScript занадто нав'язливий, щоб люди без Javascript повністю пропустили посилання. Ще раз thx за чудову відповідь.
xandy

3

Як зазначено вище. Попередні публікації заставили мене в правильному шляху. Ось як я це зробив. Ідея полягає у тому, щоб зображення було поруч із кожним рядком таблиці (генерується PHP-скриптом із бази даних). Після натискання зображення користувач буде перенаправлений на URL-адресу, і як результат, відповідний запис буде видалений з бази даних, показуючи деякі дані, що стосуються запису, що натиснувся в діалоговому вікні jQuery UI.

Код JavaScript:

$(document).ready(function () {
  $("#confirmDelete").dialog({
    modal: true,
    bgiframe: true,
    autoOpen: false
  });
});

function confirmDelete(username, id) {
  var delUrl = "/users/delete/" + id;
  $('#confirmDelete').html("Are you sure you want to delete user: '" + username + "'");
  $('#confirmDelete').dialog('option', 'buttons', {
    "No": function () {
      $(this).dialog("close");
    },
    "Yes": function () {
      window.location.href = delUrl;
    }
  });
  $('#confirmDelete').dialog('open');
}

Діалогічний розділ:

<div id="confirmDelete" title="Delete User?"></div> 

Посилання на зображення:

<img src="img/delete.png" alt="Delete User" onclick="confirmDelete('<?=$username;?>','<?=$id;?>');"/>

Таким чином ви можете передати значення циклу PHP у діалогове вікно. Єдиним недоліком є ​​використання методу GET для фактичного виконання дії.


2

Як щодо цього:

$("ul li a").click(function() {

el = $(this);
$("#confirmDialog").dialog({ autoOpen: false, resizable:false,
                             draggable:true,
                             modal: true,
                             buttons: { "Ok": function() {
                                el.parent().remove();
                                $(this).dialog("close"); } }
                           });
$("#confirmDialog").dialog("open");

return false;
});

Я перевірив це на цьому html:

<ul>
<li><a href="#">Hi 1</a></li>
<li><a href="#">Hi 2</a></li>
<li><a href="#">Hi 3</a></li>
<li><a href="#">Hi 4</a></li>
</ul>

Він видаляє весь елемент li, ви можете адаптувати його під свої потреби.


2

(Станом на 22.03.2016, завантаження на пов’язану сторінку не працює. Я залишаю посилання тут, якщо розробник виправить її в якийсь момент, оскільки це чудовий маленький плагін. Оригінальна публікація випливає. альтернатива та посилання, яке насправді працює: jquery.confirm .)

Це може бути занадто простим для ваших потреб, але ви можете спробувати цей плагін для підтвердження jQuery . Це дуже просто у використанні і робить роботу в багатьох випадках.


Посилання веде мене до зв'язаного профілю. Здається, ви не можете бачити плагін, який ви знімаєте.
Зейн

Я оновив посилання, щоб воно знову працювало. Розробник повинен перенаправляти стару посилання на її профіль LinkedIn. Якщо вона змінить її ще раз, просто просто погуглить її за допомогою "jquery підтвердити плагін nadia".
grahamesd

Дякую! Поки я вже реалізував свою версію, я все ще буду дивитись.
Зене

посилання знову мертва
Валамас

1

Наскільки я ненавиджу використовувати eval, для мене це здавалося найпростішим способом, не викликаючи багато проблем залежно від різних обставин. Подібно до функції встановлення часу JavaScript.

<a href="#" onclick="javascript:confirm('do_function(params)');">Confirm</a>
<div id="dialog-confirm" title="Confirm" style="display:none;">
    <p>Are you sure you want to do this?</p>
</div>
<script>
function confirm(callback){
    $( "#dialog-confirm" ).dialog({
        resizable: false,
        height:140,
        modal: false,
        buttons: {
            "Ok": function() {
                $( this ).dialog( "close" );
                eval(callback)
            },
            Cancel: function() {
                $( this ).dialog( "close" );
                return false;
            }
        }
    });
}

function do_function(params){
    console.log('approved');
}
</script>

1

Я сам наткнувся на це і закінчив рішення, яке схоже на декілька відповідей тут, але реалізовано дещо інакше. Мені не сподобалось багато фрагментів javascript чи дев-де-заповнювача десь. Я хотів узагальнене рішення, яке потім можна було б використовувати в HTML, не додаючи JavaScript для кожного використання. Ось що я придумав (для цього потрібен jquery ui):

Javascript:

$(function() {

  $("a.confirm").button().click(function(e) {

    e.preventDefault();

    var target = $(this).attr("href");
    var content = $(this).attr("title");
    var title = $(this).attr("alt");

    $('<div>' + content + '</div>'). dialog({
      draggable: false,
      modal: true,
      resizable: false,
      width: 'auto',
      title: title,
      buttons: {
        "Confirm": function() {
          window.location.href = target;
        },
        "Cancel": function() {
          $(this).dialog("close");
        }
      }
    });

  });

});

І тоді в HTML не потрібні дзвінки або посилання javascript:

<a href="http://www.google.com/"
   class="confirm"
   alt="Confirm test"
   title="Are you sure?">Test</a>

Оскільки атрибут заголовка використовується для вмісту div, користувач навіть може отримати запитання про підтвердження, натиснувши на кнопку (саме тому я не користувався атрибутом заголовка для плитки). Назва вікна підтвердження - це вміст тегу alt. Фрагмент javascript може бути включений до узагальненого .js include, і, просто застосувавши клас, у вас є досить вікно підтвердження.


0
$("ul li a").live('click', function (e) {
            e.preventDefault();

            $('<div></div>').appendTo('body')
                    .html('<div><h6>Are you sure about this?</h6></div>')
                    .dialog({
                        modal: true, title: 'Delete message', zIndex: 10000, autoOpen: true,
                        width: 'auto', modal: true, resizable: false,
                        buttons: {
                            Confirm: function () {
                                // $(obj).removeAttr('onclick');                                
                                // $(obj).parents('.Parent').remove();

                                $(this).dialog("close");

                                window.location.reload();
                            },
                            No: function () {
                                $(this).dialog("close");
                            }
                        },
                        Cancel: function (event, ui) {
                            $(this).remove();
                        }
                    });

            return false;
        });

0

ПРИМІТКА: Не вистачає респондентів для коментарів, але відповідь BineG прекрасно справляється з вирішенням проблем, пов’язаних із зворотним посиланням на сторінках ASPX. На честь, ось варіант з використанням динамічного діалогу.

$('#submit-button').bind('click', function(ev) {
    var $btn = $(this);
    ev.preventDefault();
    $("<div />").html("Are you sure?").dialog({
        modal: true,
        title: "Confirmation",
        buttons: [{
            text: "Ok",
            click: function() {
                $btn.trigger("click.confirmed");
                $(this).dialog("close");
            }
        }, {
            text: "Cancel",
            click: function() {
                $(this).dialog("close");
            }
        }]
    }).show();  
});

0

Інший варіант вищезазначеного, де він перевіряє, чи це елемент керування "asp: linkbutton" або "asp: button", який відображається у вигляді двох різних елементів керування html. Здається, він працює для мене чудово, але не перевіряв його широко.

        $(document).on("click", ".confirm", function (e) {
            e.preventDefault();
            var btn = $(this);
            $("#dialog").dialog('option', 'buttons', {
                "Confirm": function () {
                    if (btn.is("input")) {                            
                        var name = btn.attr("name");
                        __doPostBack(name, '')
                    }
                    else {
                        var href = btn.attr("href");
                        window.location.href = href;
                    }
                    $(this).dialog("close");
                },
                "Cancel": function () {
                    $(this).dialog("close");
                }
            });

            $("#dialog").dialog("open");
        });

0

Я шукав це для використання на кнопках посилань в ASP.NET Gridview (збірка GridView Control в командах). Тому дія "Підтвердити" у діалоговому вікні має активувати сценарій, створений контролем Gridview під час виконання. це працювало для мене:

 $(".DeleteBtnClass").click(function (e) {
     e.preventDefault();
     var inlineFunction = $(this).attr("href") + ";";
     $("#dialog").dialog({
         buttons: {
             "Yes": function () {
                 eval(inlineFunction); // eval() can be harmful!
             },
                 "No": function () {
                 $(this).dialog("close");
             }
         }
     });
 });

eval () може бути шкідливим! До речі, я мушу цитувати цю частину вашого коду: var inlineFunction = $(this).attr("href") + ";"; /* ... */ eval(inlineFunction);Це зовсім не має сенсу!
Sk8erPeter

0

Я знаю, що це питання давнє, але мені вперше довелося скористатися діалоговим вікном підтвердження. Я думаю, що це найкоротший спосіб зробити це.

$(element).onClick(function(){ // This can be a function or whatever, this is just a trigger
  var conBox = confirm("Are you sure ?");
    if(conBox){ 
        // Do what you have to do
    }
    else
        return;
});

Сподіваюся що вам це подобається :)


0

Особисто я бачу це як періодична вимога у багатьох переглядах багатьох програм ASP.Net MVC.

Ось чому я визначив клас моделі та частковий вигляд:

using Resources;

namespace YourNamespace.Models
{
  public class SyConfirmationDialogModel
  {
    public SyConfirmationDialogModel()
    {
      this.DialogId = "dlgconfirm";
      this.DialogTitle = Global.LblTitleConfirm;
      this.UrlAttribute = "href";
      this.ButtonConfirmText = Global.LblButtonConfirm;
      this.ButtonCancelText = Global.LblButtonCancel;
    }

    public string DialogId { get; set; }
    public string DialogTitle { get; set; }
    public string DialogMessage { get; set; }
    public string JQueryClickSelector { get; set; }
    public string UrlAttribute { get; set; }
    public string ButtonConfirmText { get; set; }
    public string ButtonCancelText { get; set; }
  }
}

І моя часткова думка:

@using YourNamespace.Models;

@model SyConfirmationDialogModel

<div id="@Model.DialogId" title="@Model.DialogTitle">
  @Model.DialogMessage
</div>

<script type="text/javascript">
  $(function() {
    $("#@Model.DialogId").dialog({
      autoOpen: false,
      modal: true
    });

    $("@Model.JQueryClickSelector").click(function (e) {
      e.preventDefault();
      var sTargetUrl = $(this).attr("@Model.UrlAttribute");

      $("#@Model.DialogId").dialog({
        buttons: {
          "@Model.ButtonConfirmText": function () {
            window.location.href = sTargetUrl;
          },  
          "@Model.ButtonCancelText": function () {
            $(this).dialog("close");
          }
        }
      });

      $("#@Model.DialogId").dialog("open");
    });
  });
</script>

І тоді, кожного разу, коли вам це потрібно для перегляду, ви просто використовуєте @ Html.Partial (зробив це в сценаріях розділів, щоб JQuery визначено):

@Html.Partial("_ConfirmationDialog", new SyConfirmationDialogModel() { DialogMessage = Global.LblConfirmDelete, JQueryClickSelector ="a[class=SyLinkDelete]"})

Трюк полягає в тому, щоб вказати JQueryClickSelector, який буде відповідати елементам, які потребують діалогового вікна підтвердження. У моєму випадку всі прив’язки до класу SyLinkDelete, але це може бути ідентифікатор, інший клас тощо. Для мене це був список:

<a title="Delete" class="SyLinkDelete" href="/UserDefinedList/DeleteEntry?Params">
    <img class="SyImageDelete" alt="Delete" src="/Images/DeleteHS.png" border="0">
</a>

ASP.Net MVC з jQuery.
Фредерік Самсон

0

Дуже популярна тема і google знаходить це для запиту "діалогового вікна jquery закрити, на яку подію було натиснуто". Моє рішення обробляє YES, NO, ESC_KEY, X події належним чином. Я хочу, щоб моя функція зворотного дзвінка була викликана незалежно від того, яким чином було розміщено діалог.

function dialog_YES_NO(sTitle, txt, fn) {
    $("#dialog-main").dialog({
        title: sTitle,
        resizable: true,
        //height:140,
        modal: true,
        open: function() { $(this).data("retval", false); $(this).text(txt); },
        close: function(evt) {
            var arg1 = $(this).data("retval")==true;
            setTimeout(function() { fn(arg1); }, 30);
        },
        buttons: {
            "Yes": function() { $(this).data("retval", true); $(this).dialog("close"); },
            "No": function()  { $(this).data("retval", false); $(this).dialog("close"); }
        }
    });
}
- - - - 
dialog_YES_NO("Confirm Delete", "Delete xyz item?", function(status) {
   alert("Dialog retval is " + status);
});

Легко перенаправити браузер на новий URL або виконати щось інше при відновленні функції.


0

Стільки хороших відповідей тут;) Ось мій підхід. Подібне вживання eval ().

function functionExecutor(functionName, args){
    functionName.apply(this, args);
}

function showConfirmationDialog(html, functionYes, fYesArgs){
    $('#dialog').html(html);
    $('#dialog').dialog({
        buttons : [
            {
                text:'YES',
                click: function(){
                    functionExecutor(functionYes, fYesArgs);
                    $(this).dialog("close");
                },
                class:'green'
            },
            {
                text:'CANCEL',
                click: function() {
                    $(this).dialog("close");
                },
                class:'red'
            }
        ]
    });     
}

А використання виглядає так:

function myTestYesFunction(arg1, arg2){
    alert("You clicked YES:"+arg1+arg2);
}

function toDoOrNotToDo(){
    showConfirmationDialog("Dialog text", myTestYesFunction, ['My arg 1','My arg 2']);
}

0

JQuery UI пропонує таке рішення:

$( function() {
    $( "#dialog-confirm" ).dialog({
      resizable: false,
      height: "auto",
      width: 400,
      modal: true,
      buttons: {
        "Delete all items": function() {
          $( this ).dialog( "close" );
        },
        Cancel: function() {
          $( this ).dialog( "close" );
        }
      }
    });
  } );

HTML

<div id="dialog-confirm" title="Empty the recycle bin?">
  <p><span class="ui-icon ui-icon-alert" style="float:left; margin:12px 12px 20px 0;">
 </span>These items will be permanently deleted and cannot be recovered. Are you sure?</p>
</div>

Ви можете додатково налаштувати це, вказавши ім'я функції JQuery і передавши текст / заголовок, який потрібно відобразити як параметр.

Довідка: https://jqueryui.com/dialog/#modal-confirmation


-1

Ну це відповідь на ваші запитання ...

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>
<HEAD>
<TITLE>Santa Luisa</TITLE>
<style>
    body{margin:0;padding:0;background-color:#ffffff;}
    a:link {color:black;}    
a:visited {color:black;}  
a:hover {color:red;}  
a:active {color:red;}
</style>

</HEAD>
<body>

<link rel="stylesheet" href="jquery/themes/base/jquery.ui.all.css">
    <script src="jquery-1.4.4.js"></script>

    <script src="external/jquery.bgiframe-2.1.2.js"></script>
    <script src="ui/jquery.ui.core.js"></script>

    <script src="ui/jquery.ui.widget.js"></script>
    <script src="ui/jquery.ui.mouse.js"></script>
    <script src="ui/jquery.ui.draggable.js"></script>
    <script src="ui/jquery.ui.position.js"></script>

    <script src="ui/jquery.ui.resizable.js"></script>
    <script src="ui/jquery.ui.dialog.js"></script>

    <link rel="stylesheet" href="demos.css">
    <script>
    var lastdel;
    $(function() {
        $( "#dialog" ).dialog({
            autoOpen: false,modal: true,closeOnEscape: true
        });

        $(".confirmLink").click(function(e) {
            e.preventDefault();
            var lastdel = $(this).attr("href");

        });


        $("#si").click( function() {
            $('#dialog').dialog('close');
            window.location.href =lastdel;

        });
        $("#no").click( function() {
            $('#dialog').dialog('close');
        });
    });

    </script>

<SCRIPT LANGUAGE="JavaScript">
<!--
        var currentimgx;
        var cimgoverx=200-6;
        var cimgoutx=200;


        function overbx(obj){
        color='#FF0000';
        width='3px';
        obj.style.borderTopWidth = width;
        obj.style.borderTopColor =color;
        obj.style.borderTopStyle ='solid';

        obj.style.borderLeftWidth = width;
        obj.style.borderLeftColor =color;
        obj.style.borderLeftStyle ='solid';

        obj.style.borderRightWidth = width;
        obj.style.borderRightColor =color;
        obj.style.borderRightStyle ='solid';

        obj.style.borderBottomWidth = width;
        obj.style.borderBottomColor =color;
        obj.style.borderBottomStyle ='solid';


        currentimgx.style.width=cimgoverx+"px";
        currentimgx.style.height=cimgoverx+"px"; 

    }

    function outbx(obj){
        obj.style.borderTopWidth = '0px';   
        obj.style.borderLeftWidth = '0px';
        obj.style.borderRightWidth = '0px';
        obj.style.borderBottomWidth = '0px';

        currentimgx.style.width=cimgoutx+"px";
        currentimgx.style.height=cimgoutx+"px"; 
    }

function ifocusx(obj){
        color='#FF0000';
        width='3px';
        obj.style.borderTopWidth = width;
        obj.style.borderTopColor =color;
        obj.style.borderTopStyle ='solid';

        obj.style.borderLeftWidth = width;
        obj.style.borderLeftColor =color;
        obj.style.borderLeftStyle ='solid';

        obj.style.borderRightWidth = width;
        obj.style.borderRightColor =color;
        obj.style.borderRightStyle ='solid';

        obj.style.borderBottomWidth = width;
        obj.style.borderBottomColor =color;
        obj.style.borderBottomStyle ='solid';

    }

    function iblurx(obj){
        color='#000000';
        width='3px';
        obj.style.borderTopWidth = width;
        obj.style.borderTopColor =color;
        obj.style.borderTopStyle ='solid';

        obj.style.borderLeftWidth = width;
        obj.style.borderLeftColor =color;
        obj.style.borderLeftStyle ='solid';

        obj.style.borderRightWidth = width;
        obj.style.borderRightColor =color;
        obj.style.borderRightStyle ='solid';

        obj.style.borderBottomWidth = width;
        obj.style.borderBottomColor =color;
        obj.style.borderBottomStyle ='solid';
    }

    function cimgx(obj){
        currentimgx=obj;
    }


    function pause(millis){
    var date = new Date();
    var curDate = null;

    do { curDate = new Date(); }
    while(curDate-date < millis);
    } 


//-->
</SCRIPT>
<div id="dialog" title="CONFERMA L`AZIONE" style="text-align:center;">
    <p><FONT  COLOR="#000000" style="font-family:Arial;font-size:22px;font-style:bold;COLOR:red;">CONFERMA L`AZIONE:<BR>POSSO CANCELLARE<BR>QUESTA RIGA ?</FONT></p>

    <p><INPUT TYPE="submit" VALUE="SI" NAME="" id="si"> --><INPUT TYPE="submit" VALUE="NO" NAME="" id="no"></p>
</div>



<TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0" WIDTH="100%" height="100%">
<TR valign="top" align="center">
    <TD>
    <FONT COLOR="red" style="font-family:Arial;font-size:25px;font-style:bold;color:red;">Modifica/Dettagli:<font style="font-family:Arial;font-size:20px;font-style:bold;background-color:yellow;color:red;">&nbsp;298&nbsp;</font><font style="font-family:Arial;font-size:20px;font-style:bold;background-color:red;color:yellow;">dsadas&nbsp;sadsadas&nbsp;</font>&nbsp;</FONT>
    </TD>
</TR>

<tr valign="top">
    <td align="center">
        <TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0" WIDTH="">
        <TR align="left">

            <TD>
                <TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0" WIDTH="">

                <TR align="left">
                    <TD>
                    <font style="font-sixe:30px;"><span style="color:red;">1</span></font><br><TABLE class="tabela" CELLSPACING="0" CELLPADDING="0" BORDER="1" WIDTH="800px"><TR style="color:white;background-color:black;"><TD align="center">DATA</TD><TD align="center">CODICE</TD><TD align="center">NOME/NOMI</TD><TD  align="center">TESTO</TD><td>&nbsp;</td><td>&nbsp;</td></TR><TR align="center"><TD>12/22/2010&nbsp;</TD><TD>298&nbsp;</TD><TD>daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</TD><TD><A HREF="modificarigadiario.php?codice=298"  style="font-weight:bold;color:red;font-size:30px;">Modifica</A></TD><TD><A HREF="JavaScript:void(0);"  style="font-weight:bold;color:red;font-size:30px;" onclick="$('#dialog').dialog('open');$('#dialog').animate({ backgroundColor: '#aa0000', color: '#fff', width: 250 }, 2000);lastdel='cancellarighe.php?codice=298&id=1';alert(lastdel);" class="confirmLink">Cancella</A></TD><TR align="center"><TD>22/10/2010&nbsp;</TD><TD>298&nbsp;</TD><TD>dfdsfsdfsf</TD><TD><A HREF="modificarigadiario.php?codice=298"  style="font-weight:bold;color:red;font-size:30px;">Modifica</A></TD><TD><A HREF="JavaScript:void(0);"  style="font-weight:bold;color:red;font-size:30px;" onclick="$('#dialog').dialog('open');$('#dialog').animate({ backgroundColor: '#aa0000', color: '#fff', width: 250 }, 2000);lastdel='cancellarighe.php?codice=298&id=2';alert(lastdel);" class="confirmLink">Cancella</A></TD></TABLE><font style="font-sixe:30px;"><span style="color:red;">1</span></font><br>

                    </TD>
                </TR>

                </TABLE>
            </TD>
        </TR>
        </TABLE>
    </td>
</tr>
</tbody></table>


</body>
</html>

переконайтеся, що у вас є jquery 1.4.4 та jquery.ui


Це один з найпотворніших кодів, який я бачив за роки. Ви використовуєте застарілі атрибути (на зразок LANGUAGE="JavaScript"), використовуєте змішані великі та малі символи, ви безперешкодно змішуєте прості JS-коди з кодами jQuery, і ви встановлюєте стилі з JS замість CSS (некрасиві та семантично неправильні), і, до речі, ваш стиль модифікація (з простою JS) абсолютно не має значення щодо початкового питання. Ви обов'язково повинні скоротити і прикрасити свій код і зосередитись на відповіді на початкове запитання.
Sk8erPeter

-1

Простий спосіб за допомогою дотику JavaScript

$("#myButton").click(function(event) {
    var cont = confirm('Continue?');
    if(cont) {
        // do stuff here if OK was clicked
        return true;
    }
    // If cancel was clicked button execution will be halted.
    event.preventDefault();
}

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