jQuery UI 대화 상자에 데이터 전달


83

나는 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="https://stackoverflow.com/Booking.aspx/Cancel/10">cancel</a>

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

ShowDialog함수는 대화 상자를 열고 사용자가 클릭 예 다음은 HREF를 게시 할 예정입니다 경우 있도록 또한 대화에 있었던 파라미터 (10)를 통과 할 것입니다 :/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>

그래서 마지막으로 내 질문에 : 어떻게 이것을 달성 할 수 있습니까? 아니면 더 나은 방법이 있습니까?

답변:


45

다음과 같이 할 수 있습니다.

  • <a>수업으로 표시하고 "취소"라고 말하세요.
  • class = "cancel"로 모든 요소에 대해 작업하여 대화 상자를 설정하십시오.

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

(다른 옵션 포함)

여기서 핵심 사항은 다음과 같습니다.

  • 가능한 한 눈에 띄지 않게 만드십시오.
  • URL 만 있으면 이미 href에 있습니다.

그러나 취소 작업에는 부작용이있어 GET 의미 체계를 준수하지 않기 때문에 GET 대신 POST로 만드는 것이 좋습니다 .


좋은 답변을 주셔서 감사합니다. 그래도 한 가지 질문을 해보겠습니다. href = "/ Booking.aspx / Cancel / 10"과 같은 일반 href가 GET이 될 것이라는 것을 의미하는 GET 대신 POST로 만드는 것이 더 낫다고 언급 하셨죠? 그렇다면 게시물을 작성하고 싶습니까?
Frederik

post로 만들기 위해 window.location을 변경하는 대신 jQuery $ .post () ajax 함수를 사용할 수 있습니다. docs.jquery.com/Ajax/jQuery.post#examples
Franck

1
나는 $ .post ()를 사용하지 않을 것이며, 그 접근 방식은 잘 저하되지 않습니다. ajax없이 표준 <form>을 작성하고 확인없이 작동하도록 한 다음 <form>의 "위에"확인 추가하십시오
Mauricio Scheffer

이것은 hijax 접근 방식으로도 알려져 있습니다 ( domscripting.com/blog/display/41 )
Mauricio Scheffer

당신은하지 않습니다 게시물을 사용할 수 있지만, 데이터베이스 바꾸는 작업에 대한 GET을 사용하는 경우, 당신은 "크로스 사이트 요청 위조"공격에 자신을 열어 ... 참조 : en.wikipedia.org/wiki/Cross- site_request_forgery
strickli 2015-08-31

273

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);
        }
    }
});

15
이것은 훌륭한 솔루션입니다. .data를 사용하여 대화 상자에 데이터를 설정할 수 있다는 사실을 몰랐습니다. 저는 오랫동안 전역 변수를 설정하고 대화 상자에서 액세스 한 다음 파괴했습니다!
Kevin Bradshaw

이 .data () 마술에 감사드립니다. 그러나 다음 업데이트에 주목하십시오. "jQuery 1.7에서 .on () 메소드는 이벤트 핸들러를 문서에 첨부하는 데 선호되는 메소드입니다." api.jquery.com/bind
daniloquio

2
.data 매개 변수는 확실히 갈 길입니다. 감사!
Andreas

1
+1 jquery ui 문서를 검색했지만 이것이 jQuery 코어 자체의 방법임을 깨달을 때까지 찾을 수 없었습니다. 아주 좋은 캐치
Tivie 2013-02-05

@ boris-guery 안녕하세요, 시도했지만 작동하지 못했습니다. 기본 동작을 막지 않으므로 대화 상자를 여는 대신 링크로 이동합니다. 어떤 도움을 주시면 감사하겠습니다 : 나는 jsfiddle합니다 jsfiddle.net/sebababi/9zKcZ
세바스찬

2

jQuery로 수행하는 작업의 관점에서, 내 이해는 당신이 가지고있는 것처럼 함수를 연결할 수 있고 내부 함수는 외부 변수의 변수에 액세스 할 수 있다는 것입니다. 따라서 ShowDialog (x) 함수에는 이러한 다른 함수가 포함되어 있으므로 x 변수를 다시 사용할 수 있으며 외부 함수의 매개 변수에 대한 참조로 간주됩니다.

mausch의 의견에 동의합니다. 이러한 작업에 POST를 사용하여 <form>각 요소 주위 에 태그 를 추가 하지만 취소 이벤트를 트리거하는 자동화 된 스크립트 또는 도구의 가능성을 크게 줄여야합니다. 변경 작업은 그대로 유지 될 수 있습니다 (아마도 편집 양식을 열기 만 함).


1

나는 이제 당신의 제안을 시도했고 그것이 다소 효과가 있음을 발견했습니다.

  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 방법 사용에 대한 내 대답에 내 의견을 참조하십시오
마우 페르을

1

코드를 보면 창을 닫고 페이지를 업데이트하는 기능을 추가해야합니다. "예"함수에서 다음과 같이 작성해야합니다.

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

테이블 행을 제거하는 코드는 작성하는 것이 재미 있지 않으므로 핵심 세부 사항을 처리 할 수 ​​있지만 기본적으로 게시 한 후 대화 상자에 무엇을해야하는지 알려야합니다. 스마트 한 대화 일 수 있지만 방향이 필요합니다.


귀하의 답변에 감사드립니다. 나는 그것을 시도하고 또한 행을 제거하는 방법을 찾을 것입니다 ...
Frederik

'<TR>'태그에 ID를 추가하면 jQuery를 통해 해당 행을 쉽게 제거 할 수 있습니다.
thaBadDawg

1

몇 시간의 try / catch 후 마침내이 작업 예제와 함께 왔으며 새 행이있는 AJAX POST 작업이 TABLE에 즉시 추가됩니다 (실제 문제였습니다).

그쪽으로 마술이 링크와 함께 제공되었습니다.

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

1

이것은 나를 위해 일합니다.

<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')); } }
        });
    }

대화 상자 경고 표시에서 "Sposta"를 클릭하면 100


0

좋아 div 태그의 첫 번째 문제는 충분히 쉬웠습니다. 방금 a style="display:none;"를 추가 한 다음 대화 상자를 표시하기 전에 대화 스크립트에 다음을 추가했습니다.

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

그러나 포스트 버전의 경우 여전히 운이 좋지 않습니다.


$ .post ()와 hijax 방법 사용에 대한 내 대답에 내 의견을 참조하십시오
마우 페르을

0

대화를 완전히 제어하려면 기본 버튼 옵션 사용을 피하고 #dialog div에 직접 버튼을 추가 할 수 있습니다. Click과 같은 링크의 더미 속성에 데이터를 넣을 수도 있습니다. 필요할 때 attr ( "data")를 호출하십시오.


0

내가 사용한 Boris Guery에서 영감을 얻은 솔루션은 다음과 같습니다. 링크 :

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

                }
            })
        }
    }
});

0

이게 도움이 되길 바란다

$("#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>

1
안녕하세요 @ffernandez, 당신이하는 일에 대한 설명을 포함하는 것이 최선일 것입니다. 대신 OP에서 코드를 던지는 것보다.
thomasfedb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.