如何使文档准备好多次执行

时间:2021-09-19 01:38:40

I am loading a jsp using jquery. I have multiple buttons. On clicking, i am making a jquery call which loads a jsp in dialog box. I want the document ready function to be executed every time the jsp inside the jquery dialog box loads. Step by step explanation :

我正在使用jquery加载一个jsp。我有多个按钮。点击后,我正在进行一个jquery调用,在对话框中加载一个jsp。我希望每次加载jquery对话框中的jsp时都执行document ready函数。分步说明:

This is the jquery function which loads ratingDialog.jsp in the dialog box each time rate is clicked.

这是jquery函数,它在每次单击速率时在对话框中加载ratingDialog.jsp。

function openRatingDialog() {
 var rateDialog = $('<div id="ratingloaderDiv"></div>')
 .load("ratingDialog.jsp").dialog({
     autoOpen: true,
     minHeight:275,
        width: 400,
        height: 350,  
     open: function( event, ui ) {
         $("#showDialogMessage").hide();
         $('#reviewArea').val('');
         $('#source').attr('checked', false);
         $('#destination').attr('checked', false);
         function openRatingDialog() {
 var rateDialog = $('<div id="ratingloaderDiv"></div>')
 .load("ratingDialog.jsp").dialog({
     autoOpen: true,
     minHeight:275,
        width: 400,
        height: 350,  
     open: function( event, ui ) {
         $(".rateCls").rating();
         $("#showDialogMessage").hide();
         $('#reviewArea').val('');
         $('#source').attr('checked', false);
         $('#destination').attr('checked', false);
         $("#submit").click(function(e) {
             $("#showDialogMessage").hide();
             var index = sessionStorage.getItem("history_index");
             alert(index);
             alert('submit clicked');
             alert(this.id);
             var rating = jQuery('#starVin .star:checked').val();
             var review = $("#reviewArea").val();
             var ratingDetails;
             if($('#source').is(":checked")&&   $('#destination').is(":checked")) {
                 ratingDetails = "overallRating";
             }
             else if ($('#source').is(":checked"))  
             {
               ratingDetails = $("#source").val();
             }
             else if ($('#destination').is(":checked"))
             {
               ratingDetails = $("#destination").val();
             }
             else
             {
                 ratingDetails = "vendorRating";
             }
              var xmlhttp;
                 $("#submit").prop('disabled',true);
                    var url="rate?index="+index+"&rating="+rating+"&review="+review+"&ratingDetails="+ratingDetails;
                    if (window.XMLHttpRequest)
                    {
                        xmlhttp=new XMLHttpRequest();
                    }
                    else
                    {
                        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                    }
                    xmlhttp.onreadystatechange=function()
                    {

                        if (xmlhttp.readyState==4 && xmlhttp.status==200)
                        {
                            document.getElementById("showDialogMessage").innerHTML=xmlhttp.responseText;
                            $("#showDialogMessage").show();
                            $("#submit").removeAttr('disabled');
                            if ($("#showDialogMessage:contains('Thanks')").length > 0) {
                                $("#"+index).hide();
                                $("#msg"+index).show();  
                            }
                        }
                    }

                    xmlhttp.open("POST", url, true);
                    xmlhttp.send();
            }); 

          }
      });
     } 
           }
       });
    }
    $(document).ready(function() {
     var index ;
    $(".rate").on("click", function() {
     // Display the dialog
     openRatingDialog(); 
     index = this.id;
     });

This is ratingDialog.jsp

这是ratingDialog.jsp

<link rel="stylesheet" href="dist/jquery.rating.css">
<div id="rateDialog" class="rateDialog" style="height:250px;width:500px;" title="Rating">
        <div id="showDialogMessage"></div>
        <p style="font-size:15px;color:black;margin:5px 0px 0px 10px;"><label>Rate your overall satisfaction:</label></p>
        <div id="starVin" style="display:block;">
         <input id="rateStar" type="radio" name="rating" value="1" class="rateCls star"/>
        <input id="rateStar" type="radio" name="rating" value="2" class="rateCls star" />
        <input id="rateStar" type="radio" name="rating" value="3" class="rateCls star"/>
        <input id="rateStar" type="radio" name="rating" value="4" class="rateCls star"/>
        <input id="rateStar" type="radio" name="rating" value="5" class="rateCls star"/>
        </div>
        <br/>
        <p style="font-size:15px;color:black;margin:5px 0px 0px 10px;"><label>Please provide your review: </label></p>
        <textarea id="reviewArea" name="reviewArea" rows="5"></textarea>
       <p style="font-size:15px;color:black;margin:5px 0px 0px 10px;"><label><input type="checkbox" id="source" value="source" name="source"> Rating specific to source pincode</label></p>
        <p style="font-size:15px;color:black;margin:5px 0px 0px 10px;"><label><input type="checkbox" id="destination" value="destination" name="destination"> Rating specific to destination pincode</label></p>
        <input id="submit" type="submit" value="Submit" style="margin : 18px 0px 0px 93px;"/>
</div>
<script src = "js/jquery.rating.js"></script>
</script>

Each time ratingDialog loads i want its document.ready function to be executed. In my case, it is executing only once(for the first time it loads inside the dialog)

每次ratingDialog加载我都希望它的document.ready函数被执行。在我的情况下,它只执行一次(第一次在对话框内加载)

2 个解决方案

#1


2  

How about moving your document ready code to your dialog callback?

如何将文档就绪代码移动到对话框回调?

var rateDialog;
$('<div id="ratingloaderDiv"></div>')
    .load("ratingDialog.jsp", function() {
        rateDialog = $(this).dialog({
            autoOpen: true,
            minHeight:275,
            width: 400,
            height: 350,  
            open: function( event, ui ) {
                $("#showDialogMessage").hide();
                $('#reviewArea').val('');
                $('#source').attr('checked', false);
                $('#destination').attr('checked', false);

                // Document ready
                $(".rateStar").show();
                $(".rateCls").rating();
                alert('hi'); 
            }
        });
    });

Moving the dialog call to your load callback also ensures it doesn't run until your file is retrieved.

将对话框调用移动到加载回调还可确保在检索文件之前它不会运行。

#2


2  

You could simply use an iFrame in your dialog like the below.

您可以在对话框中使用iFrame,如下所示。

Also, you will want to keep a reference to your dialog and destroy it when it is closed, otherwise you will be adding it to your page over and over again

此外,您需要保留对对话的引用并在关闭时将其销毁,否则您将一遍又一遍地将其添加到您的页面中

$(document).ready(function () {
    var rateDialog;
    function openRatingDialog() {
        rateDialog = $('<div id="ratingloaderDiv"><iframe id="ratingIframe" src="ratingDialog.html" width="200" height="200" frameborder="0" onload="parent.ratingsLoaded();"></iframe></div>')
            .dialog({
            autoOpen: true,
            minHeight: 275,
            width: 400,
            height: 350,
            open: function (event, ui) {
            },
            close: function (event, ui) {
                rateDialog.dialog('destroy').remove();
            }
        });
    }
    $(".rate").on("click", function () {
        // Display the dialog
        openRatingDialog();
    });
});
var curIndex=0;
function ratingsLoaded(){
            var name = 'rating'+curIndex
            var iframe = $('#ratingIframe').contents();
            iframe.find("#showDialogMessage").hide();
            iframe.find('#reviewArea').val('');
            iframe.find('#source').attr('checked', false);
            iframe.find('#destination').attr('checked', false);
            iframe.find('.rateCls').attr('name', name);
            curIndex++;

}

Here is a working example

#1


2  

How about moving your document ready code to your dialog callback?

如何将文档就绪代码移动到对话框回调?

var rateDialog;
$('<div id="ratingloaderDiv"></div>')
    .load("ratingDialog.jsp", function() {
        rateDialog = $(this).dialog({
            autoOpen: true,
            minHeight:275,
            width: 400,
            height: 350,  
            open: function( event, ui ) {
                $("#showDialogMessage").hide();
                $('#reviewArea').val('');
                $('#source').attr('checked', false);
                $('#destination').attr('checked', false);

                // Document ready
                $(".rateStar").show();
                $(".rateCls").rating();
                alert('hi'); 
            }
        });
    });

Moving the dialog call to your load callback also ensures it doesn't run until your file is retrieved.

将对话框调用移动到加载回调还可确保在检索文件之前它不会运行。

#2


2  

You could simply use an iFrame in your dialog like the below.

您可以在对话框中使用iFrame,如下所示。

Also, you will want to keep a reference to your dialog and destroy it when it is closed, otherwise you will be adding it to your page over and over again

此外,您需要保留对对话的引用并在关闭时将其销毁,否则您将一遍又一遍地将其添加到您的页面中

$(document).ready(function () {
    var rateDialog;
    function openRatingDialog() {
        rateDialog = $('<div id="ratingloaderDiv"><iframe id="ratingIframe" src="ratingDialog.html" width="200" height="200" frameborder="0" onload="parent.ratingsLoaded();"></iframe></div>')
            .dialog({
            autoOpen: true,
            minHeight: 275,
            width: 400,
            height: 350,
            open: function (event, ui) {
            },
            close: function (event, ui) {
                rateDialog.dialog('destroy').remove();
            }
        });
    }
    $(".rate").on("click", function () {
        // Display the dialog
        openRatingDialog();
    });
});
var curIndex=0;
function ratingsLoaded(){
            var name = 'rating'+curIndex
            var iframe = $('#ratingIframe').contents();
            iframe.find("#showDialogMessage").hide();
            iframe.find('#reviewArea').val('');
            iframe.find('#source').attr('checked', false);
            iframe.find('#destination').attr('checked', false);
            iframe.find('.rateCls').attr('name', name);
            curIndex++;

}

Here is a working example