2010-04-18 79 views
1

我對jquery和編程一般都很陌生,但我仍然試圖在這裏實現某些功能。jQuery序列和函數調用問題

我使用Fullcalendar來允許我的Web應用程序的用戶在數據庫中插入事件。每天點擊一次,查看對議程日期的更改,然後在一天中的某個時間,並打開一個對話框彈出窗體。我試圖結合驗證(pre-jquery.1.4),jquery.form發佈沒有頁面刷新的表格

幾個頁面中包含的腳本calendar.php定義了fullcalendar對象並將其顯示在div中:
$(document).ready(function() {

function EventLoad() { 
     $("#addEvent").validate({ 
      rules: { 
       calendar_title: "required", 
       calendar_url: { 
        required: false, 
        maxlength: 100, 
        url: true 
       } 
      }, 
      messages: { 
       calendar_title: "Title required", 
       calendar_url: "Invalid URL format" 
      }, 
      success: function() { 
       $('#addEvent').submit(function() { 
        var options = { 
         success: function() { 
          $('#eventDialog').dialog('close'); 
          $('#calendar').fullCalendar('refetchEvents'); 
         } 
        }; 

        // submit the form 
        $(this).ajaxSubmit(options); 
        // return false to prevent normal browser submit and page navigation 
        return false; 
       }); 
      } 
     }); 
    } 

    $('#calendar').fullCalendar({ 
     header: { 
      left: 'prev,next today', 
      center: 'title', 
      right: 'month,agendaWeek,agendaDay' 
     }, 
     theme: true, 
     firstDay: 1, 
     editable: false, 
     events: "json-events.php?list=1&<?php echo $events_list; ?>", 
     <?php if($_GET['page'] == 'home') 
       echo "defaultView: 'agendaWeek',"; 
     ?> 
     eventClick: function(event) { 
      if (event.url) { 
       window.open(event.url); 
       return false; 
      } 
     }, 
     dayClick: function(date, allDay, jsEvent, view) { 
      if (view.name == 'month') { 
       $('#calendar').fullCalendar('changeView', 'agendaDay').fullCalendar('gotoDate', date); 
      }else{ 
       if(allDay) 
       { 
        var timeStamp = $.fullCalendar.formatDate(date, 'dddd+dd+MMMM_u'); 
        var $eventDialog = $('<div/>').load("json-events.php?<?php echo $events_list; ?>&new=1&all_day=1&timestamp=" + timeStamp, null, EventLoad).dialog({autoOpen:false,draggable: false, width: 675, modal:true, position:['center',202], resizable: false, title:'Add an Event'}); 
        $eventDialog.dialog('open').attr('id','eventDialog'); 
       } 
       else 
       { 
        var timeStamp = $.fullCalendar.formatDate(date, 'dddd+dd+MMMM_u'); 
        var $eventDialog = $('<div/>').load("json-events.php?<?php echo $events_list; ?>&new=1&all_day=0&timestamp=" + timeStamp, null, EventLoad).dialog({autoOpen:false,draggable: false, width: 675, modal:true, position:['center',202], resizable: false, title:'Add an Event'}); 
        $eventDialog.dialog('open').attr('id','eventDialog');; 
       } 
      } 
     } 
    }); 
}); 

腳本json-events.php包含表單以及處理來自提交表單的數據的代碼。

當我測試了整個事情會發生什麼:
- 某一天第一用戶點擊,則一天中的時間。彈出窗口隨窗口上顯示的時間和日期打開。當用戶提交表單時,對話框關閉並且日曆刷新其事件....並且用戶添加的事件出現幾次(從4次到最多11次!)。表單已被接收的PHP腳本多次處理?!
- 用戶點擊,彈出窗口打開,用戶提交空表格。表單被提交(驗證功能沒有觸發),用戶重定向到空頁面json-events.php(ajaxForm沒有觸發)

顯然,我的代碼是錯誤的(也很髒,對不起)。爲什麼提交表單提交了幾次接收腳本,爲什麼JavaScript函數EventLoad只觸發一次?

非常感謝您的幫助。這個問題正在殺死我!

回答

0

更新:我相信我到一些東西,這link帶來了新的燈,以我的問題。以下是適用於我的應用程序的代碼。這可能有點骯髒,但到目前爲止,我的測試給了我很好的結果。

