2014-12-19 33 views
0

我有下面的代碼,它將輸入限制爲只有數字和一定數量的組合鍵。但我也想限制輸入只接受一個小數點。敲除 - 將輸入限制爲只有一位小數的數字

number: { 
      init: function (element) { 
       // Allows only numbers with decimals 
       $(element).on("keydown", function (event) { 
        // Allow: backspace, delete, tab, escape, and enter 
        if (event.keyCode === 46 || event.keyCode === 8 || event.keyCode === 9 || event.keyCode === 27 || event.keyCode === 13 || 
         // Allow: Ctrl+A, Ctrl + C, Ctrl + V, Ctrl + X 
         ((event.keyCode === 65 || event.keyCode === 67 || event.keyCode === 86 || event.keyCode === 88) && (event.ctrlKey === true || event.metaKey === true)) || 
         // Allow: . 
         (event.keyCode === 190 || event.keyCode === 110) || 
         // Allow: home, end, left, right 
         (event.keyCode >= 35 && event.keyCode <= 39)) { 
         // let it happen, don't do anything 
         return; 
        } else { 
         // Ensure that it is a number and stop the keypress 
         if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) { 
          event.preventDefault(); 
         } 
        } 
       }); 
      } 
     } 

我嘗試添加'$(element).val().indexOf('.') !== -1'像下面,但它沒有做任何事情,我仍然可以儘可能多的時間我想鍵入英寸我應該如何限制它?

if (event.shiftKey || ($(element).val().indexOf('.') !== -1 && (event.keyCode === 190 || event.keyCode === 110)) || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) { 
       event.preventDefault(); 
         } 
+2

......然後我一起走而是將「lorem ipsum」粘貼到輸入中。 :-) –

+0

@ T.J.Crowder沒想到那個哈哈.. – user3312508

回答

0
if ((yourString.match(new RegExp(".", "g")) || []).length > 1) { 
    // yourString contains more than one "." 
} 
1

所以,我必須說,我真的沒有看到允許明確的邏輯;相反,您應該明確排除默認情況下允許的一切。你在通過所有標準後購買一臺電腦,你不買10臺電腦,然後扔掉那些不符合標準的電腦。因此,無需觸摸其他功能鍵,就可以使其不必要的複雜化。
如果仔細查看您的極長if條款,您會注意到以下幾點:
(event.keyCode === 190其中您指出// let it happen, don't do anything。所以句點總是會被添加。以下是與您當前的方針陷阱:

  • 與​​事件,所有的鍵碼產生相同上限或不鎖,因爲它們是相同的。因此,您無法區分期間.和分號;
  • 與​​事件,對一個數字鍵盤和鍵盤上相同數目的鍵碼是不同,因爲它們是不同
  • 禁用Shift鍵(與您一樣),強制AZERTY用戶使用大寫鎖定,因爲AZERTY鍵盤在Shift關閉時會生成非數字字符。

因此,你好得多使用keypress事件,它返回字符值。這裏是一個重構和更簡潔的功能,即實現了完全一樣的:

$('#jquery').on("keypress", function (event) { 
    var k = event.keyCode || event.charCode; 
    if (k === 46 && this.value.match(/\./g) || (k < 48 && k !== 46) || k > 57) {        
    event.preventDefault(); 
    } 
}); 

測試在這裏:http://jsfiddle.net/kevinvanlierde/5ay3cory/6/

注:由於Mozilla Firefox瀏覽器吸在製作的keydown和按鍵之間的差異,弄亂並禁用所有的控制鍵。

+0

這不符合我的目的。只有當您輸入句點作爲第一個字符,而不是輸入任何其他字符後,它纔會正常工作。 – user3312508

0

我修好了我自己的代碼,我想我會在這裏分享:

// Allows only numbers with decimals 
$(element).on("keydown", function(event) { 
    // Allow: backspace, delete, tab, escape, and enter 
    if (event.keyCode === 46 || event.keyCode === 8 || event.keyCode === 9 || event.keyCode === 27 || event.keyCode === 13 || 
     // Allow: Ctrl+A 
     (event.keyCode === 65 && (event.ctrlKey === true || event.metaKey === true)) || 
     // Allow: . 
     (event.keyCode === 190 || event.keyCode === 110) || 
     // Allow: home, end, left, right 
     (event.keyCode >= 35 && event.keyCode <= 39)) { 
     // let it happen, but check for excessive periods 
     if ((event.keyCode === 190 || event.keyCode === 110) && $(element).val().indexOf('.') !== -1) { 
      event.preventDefault(); 
     } 
     return; 
    } else { 
     // Ensure that it is a number and stop the keypress 
     if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) { 
      event.preventDefault(); 
     } 
    } 
}); 

我添加了下面的代碼,它允許一定的鍵碼:

if ((event.keyCode === 190 || event.keyCode === 110) && $(element).val().indexOf('.') !== -1) { 
    event.preventDefault(); 
} 
+0

有人可能會說這更好。不過,我已經修復了我的代碼,現在它可以正常工作,並且更好,因爲它不會通過禁用Shift來影響AZERTY鍵盤用戶。 (請參閱http://jsfiddle.net/kevinvanlierde/5ay3cory/6/,在Chrome,Opera,Mozilla FF,IE上測試)。儘管你自己的答案和我的Firefox在Firefox上有一個問題:你的代碼不允許使用句點,而且我也不允許使用控制鍵(因爲Firefox在執行鍵盤標準方面很糟糕)。 – Tyblitz

相關問題