Более 2 кнопок на sweetalert 2

У меня есть оповещение с двумя кнопками, но я хочу, чтобы в нем была еще одна кнопка. Например, на данный момент у меня есть да и нет, я хочу добавить еще одну кнопку сказать позже. Пожалуйста помоги.

$("#close_account").on("click", function(e) {
    e.preventDefault();
    swal({
        title: "Are you sure?",
        text: "You will not be able to open  your account!",
        type: "warning",
        showCancelButton: true,
        confirmButtonColor: "#DD6B55",
        confirmButtonText: "Yes, close my account!",
        closeOnConfirm: false
    },
    function() {
        window.location.href="<?php echo base_url().'users/close_account' ?>"
    });
});

Заранее спасибо.


person Sukhwinder Sodhi    schedule 01.09.2016    source источник


Ответы (8)


Вы должны использовать пользовательский HTML с привязками событий jQuery, он работает почти так же, единственная проблема заключается в том, что вам нужно добавить стили для кнопок самостоятельно, потому что классы SweetAlert не работают для меня.

$(document).ready(function() {
  $("#close_account").on("click", function(e) {
    var buttons = $('<div>')
    .append(createButton('Ok', function() {
       swal.close();
       console.log('ok'); 
    })).append(createButton('Later', function() {
       swal.close();
       console.log('Later'); 
    })).append(createButton('Cancel', function() {
       swal.close();
       console.log('Cancel');
    }));
    
    e.preventDefault();
    swal({
      title: "Are you sure?",
      html: buttons,
      type: "warning",
      showConfirmButton: false,
      showCancelButton: false
    });
  });
});

function createButton(text, cb) {
  return $('<button>' + text + '</button>').on('click', cb);
}
<link href="https://cdn.jsdelivr.net/sweetalert2/4.2.4/sweetalert2.min.css" rel="stylesheet"/>
<script src="https://cdn.jsdelivr.net/sweetalert2/4.2.4/sweetalert2.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button id="close_account">Show</button>

person G07cha    schedule 01.09.2016
comment
любая идея, как добавить пробелы между кнопками - person Miloud BAKTETE; 26.09.2017
comment
@baktetemiloud, вы можете добавлять классы к кнопкам и стилизовать их по своему усмотрению с помощью CSS. - person G07cha; 26.09.2017
comment
@KonstantinAzizov Я использую старую версию sweetalert, как я могу добавить в нее пользовательские кнопки !? - person bharat parmar; 17.01.2018
comment
@bharatparmar, на самом деле html должен быть доступен в старой версии sweetalert, с какой проблемой вы столкнулись в текущей реализации? - person G07cha; 17.01.2018
comment
К сожалению, это перестало работать в sweetalert2 4.2.6. - person Richard Cook; 28.06.2018
comment
В частности, это изменение: github.com/sweetalert2/ sweetalert2/сравнить/. Теперь узлы клонируются по мере их добавления во внутренний HTML (который, вероятно, удаляет обработчики событий). - person Richard Cook; 28.06.2018

Приведенный выше ответ не сработал для меня, поэтому я сделал следующее:

    $(document).on('click', '.SwalBtn1', function() {
        //Some code 1
        console.log('Button 1');
        swal.clickConfirm();
    });
    $(document).on('click', '.SwalBtn2', function() {
        //Some code 2 
        console.log('Button 2');
        swal.clickConfirm();
    });

$('#ShowBtn').click(function(){
    swal({
        title: 'Title',
        html: "Some Text" +
            "<br>" +
            '<button type="button" role="button" tabindex="0" class="SwalBtn1 customSwalBtn">' + 'Button1' + '</button>' +
            '<button type="button" role="button" tabindex="0" class="SwalBtn2 customSwalBtn">' + 'Button2' + '</button>',
        showCancelButton: false,
        showConfirmButton: false
    });
 });
.customSwalBtn{
		background-color: rgba(214,130,47,1.00);
    border-left-color: rgba(214,130,47,1.00);
    border-right-color: rgba(214,130,47,1.00);
    border: 0;
    border-radius: 3px;
    box-shadow: none;
    color: #fff;
    cursor: pointer;
    font-size: 17px;
    font-weight: 500;
    margin: 30px 5px 0px 5px;
    padding: 10px 32px;
	}