<script type='text/javascript'> 
    // Calendar for all pages except for HOME 
    $(document).ready(function() { 
     $('#calendar').fullCalendar({ 
      header: { 
       left: 'prev,next today', 
       center: 'title', 
       right: 'month,agendaWeek,agendaDay' 
      }, 
      theme: true, 
      firstDay: 1, 
      editable: false, 
      events: "json-events.php?list=1&<?php echo $events_list; ?>", 
      <?php if($_GET['page'] == 'home') 
        echo "defaultView: 'agendaWeek',"; 
      ?> 
      eventClick: function(event) { 
       if (event.url) { 
        window.open(event.url); 
        return false; 
       } 
      }, 
      dayClick: function(date, allDay, jsEvent, view) { 
       if (view.name == 'month') { 
        $('#calendar').fullCalendar('changeView', 'agendaDay').fullCalendar('gotoDate', date); 
       }else{ 
        if(allDay) 
        { 
         var timeStamp = $.fullCalendar.formatDate(date, 'dddd+dd+MMMM_u'); 
         var $eventDialog = $('<div/>').load("json-events.php?<?php echo $events_list; ?>&new=1&all_day=1&timestamp=" + timeStamp, null, validForm).dialog({ 
         autoOpen:false, 
         draggable: false, 
         width: 675, 
         modal:true, 
         position:['center',202], 
         resizable: false, 
         title:'Add an Event', 
         buttons: { 
          'Add an Event': function() { 
            var options = { 
             success: function() { 
              $('#eventDialog').dialog().empty().remove(); 
              $("#addEvent").empty().remove(); 
              $('#calendar').fullCalendar('refetchEvents'); 
             } 
            }; 
            // Manually trigger validation 
            if ($("#addEvent").validate().form() == true) { 
             $('#addEvent').ajaxSubmit(options); 
             $('#eventDialog').dialog('close'); 
            } 
          }, 
          Cancel: function() { 
           $("#addEvent").empty().remove(); 
           $(this).dialog().empty().remove(); 
          } 
         } 
         }); 

         //$eventDialog.dialog('open').attr('id','eventDialog'); 
         $eventDialog.dialog('open', { 
          open: function(event, ui) { $validForm; } 
         }).attr('id','eventDialog'); 
        } 
        else 
        { 
         var timeStamp = $.fullCalendar.formatDate(date, 'dddd+dd+MMMM_u'); 
         var $eventDialog = $('<div/>').load("json-events.php?<?php echo $events_list; ?>&new=1&all_day=0&timestamp=" + timeStamp, null, validForm).dialog({ 
         autoOpen:false, 
         draggable: false, 
         width: 675, 
         modal:true, 
         position:['center',202], 
         resizable: false, 
         title:'Add an Event', 
         buttons: { 
          'Add an Event': function() { 
            var options = { 
             success: function() { 
              $('#eventDialog').dialog().empty().remove(); 
              $("#addEvent").empty().remove(); 
              $('#calendar').fullCalendar('refetchEvents'); 
             } 
            }; 
            // Manually trigger validation 
            if ($("#addEvent").validate().form() == true) { 
             $('#addEvent').ajaxSubmit(options); 
             $('#eventDialog').dialog('close'); 
            } 
          }, 
          Cancel: function() { 
           $("#addEvent").empty().remove(); 
           $(this).dialog().empty().remove(); 
          } 
         } 
         }); 

         //$eventDialog.dialog('open').attr('id','eventDialog'); 
         $eventDialog.dialog('open', { 
          open: function(event, ui) { $validForm; } 
         }).attr('id','eventDialog'); 
        } 
       } 
      } 
     }); 

     function validForm(){ 
      $("#addEvent").validate({ 
       rules: { 
        calendar_title: "required", 
        calendar_url: { 
         required: false, 
         maxlength: 100, 
         url: true 
        } 
       }, 
       messages: { 
        calendar_title: "Title required", 
        calendar_url: "Invalid URL format" 
       } 
      }); 
     } 
    }); 
</script> 

再次感謝您花時間幫助我。

1

您只是在驗證成功時應用提交處理程序。您應該使用validation插件的submitHandler選項來執行實際提交。

submitHandler: function() { 
     var options = { 
      success: function() { 
       $('#eventDialog').dialog('close'); 
       $('#calendar').fullCalendar('refetchEvents'); 
      } 
     }; 

     // submit the form 
     $(this).ajaxSubmit(options); 
     // return false to prevent normal browser submit and page navigation 
     return false; 
    } 
+0

謝謝你的回答。 我在代碼中應用了此修改。表單不再提交給接收腳本。 另一個問題是,當第二次打開彈出窗口「驗證」和「ajaxSubmit」不會被觸發時,仍然存在。 P.S.我仍然使用jQuery 1.3.2 – Jonas 2010-04-19 00:18:57

+0

嗯。在創建對話框之前,它可能與被調用的EventLoad函數有關。您是否嘗試過在對話框打開事件處理程序中運行它?該對話框可能會在1.3中刪除原始元素(及其處理程序)。 – tvanfosson 2010-04-19 01:55:11

+0

:(試過在沒有運氣的對話框打開事件處理程序中調用了EventLoad函數,試圖將EventLoad函數放在加載方法中也沒有運氣,我不得不承認,我並不完全理解整個序列是如何在那裏工作 – Jonas 2010-04-20 00:11:10