2012-04-17 75 views
1

我有一個文本框(價格),我必須驗證它只是數字數據。此外,我不能允許零前數字(如01)。所以我使用正則表達式替換方法。對於更換信這是使用:jQuery的替換功能在IE中奇怪地工作

$("#txtPrice").keyup(function(){ 
    var text=$(this).val(); 
    $(this).val(text.replace(/[^\d\s\.]/,"")); 
}); 

更換前面的零,我用

$("#txtPrice").keyup(function(){ 
    var text=$(this).val(); 
    $(this).val(text.replace(/^0+/, '')); 
}); 

它適用於Firefox的罰款,但在IE它奇怪的行爲。

如果我在數字前添加一個新數字,它會將新數字添加到數字的末尾。例如,如果我將「56」編輯爲「156」,那麼數字1將添加在形成「561」的末尾。如果任何數字試圖放在前面,它實際上被添加到文本字段的末尾。如何解決這個問題?

+0

這很可能是另一行的問題,而不是正則表達式替換。當你發出「警報(文本)」時會發生什麼;「在這兩條線之間? – pms1969 2012-04-17 13:30:12

+0

我相信,只有一個綁定到給定實例的綁定函數纔是理想的選擇。雖然可能不是獲得所需行爲的解決方案,但它會弄清楚發生了什麼變得更容易。 – veeTrain 2012-04-17 13:40:43

+0

嗨iijb;如果我的回答對你來說是一個可行的解決方案,那麼一定要接受它作爲答案,或者讓我們知道爲什麼它不適合你的情況。謝謝 – veeTrain 2012-04-17 16:20:21

回答

0

我相信你所經歷的並不是你在輸入的開始處放置1,IE在最後敲擊它,但是IE實際上並不允許你的光標移動到前端輸入。它捕獲箭頭/ home鍵操作並觸發鍵控,執行兩個正則表達式,並替換文本。

你可能需要做的就是評估被檢測到的關鍵是什麼,如果它匹配一個實際的字符,那麼只需要用它做點什麼就麻煩了。

幹什麼like this解決您的情況?

$("#txtPrice").keyup(function(event) { 
    // avoid triggering on control characters; FF ignores but IE will execute and possibly confuse 
    if (event.which > 40) { 
     var text = $(this).val(); 
     $(this).val(text.replace(/^0+/, '')); 
     $(this).val(text.replace(/[^\d\s\.]/,"")); 
    } 
}); 

你可能將不得不作出一些例外event.which > 40,我不完全知道你將如何讓用戶的光標停留在那裏他們只是按下一個鍵,但我覺得這可能是一個足夠的解決方案爲你。

編輯:我將正則表達式組合成一個;看到更新jsfiddle

$(this).val(text.replace(/(^0+|[^\d\s\.])/, "")); 

編輯:如果您想擁有儘可能少的光標「跳來跳去」,那麼你可以有選擇地替換非法文本時,你已經驗證了該文本相匹配。 Here is a demonstration

if ($(this).val().match(/(^0+|[^\d\s\.])/)) { 
    $(this).val(text.replace(/(^0+|[^\d\s\.])/, "")); 
} 

你也可以將正則表達式外推到變量中,就像我在小提琴中所做的那樣。

+0

嗨,它解決了我的問題。但現在插入後,光標在後面。 – iijb 2012-04-18 04:48:15

+0

很棒@iijb;你應該接受這個答案作爲你原來的問題的答案,然後在你研究了不同的選項後打開一個新的問題單。 [這裏是一個jsfiddle](http://jsfiddle.net/tU7vh/5/),如果遊標做了一些非法的操作,遊標只會移動。 – veeTrain 2012-04-18 11:41:22