Передача данных в диалог пользовательского интерфейса jQuery

Я разрабатываю сайт ASP.Net MVC, и на нем я перечисляю некоторые бронирования из запроса к базе данных в таблице с ActionLink, чтобы отменить бронирование в определенной строке с определенным BookingId следующим образом:

Мои бронирования

<table cellspacing = "3">
    <thead>
        <tr style = "font-weight: bold;">
            <td>Date</td>
            <td>Time</td>
            <td>Seats</td>      
            <td></td>              
            <td></td>
        </tr>
    </thead>            
    <tr>
        <td style = "width: 120px;">2008-12-27</td>
        <td style = "width: 120px;">13:00 - 14:00</td>
        <td style = "width: 100px;">2</td>
        <td style = "width: 60px;"><a href = "/Booking.aspx/Cancel/15">cancel</a></td>
        <td style = "width: 80px;"><a href = "/Booking.aspx/Change/15">change</a></td>
    </tr>            
    <tr>
        <td style = "width: 120px;">2008-12-27</td>
        <td style = "width: 120px;">15:00 - 16:00</td>
        <td style = "width: 100px;">3</td>
        <td style = "width: 60px;"><a href = "/Booking.aspx/Cancel/10">cancel</a></td>
        <td style = "width: 80px;"><a href = "/Booking.aspx/Change/10">change</a></td>
    </tr>  
</table>

Было бы неплохо, если бы я мог использовать jQuery Dialog для вывода всплывающего сообщения с вопросом, уверен ли пользователь, что он хочет отменить бронирование. Я пытался заставить это работать, но все время зацикливаюсь на том, как создать функцию jQuery, которая принимает параметры, чтобы я мог заменить

<a href = "/Booking.aspx/Cancel/10">cancel</a>

с участием

<a href = "#" onclick = "ShowDialog(10)">cancel</a>.

Затем функция ShowDialog откроет диалоговое окно, а также передаст в диалоговое окно параметр 10, чтобы, если пользователь нажимает «Да», он отправит href: /Booking.aspx/Change/10.

Я создал диалог jQuery в таком скрипте:

$(function() {
    $("#dialog").dialog({
        autoOpen: false,
        buttons: {
            "Yes": function() {
                alert("a Post to :/Booking.aspx/Cancel/10 would be so nice here instead of the alert");},
            "No": function() {$(this).dialog("close");}
        },
        modal: true,
        overlay: {
            opacity: 0.5,
            background: "black"
        }
    });
});   

и сам диалог:

   <div id = "dialog" title = "Cancel booking">Are you sure you want to cancel your booking?</div>

Итак, наконец, мой вопрос: как я могу этого добиться? или есть лучший способ сделать это?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
83
0
161 961
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Ответ принят как подходящий

Сделать это можно так:

  • отметьте <a> классом, скажите "отменить"
  • настройте диалог, воздействуя на все элементы с помощью class = "cancel":

    $('a.cancel').click(function() { 
      var a = this; 
      $('#myDialog').dialog({
        buttons: {
          "Yes": function() {
             window.location = a.href; 
          }
        }
      }); 
      return false;
    });
    

(плюс другие варианты)

Ключевые моменты здесь:

  • сделайте это как можно ненавязчивее
  • Если вам нужен только URL-адрес, он у вас уже есть в href.

Однако я рекомендую вам сделать это POST вместо GET, поскольку действие отмены имеет побочные эффекты и, следовательно, не соответствует семантике GET ...

Спасибо за хороший ответ. Я попробую, но один вопрос. вы упомянули, что лучше сделать это POST вместо GET, что подразумевает, что обычный href, такой как href = "/ Booking.aspx / Cancel / 10", будет GET, верно? и если да, то что бы он хотел сделать постом?

Frederik 27.12.2008 12:59

Чтобы сделать это постом, вместо изменения window.location вы можете использовать функцию jQuery $ .post () ajax. См. docs.jquery.com/Ajax/jQuery.post#examples