<link href="https://cdn.jsdelivr.net/sweetalert2/4.2.4/sweetalert2.min.css" rel="stylesheet"/>
<script src="https://cdn.jsdelivr.net/sweetalert2/4.2.4/sweetalert2.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button id="ShowBtn" class="customSwalBtn">Alert</button>

person Ricardo Melo    schedule 24.03.2017

Ричард Кук заметил выше, что исходный ответ (предоставленный Константином Азизовым) перестал работать с версией 4.2.6 SweetAlert2. Он предположил, что это связано с клонированием узлов по мере их добавления в html. Я недостаточно хорошо знаю SweetAlert2, чтобы сказать, прав он или нет. Однако я мог видеть, что мои кнопки были добавлены, но функции обратного вызова onclick никогда не вызывались.

Приложив небольшие усилия, я смог заставить это работать с текущим выпуском SweetAlert2. Чтобы заставить его работать, мне пришлось назначить события onclick кнопкам на более позднем этапе. В итоге я добавил идентификаторы к кнопкам, чтобы их было легко выбирать из jQuery. Затем я добавил функцию onOpen к моему объекту swal и подключил логику, чтобы связать функции обратного вызова. Ниже приведен фрагмент кода, который работает для меня.

Также обратите внимание, что сообщение и кнопки используют некоторые существующие классы SweetAlert2, поэтому они выглядят так же, как существующие элементы пользовательского интерфейса. Предостережение: я пытался использовать классы swal2-confirm и swal2-cancel. Когда я это сделал, я столкнулся с некоторыми проблемами. Возможно, код SweetAlert2 зависит от наличия только одного элемента, использующего этот класс. У меня не было времени заниматься этим, поэтому я просто перестал использовать эти классы.

function createButton(text, id) {
        return $('<button class="swal2-input swal2-styled" id="'+id+'">'+text+'</button>');
    }

    function createMessage(text) {
        return $('<div class="swal2-content" style="display: block;">'+text+'</div>');
    }

function swThreeButton(msg, textOne, textTwo, textThree, callbackOne, callbackTwo, callbackThree) {

        var buttonsPlus = $('<div>')
                .append(createMessage(msg))
                .append(createButton(textOne,'sw_butt1'))
                .append(createButton(textTwo,'sw_butt2'))
                .append(createButton(textThree,'sw_butt3'));

        swal({
            title: 'Select Option',
            html: buttonsPlus,
            type: 'question',

            showCancelButton: false,
            showConfirmButton: false,
            animation: false,
            customClass: "animated zoomIn",
            onOpen: function (dObj) {
                $('#sw_butt1').on('click',function () {
                   swal.close();
                   callbackOne();
                });
                $('#sw_butt2').on('click',function () {
                    swal.close();
                    callbackTwo();
                });
                $('#sw_butt3').on('click',function () {
                    swal.close();
                    callbackThree();
                });
            }
        });

    };


person KW402    schedule 21.06.2019

Однажды мне нужно было добавить третью кнопку во всплывающее окно SweetAlert2. В моем случае самым простым способом было использовать footer, который может быть как обычным текстом, так и HTML:

$(function() {
    $('.btn').click(function(e) {
        e.preventDefault();
        
        Swal.fire({
            icon: 'warning',
            title: 'Are you sure?',
            text: 'You won\'t be able to revert this!',
            showCloseButton: true,
            showCancelButton: true,
            footer: '<a href="#!" id="some-action">Some action</a>'
        }).then((result) => {
            console.log(result);
        });
    });
    
    $(document).on('click', '#some-action', function(e) {
        e.preventDefault();
        console.log('Some action triggered.');
    });
});
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@9"></script>

<div class="text-center">
    <button type="button" class="btn btn-primary my-3">Click me</button>
</div>

person N'Bayramberdiyev    schedule 12.12.2019

Для sweetalert2 у меня это сработало: (Запустить вживую)

