2012-06-21 37 views
2

我無法正確處理輸入類型=「文本」中的某些事件。 我只需要一個過濾器只接受[^ 0-9]字符。如何避免javascript事件在文本字段中的無效輸入?

我需要以下幫助:

  • 不接受任何內容從控制+未來粘貼命令。從Control + V(鍵盤)或右鍵單擊鼠標+粘貼選項。

我試過至今:

  • 按鍵事件我很好地處理來自鍵盤輸入任何內容。 ([^ 0-9]和enter,backspace,home,end等字符都不會被忽略)。

  • 鍵控我處理奇怪控制+粘貼(鍵盤)事件。 我粘貼一些字符串,粘貼字符串後,我裁剪任何非白名單字符。 PS: 這不右擊+粘貼(鼠標)工作,既不

  • 的onChange垃圾串,直到用戶模糊領域保持可見。

我想要什麼:

  • 示例複製字符串 「123.321.456-78」 粘貼 「12332145678」 或 「ABC 2#7!」 並貼上 「27」。

  • 不要接受任何可能的非白名單字符。 (即使有$( '#字段')VAL( 「垃圾輸入123」)

從上面所有的問題,我可以很好地或古怪(又名處理:。keuup)輸入,但右擊+粘貼(鼠標)永遠不會觸發任何事件,這樣我就可以做適當處理

我想過做間隔檢查,但這是太醜陋了

編輯:。

代碼如下

function soNumeroInteiro_keypressHandler(event) 
{ 
    var code = event.keyCode || event.which; 

    switch(code) 
    { 
     case 8: // backspace 
     case 37: // left 
     case 39: // right 
     case 9: // tab 
     case 46: // delete 
     case 35: // end 
     case 36: // home 
      return true; 
     break; 

     case 86: // control + A 
     case 97: // control + V 
     case 120: // control + X 
      if (event.ctrlKey) { 
       return true;     
      } 
     break; 
    } 

    var tecla = String.fromCharCode(code); 

    return tecla.match(/^\d$/) != null; 
} 

function soNumeroInteiro_keyupHandler(event) 
{ 
    event.currentTarget.value = event.currentTarget.value.replace(/[^0-9]/g, ''); 
} 
+2

請顯示你已有的代碼。看看['element.onpaste'](https://developer.mozilla.org/en/DOM/element.onpaste)。 –

+0

@ marcel-korpel完成...似乎onpaste將解決我的問題。我沒有意識到它曾經存在過。我讀了所有的jQuery文檔,並沒有發現任何線索。 – Ismael

回答

1

請參閱這個問題的鼠標點擊事件:(?2秒)How to distinguish between left and right mouse click with jQuery

現在你有鼠標點擊事件,甚至右鍵,就可以輪詢一個短位的內容來檢測變化和處理內容驗證。這樣,您可以根據業務邏輯需要選擇接受有效還是拒絕內容。

編輯: 只要添加一個註釋,onpaste事件將無法正常工作,因爲它會在粘貼內容之前觸發(至少在某些測試案例中)。

例子:

$('#pasteyMe').on('paste', function() { 
    $(this).val();// gets the content prior to the paste event 
}); 

要解決這個問題,你可以用另外的事件觀察,如改變再火令:

$('#pasteyMe').on('click focus blur paste', function() { 
    var me = this; 
    window.setTimeout(function() { 
     $(me).trigger('change'); 
    }, 1); 
}); 

$('#pasteyMe').change(function() { 
    $('#resulty').text($(this).val()); 
}); 

在這裏的行動見本:http://jsfiddle.net/MarkSchultheiss/kQxAj/

+0

我用setTimeOut以類似的方式找到了一個解決方案。感謝洞察力。我確信沒有「非黑客」的方式來做到這一點。 – Ismael

+0

是的,當然,您可以根據需要監控鍵盤按鍵,以確認驗證的內部部分。 –

相關問題