Franck 27.12.2008 15:57

Я бы не стал использовать $ .post (), этот подход плохо ухудшается. Просто напишите стандартный <form> без какого-либо ajax, заставьте его работать без подтверждения, а тогда добавьте подтверждение «поверх» вашего <form>

Mauricio Scheffer 28.12.2008 17:23

Это также известно как подход hijax (domscripting.com/blog/display/41).

Mauricio Scheffer 28.12.2008 17:25

Вы не используете имеют для использования post, но если вы используете get для операции изменения базы данных, вы открываете себя для атаки «подделки межсайтового запроса» ... см .: en.wikipedia.org/wiki/Cross-site_request_forgery

strickli 31.08.2015 19:08

Что касается того, что вы делаете с jQuery, я понимаю, что вы можете связывать функции, как у вас, и внутренние имеют доступ к переменным из внешних. Итак, если ваша функция ShowDialog (x) содержит эти другие функции, вы можете повторно использовать в них переменную x, и она будет принята как ссылка на параметр из внешней функции.

Я согласен с mausch, вам действительно стоит подумать об использовании POST для этих действий, который добавит тег <form> вокруг каждого элемента, но значительно снизит вероятность того, что автоматический скрипт или инструмент запустит событие Cancel. Действие «Изменить» можно оставить как есть, потому что оно (предположительно, просто открывает форму редактирования).

Я попробовал ваши предложения и обнаружил, что это вроде работает,

  1. Диалог div всегда записывается в виде открытого текста.
  2. В версии $ .post он фактически работает в том смысле, что контроллер вызывается и фактически отменяет бронирование, но диалоговое окно остается открытым, а страница не обновляется. С версией get window.location = h.ref отлично работает.

Смотрите мой «новый» сценарий ниже:

$('a.cancel').click(function() {
        var a = this;               
        $("#dialog").dialog({
            autoOpen: false,
            buttons: {
                "Ja": function() {
                    $.post(a.href);                     
                },
                "Nej": function() { $(this).dialog("close"); }
            },
            modal: true,
            overlay: {
                opacity: 0.5,

            background: "black"
        }
    });
    $("#dialog").dialog('open');
    return false;
});

});

Какие-нибудь подсказки?

о, и моя ссылка на действие теперь выглядит так:

<%= Html.ActionLink("Cancel", "Cancel", new { id = v.BookingId }, new  { @class = "cancel" })%>

См. Мои комментарии к моему ответу об использовании $ .post () и подхода hijax.

Mauricio Scheffer 29.12.2008 05:52

Хорошо, первая проблема с тегом div была достаточно простой: Я просто добавил к нему style = "display:none;", а затем, прежде чем показывать диалог, я добавил это в свой скрипт диалога:

$("#dialog").css("display", "inherit");

Но с пост-версией мне все равно не повезло.

См. Мои комментарии к моему ответу об использовании $ .post () и подхода hijax.

Mauricio Scheffer 29.12.2008 05:52

Глядя на свой код, вам нужно добавить функцию закрытия окна и обновления страницы. В вашей функции «Да» вы должны написать:

        buttons: {
            "Ja": function() {
                $.post(a.href);
                $(a). // code to remove the table row
                $("#dialog").dialog("close");
            },
            "Nej": function() { $(this).dialog("close"); }
        },

Код для удаления строки таблицы писать неинтересно, поэтому я позволю вам разобраться с мельчайшими подробностями, но в основном вам нужно указать диалоговому окну, что делать после его публикации. Это может быть умный диалог, но он требует определенного направления.

Спасибо за Ваш ответ. Я попробую и найду способ убрать строку ...

Frederik 28.12.2008 16:43

Я думал об этом, если вы добавите идентификатор к тегу '<TR>', тогда вы сможете заставить jQuery достаточно легко удалить эту строку.