var onBtnClicked = (btnId) => {
  Swal.close();
  if (btnId != "cancel") Swal.fire("you choosed: " + btnId);
};
Swal.fire({
  title: "What you want to do?",
  icon: "warning",
  showConfirmButton: false,
  showCloseButton: true,
  html: `
    <p>select an action</p>
    <div>
      <button class="btn btn-primary" onclick="onBtnClicked('reply')">Reply</button>
      <button class="btn btn-danger" onclick="onBtnClicked('delete')">Delete</button>
      <button class="btn btn-secondary" onclick="onBtnClicked('cancel')">Cancel</button>
    </div>`
});
person yaya    schedule 02.09.2020

???????????? Недавно мы выпустили SweetAlert2 v10 с поддержкой третьей кнопки отказа:

введите здесь описание изображения

Swal.fire({
  title: 'Do you want to save the changes?',
  showDenyButton: true,
  showCancelButton: true,
  confirmButtonText: `Save`,
  denyButtonText: `Don't save`,
}).then((result) => {
  /* Read more about isConfirmed, isDenied below */
  if (result.isConfirmed) {
    Swal.fire('Saved!', '', 'success')
  } else if (result.isDenied) {
    Swal.fire('Changes are not saved', '', 'info')
  }
})
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@10"></script> 

Прочитайте примечания к выпуску для версии 10: https://github.com/sweetalert2/sweetalert2/releases/v10.0.0

person Limon Monte    schedule 16.09.2020
comment
Привет, я пробовал это, но я использую версию SweetAlert, в которой диалог запускается с использованием только swal, а не swal.fire. Я обновил файлы JS и CSS, затем заменил все вхождения swal( на swal.fire(, и диалоговое окно отображается, но очень уродливо. Например, текст выравнивается по-разному, а значки не отображаются. Итак, я понял, что эта версия не имеет обратной совместимости. Единственное решение иметь еще одну кнопку — использовать собственный HTML? - person jstuardo; 09.06.2021

Теперь это очень просто с ES6.

Пожалуйста, смотрите здесь: как добавить кнопки Неограниченное

  createSwalButton = async () => {

    let swalButton = await swal({
      title: "Add Buttons?",
      text: "This will create a new button.",
      icon: "info",
      buttons: {
        buttonOne: {
          text: "First",
          value: "firstVal",
          visible: true,
          className: "swal-btn-cancel",
          closeModal: true,
        },
        buttonTwo: {
          text: "Second",
          value: "secondVal",
          visible: true,
          className: "swal-btn-confirm",
          closeModal: true
        },
        buttonThree: {
          text: "Third",
          value: "thirdVal",
          visible: true,
          className: "swal-btn-confirm",
          closeModal: true
        },
        buttonFour: {
          text: "Fourth",
          value: "fourthVal",
          visible: true,
          className: "swal-btn-confirm",
          closeModal: true
        },
        buttonFive: {
          text: "Fifth",
          value: "fifthVal",
          visible: true,
          className: "swal-btn-confirm",
          closeModal: true
        }
      },
    })

    if (swalButton === "firstVal") {    
      //do stuff
    }
  }

Хорошо, я, возможно, переборщил, но вы видите, как это работает.

Привет команде SWAL! Это отличный продукт.

person Israel Peck    schedule 27.04.2021

Для sweetalert2 это сработало для меня

$(document).ready(function() {
  $("#close_account").on("click", function(e) {
    var buttons = $('<div>')
    .append(createButton('Ok', function() {
       swal.close();
       console.log('ok'); 
    })).append(createButton('Later', function() {
       swal.close();
       console.log('Later'); 
    })).append(createButton('Cancel', function() {
       swal.close();
       console.log('Cancel');
    }));
    
    e.preventDefault();
    swal({
      title: "Are you sure?",
      html: buttons,
      type: "warning",
      showConfirmButton: false,
      showCancelButton: false
    });
  });
});

function createButton(text, cb) {
  return $('<button>' + text + '</button>').on('click', cb);
}
<link href="https://cdn.jsdelivr.net/sweetalert2/4.2.4/sweetalert2.min.css" rel="stylesheet"/>
<script src="https://cdn.jsdelivr.net/sweetalert2/4.2.4/sweetalert2.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button id="close_account">Show</button>

person Joe Onyedinefu    schedule 12.09.2020