2013-06-28 83 views
0

我想消除「輸入事件」的默認值type=text,這觸發器提交表單。我用下面這樣做:alert()觸發器表單提交

var onEnter = function(values){ 
    $("#"+values['id']).keydown(function(e){ 
     if (e.which == 13) { 
      event.preventDefault(); 
      var function_to_call = window[values['function']]; 
      if(typeof function_to_call === 'function'){ 
       if(values['parameters']!= null){ 
        parameters = values['parameters']; 
        var args; 

        if(typeof parameters === 'string') 
         args = parameters.split(','); 
        else 
         args = new Array(parameters); 

        function_to_call.apply(window, args); 
       } 
       else function_to_call(); 
      } 
      return false; 
     } 
    }); 
} 

,對於帶走默認事件重要的代碼是

event.preventDefault(); 
return false; 

的代碼的其餘部分只是調用帶參數或不帶參數的函數。事情是,在所調用的函數內部,有一個觸發警報的條件。 Here's交易:

  1. 如果警報沒有被觸發[enter]不會觸發表單提交
  2. 如果警報被觸發,表單提交觸發

呼籲功能每type=text是相同的,這裏是警戒條件:

...... 
if(!regex_match(item)){ 
     alert("Solo son posibles los siguientes caracteres: '.' ',' 'a-z' 'a-Z' '0-9' y ' '"); 
     return; 
} 
..... 

var regex_match = function(text){ 
    regex = /^[_., 0-9a-záéíóúñ]+$/i; 
    return regex.test(text); 
} 

事情嘗試:

  • return false;alert(...)後;

我是JavaScript新手,有誰能指出爲什麼會發生這種情況?提前致謝!

+0

你說你自己'返回false'可以阻止表單提交,但是你沒有這個提示。 ('event.preventDefault()'應該足夠了,但是從這個問題來看,它還不清楚它是否被應用。) – JJJ

+0

請從頭開始,並解釋整個事情的目的是什麼。如果您使用表單來填充Ajax內容,請移除提交按鈕並在提交事件中返回false。如果沒有,請告訴我們更多 – mplungjan

+1

您還想將'event.preventDefault()'更改爲'e.preventDefault()' – mplungjan

回答

0

我通過很驚訝(並期望你會發現行爲與瀏覽器到瀏覽器而異),但alert是一個有趣的野獸,在一定程度上與瀏覽器環境的其餘部分的賠率,所以...

因爲你總是要停止默認的行爲,我建議之一:

  1. 不要使用alert,這是相當醜陋反正(使用任何許多「模式」對話框插件的jQuery,或只是做一個自己的風格,絕對定位div),或

  2. 就拿alert了事件處理程序,像這樣的:

    var onEnter = function (values) { 
        $("#" + values['id']).keydown(function (e) { 
         if (e.which == 13) { 
          setTimeout(finishHandling, 0); 
          return false; 
         } 
    
         function finishHandling() { 
          var function_to_call = window[values['function']]; 
          if (typeof function_to_call === 'function') { 
           if (values['parameters'] != null) { 
            parameters = values['parameters']; 
            var args; 
    
            if (typeof parameters === 'string') 
             args = parameters.split(','); 
            else 
             args = new Array(parameters); 
    
            function_to_call.apply(window, args); 
           } else function_to_call(); 
          } 
         } 
        }); 
    } 
    

    什麼第二種選擇的作用是讓事件處理程序完成後,您撥打alert之前,通過調度回調finishHandling幾乎立即發生,但事件處理完成後。 (我也刪除調用event.preventDefault(),因爲return false;從jQuery的事件處理程序都event.preventDefault()event.stopPropagation()。你可能需要它時,alert在那裏,但你不知道沒有它。)

+0

非常明確的解釋。謝謝一堆。我會研究你的第一個不使用alert()的建議。 – Chayemor