thaBadDawg 29.12.2008 23:57

Просто дайте вам некоторую идею, это может помочь вам, если вы хотите полностью контролировать диалог, вы можете попытаться избежать использования параметров кнопок по умолчанию и добавить кнопки самостоятельно в свой #dialog div. Вы также можете поместить данные в какой-нибудь фиктивный атрибут ссылки, например Click. вызовите attr ("данные"), когда вам это нужно.

После НЕСКОЛЬКИХ ЧАСОВ try / catch я наконец пришел с этим рабочим примером, его работа с AJAX POST с новыми строками добавляется в ТАБЛИЦУ на лету (это была моя настоящая проблема):

Магия пришла со ссылкой на это:

<a href = "#" onclick = "removecompany(this);return false;" id = "remove_13">remove</a>
<a href = "#" onclick = "removecompany(this);return false;" id = "remove_14">remove</a>
<a href = "#" onclick = "removecompany(this);return false;" id = "remove_15">remove</a>

Это последняя работа с AJAX POST и JQuery Dialog:

  <script type= "text/javascript">/*<![CDATA[*/
    var $k = jQuery.noConflict();  //this is for NO-CONFLICT with scriptaculous
     function removecompany(link){
        companyid = link.id.replace('remove_', '');
    $k("#removedialog").dialog({
                bgiframe: true,
                resizable: false,
                height:140,
                autoOpen:false,
                modal: true,
                overlay: {
                    backgroundColor: '#000',
                    opacity: 0.5
                },
                buttons: {
                    'Are you sure ?': function() {
                        $k(this).dialog('close');
                        alert(companyid);
                        $k.ajax({
                              type: "post",
                              url: "../ra/removecompany.php",
                              dataType: "json",
                              data: {
                                    'companyid' : companyid
                                    },
                              success: function(data) {
                                    //alert(data);
                                    if (data.success)
                                    {
                                        //alert('success'); 
                                        $k('#companynew'+companyid).remove();
                                    }
                          }
                        }); // End ajax method
                    },
                    Cancel: function() {
                        $k(this).dialog('close');
                    }
                }
            });
            $k("#removedialog").dialog('open'); 
            //return false;
     }
    /*]]>*/</script>
    <div id = "removedialog" title = "Remove a Company?">
        <p><span class = "ui-icon ui-icon-alert" style = "float:left; margin:0 7px 20px 0;"></span>
        This company will be permanently deleted and cannot be recovered. Are you sure?</p>
    </div>

jQuery предоставляет метод, который хранит данные для вас, без необходимости использовать фиктивный атрибут или искать обходной путь для вашей проблемы.

Привяжите событие клика:

$('a[href*=/Booking.aspx/Change]').bind('click', function(e) {
    e.preventDefault();
    $("#dialog-confirm")
        .data('link', this)  // The important part .data() method
        .dialog('open');
});

И ваш диалог:

$("#dialog-confirm").dialog({
    autoOpen: false,
    resizable: false,
    height:200,
    modal: true,
    buttons: {
        Cancel: function() {
            $(this).dialog('close');
        },
        'Delete': function() {
            $(this).dialog('close');
            var path = $(this).data('link').href; // Get the stored result
            $(location).attr('href', path);
        }
    }
});

Это прекрасное решение. Я не знал, что вы можете установить данные в диалоговом окне, используя .data. Я давно устанавливал глобальные переменные, получая к ним доступ из своих диалогов, а затем уничтожая их!

Kevin Bradshaw 22.02.2011 20:47

Большое спасибо за эту магию .data (). Обратите внимание на следующее обновление: «Начиная с jQuery 1.7, метод .on () является предпочтительным методом для присоединения обработчиков событий к документу» api.jquery.com/bind

daniloquio 13.02.2012 18:21

Параметр .data определенно подходит. Спасибо!

Andreas 02.05.2012 05:50

