2013-08-27 55 views
3

我想問我主要腳本上的jQuery Mobile插件衝突的幫助。我試圖創建另一個版本的網站,這是一個使用jQuery Mobile購買模板的移動版本。該網站仍然位於基於Web版本的CodeIgniter框架中。jQuery Mobile不聽e.PreventDefault

在我的主要腳本中,我在每個表單提交上都有一個preventDefault()函數來顯示驗證錯誤。然後,當我使用購買的移動模板遷移網站時,它似乎不聽preventDefault()。無論何時我提交表單,它都會顯示驗證錯誤,但在我閱讀之前幾秒會更改頁面。它刷新網站。

我的腳本看起來像下面的代碼。這適用於我的網絡版本。 >>>

$('form#frm-signup-updates').submit(function(e){ 

    e.preventDefault(); 

    $.post(base_url+'home/subscribe', $('#frm-signup-updates').serialize(), function(data){ 

     if(data == 'success'){ 
      loadpopup(); 
     } 
     else{ 
      var json = $.parseJSON(data); 
      $("span.error-notif#name").append(json.name); 
      $("span.error-notif#email").append(json.email); 
     } 

    }); 
}); 
+1

'event.preventDefault()'不限於jQuery它的JavaScript語言的一部分。 – Class

+0

@Class,雖然這是真的,[jQuery也有自己的'event.preventDefault()'方法](http://api.jquery.com/event.preventDefault/)。 – Sparky

回答

5

嘗試return false阻止submit

$('form#frm-signup-updates').submit(function(e){ 

    $.post(base_url+'home/subscribe', $('#frm-signup-updates').serialize(), function(data){ 

     if(data == 'success'){ 
      loadpopup(); 
     } 
     else{ 
      var json = $.parseJSON(data); 
      $("span.error-notif#name").append(json.name); 
      $("span.error-notif#email").append(json.email); 
     } 

    }); 
    return false; 
}); 

UPDATE: 嗯,我查jQuery Mobile的源代碼,發現JQM防止形式在默認情況下提交,並與阿賈克斯處理。

 //bind to form submit events, handle with Ajax 
     $.mobile.document.delegate("form", "submit", function(event) { 
      var formData = getAjaxFormData($(this)); 

      if (formData) { 
       $.mobile.changePage(formData.url, formData.options); 
       event.preventDefault(); 
      } 
     }); 

preventDefault因爲submit$.mobile.changePage不是瀏覽器完成的無效。

所以,如果想防止submit,即$.mobile.changePage,我有兩個建議:

1.添加 '數據AJAX =假' 屬性form元素

demo1

2.點擊提交按鈕時點ajax

demo2

+1

[返回false;'和'e.preventDefault();'](http://css-tricks.com/return-false-and-prevent-default/)之間的區別 – Class

+0

@Fly_pig謝謝!我從來沒有想過我做錯了 - 濫用preventDefault()。也許我並沒有真正理解它們的區別,因爲在網站版本中,使用preventDefault()沒有問題,我認爲它沒問題。 – user2567536

+0

@ user2567536我混淆了'e.preventDefault'和'e.stopPropagation',但知道'return false'等於他們兩個。並且,我更新了我的答案。 –