2011-06-29 45 views
1

我一直一個簡單的jQuery對話框的形式對載荷通過AJAX。它使用JQuery Tools進行驗證,如果成功,則通過AJAX提交併關閉。下面是打開通過AJAX的對話框代碼(通過一個可愛的小鏈接):jQuery UI的對話形式AJAX和驗證只有正常工作一次

<script type="text/javascript"> 
var activeDialog; 
$(function(){ 
    $('a.ajax').click(function() { 
     var dialogDiv = '<div style="display:hidden" id="dialogDiv" title="'+this.title+'"></div>'; 
     var dialog = $(dialogDiv).appendTo('body'); 
     // load remote content 
     activeDialog = dialog.load(
      this.href, 
      {}, 
      function (responseText, textStatus, XMLHttpRequest) { 
       dialog.dialog({ 
        resizable: true, 
        title: this.title, 
        autoOpen: true, 
        height: 350, 
        width: 600, 
        modal: true, 
        close: function(event, ui) { 
         try {$("#addNoteForm").data("validator").destroy();}catch(e){} 
         $(this).dialog("destroy"); 
        } 
       }); 
      } 
     ); 
     return false; 
    }); 
}); 
</script> 
<BR><BR> 
<a class="ajax" href="dialog_clientEdit.php?cid=172" title="Add New Note">Create note</a> 

正如你所看到的,在對話框中加載從頁「dialog_clientEdit.php」。與它自己的處理腳本,一旦填寫併成功提交該對話框負載,通過AJAX發送的數據,如果沒有錯誤,會自行關閉和破壞了驗證和對話:

<div id="dialogNote9356904" title="Add New Note"> 
    <form action="process_note.php" method="post" name="addNoteForm" id="addNoteForm" class="form has-validation"> 
    <fieldset style="border:none;"> 
     <div class="clearfix"> 
      <label for="form-note" class="form-label">Note <em>*</em></label> 
      <div class="form-input form-textarea"><textarea id="form-note" rows="5" name="note" required="required" /></textarea></div> 
     </div> 
     <div class="clearfix"> 
      <label for="form-notedate" class="form-label">Date <em>*</em><small>mm/dd/yyyy</small></label> 
      <div class="form-input"><input type="date" id="form-notedate" name="date" data-value="03/05/2004" format="mm/dd/yyyy" required="required" /></div> 
     </div> 
     <div class="clearfix"> 
      <label class="form-label">Visibility <em>*</em><small>Private not visible to client</small></label> 
      <div class="form-input"><label for="form-visibility-private"><input type="radio" name="visibility" id="form-visibility-private" value="private" checked /> Private</label> <label for="form-visibility-public"><input type="radio" name="visibility" id="form-visibility-public" value="public" /> Public</label></div> 
     </div> 
     <div class="form-action clearfix"> 
     <button class="button" id="submitNote" type="button" data-icon-primary="ui-icon-circle-check">Create Note</button> 
      <button class="button" type="button" onClick="activeDialog.dialog("close");">Cancel</button> 
      <span id="addDialogLoader"></span> 
     </div> 
    </fieldset> 
    </form> 
</div> 
<script> 
$('#submitNote').click(function() { 
    var form = $('#addNoteForm'); 
    if(form.data("validator").checkValidity()){ 
     var formData = $(form).serialize(); 
     // Save form via AJAX 
     var ajax_load = "<img src='../images/ajax-loader.gif' alt='Saving...' />"; 
     var loadUrl = "process_note.php?cid=172"; 
     $("#addDialogLoader").html(ajax_load).load(loadUrl, formData, function(response, status, xhr) { 
      if (status != "error") { 
       if(response == "1"){ 
        activeDialog.dialog("close"); 
       } else { alert("There was an error saving this note: "+response); } 
      } else { 
       alert("An error occurred while performing your request: " + xhr.status + " " + xhr.statusText); 
      } 
     }); 
    } 
    return false; 
}); 
</script> 

的問題是這個:表單只提交一次。你可以填寫它,驗證工作正常,並且所有的AJAX都能正確啓動,每個人都很開心。然後,當你第二次嘗試時,驗證器不再工作,點擊創建註釋按鈕基本上什麼也不做......對話框永遠不會提交,並且AJAX永遠不會觸發。

我並確定它關閉後破壞對話和驗證。對話框重新打開,但日期選擇器在第二次打開時不起作用,沒有更多的驗證並且表單無法提交。

遺憾的是我,包括所有的代碼,但我真的不知道哪裏的錯誤是在這裏。我確信它與我關閉它的方式有關(或者重新打開它,或者兩者都有)。誰能幫忙?

+0

沒有東西立刻跳出來。我不認爲你有這個網頁的公開訪問版本,是嗎? – jefflunt

+0

我不知道在這裏添加它,因爲它只能用於測試目的,但在這裏是:http://cp.thewebpro.com/clients/test_dialog.php – Michael

+0

輕微切線,而不是問題,但我發現了一個小功能錯誤,您可能想要修復。當您單擊Create Note鏈接並顯示對話框時,單擊Create Note按鈕顯示錯誤工具提示,然後立即單擊Cancel按鈕,對話框將消失,但錯誤工具提示不會。只是FYI。 –

回答

0

多的測試後,我發現,每次該對話框已創建並關閉,剩餘的表單和它的元素保留在DOM中。隨後對話框的調用會在舊窗體上觸發,這就是爲什麼datepicker,驗證和提交停止工作的原因。

要解決這個問題,我剛剛更換的關閉事件這一行的對話框功能:

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

...這一個:

$(this).dialog("destroy").remove(); 

此新行會破壞對話然後從DOM中刪除保存對話框的div(在上面的代碼中,由變量「dialogDiv」引用)。

解決所有問題!

1

不知道你在做什麼,在你提供的樣品鏈接,但(1)該對話框甚至沒有在Chrome的Mac顯示,(2)它只能勉強維持在Firefox 5適用於Windows,和( 3)它是完全畸形和佈局在IE 9

搞砸當我使用Firebug看什麼網頁做,看到一噸的語法錯誤,以及其他問題。我的猜測是,你有一個小錯字導致級聯效應,或者是腳本中存在更深層次的問題,導致各種奇怪的行爲。

如果我是你,我會看看它在Firebug你自己,試着先消除那些語法錯誤,並從那裏走。

在IE 9,甚至當我嘗試提交新的,公衆注意第一次,我收到以下錯誤彈出:

enter image description here

+0

嗯...不知道你在那裏經歷了什麼。我已經在Windows上測試了IE9,Chrome和Firefox(帶有Firebug)的腳本,並且都沒有錯誤。沒有用於測試的Mac,所以我現在還不確定,但如果我可以重新創建您所看到的錯誤,那麼可能會讓我知道發生了什麼。不幸的是,甚至連Firebug都沒有給我一個錯誤(運行Firefox 5)。 – Michael

+0

我得到與normalocity相同的錯誤。看起來像你有可能只能在你的開發機器上訪問的東西。 – mrtsherman

+0

@mrtsherman @normalocity對不起......我只是注意到我有一個PHP腳本確保對話框正在處理。我登錄了腳本,所以我沒有注意到。我只是從兩者中脫身。你現在應該能夠測試它,而不會看到你看到的錯誤。對不起:/ – Michael