+1 Я искал документацию по jquery ui и не мог найти ее, пока не понял, что это метод из самого ядра jQuery. Очень хороший улов

Tivie 05.02.2013 11:01

@ boris-guery Привет, попробовал, но не получилось. Это просто не предотвращает действие по умолчанию, поэтому вместо открытия диалогового окна выполняется переход по ссылке. Любая помощь приветствуется: я делаю jsfiddle: jsfiddle.net/sebababi/9zKcZ

Sebastian 17.12.2013 22:52

@Sebastian, похоже, вы обернули значение атрибута цитатой: jsfiddle.net/96TK7/2 Кстати, вы не должны больше использовать .bind, который устарел, а вместо этого .on, проверьте документацию jQuery.

Boris Guéry 18.12.2013 02:31

@ boris-guery, спасибо, Борис, я видел твою скрипку, но у меня она, похоже, не работает. Я даже не получаю всплывающее предупреждение «здесь». Я изменил привязку на включенную. jsfiddle.net/96TK7/3 Я даже пробовал с jQuery 2.0.2. Открывает ли он диалоговое окно и предупреждение на вашем конце? Благодарю.

Sebastian 18.12.2013 16:23

@ Себастьян, ну это странно, я правильно получаю предупреждение, и мне это кажется правильным. Однако я советую вам задать новый вопрос по этой теме, если у вас возникнут трудности с его настройкой.

Boris Guéry 18.12.2013 16:41

@Frodo Метод .data() является частью самого jQuery, а не пользовательского интерфейса jQuery: api.jquery.com/data

Bpainter 10.12.2015 21:22

Решение, вдохновленное Борисом Гери, которое я использовал, выглядит так: Связь:

<a href = "#" class = "remove {id:15} " id = "mylink1" >This is my clickable link</a>

привязать к нему действие:

$('.remove').live({
        click:function(){
            var data = $('#'+this.id).metadata();
            var id = data.id;
            var name = data.name;
            $('#dialog-delete')
                .data('id', id)
                .dialog('open');    
            return false;
        }
    });

А затем для доступа к полю id (в данном случае со значением 15:

$('#dialog-delete').dialog({
    autoOpen: false,
    position:'top',
    width: 345,
    resizable: false,
    draggable: false,
    modal: true,
    buttons: {            
        Cancel: function() {

            $(this).dialog('close');
        },
        'Confirm delete': function() {
            var id = $(this).data('id');
            $.ajax({
                url:"http://example.com/system_admin/admin/delete/"+id,
                type:'POST',
                dataType: "json",
                data:{is_ajax:1},
                success:function(msg){

                }
            })
        }
    }
});

Эта работа для меня:

<a href = "#" onclick = "sposta(100)">SPOSTA</a>

function sposta(id) {
        $("#sposta").data("id",id).dialog({
            autoOpen: true,
            modal: true,
            buttons: { "Sposta": function () { alert($(this).data('id')); } }
        });
    }

При нажатии на «Споста» в диалоговом окне отображается предупреждение 100

надеюсь, это поможет

$("#dialog-yesno").dialog({
    autoOpen: false,
    resizable: false,
    closeOnEscape: false,
    height:180,
    width:350,
    modal: true,
    show: "blind",
    open: function() {
        $(document).unbind('keydown.dialog-overlay');
        },
    buttons: {
        "Delete": function() {
            $(this).dialog("close");
            var dir = $(this).data('link').href;
            var arr=dir.split("-");
            delete(arr[1]);
        },
    "Cancel": function() {
        $(this).dialog("close");
        }
    }
});



<a href = "product-002371" onclick = "$( '#dialog-yesno' ).data('link', this).dialog( 'open' ); return false;">Delete</a>

Привет, @ffernandez, вероятно, лучше попытаться включить некоторое описание того, что вы делаете, а не просто бросать код в OP.

thomasfedb 10.06.2012 11:54

Другие вопросы по теме