Chrome浏览器中的奇怪.replace()行为

时间:2015-04-29 08:46:25

标签: javascript jquery replace

<div>
    <input type="text" class="allownumericwithdecimal"/>saadad
</div>
$(".allownumericwithdecimal").live("keypress keyup ", function (event) {
    $(this).val($(this).val().replace(/[^0-9\.]/g, ''));
    var text = $(this).val();
    if (!((event.which >= 48 && event.which <= 57) || event.which == 8 || event.which == 46 || event.which == 110 || event.which == 0)) {
        var text = $(this).val();
        if ((text.indexOf('.') != -1) && (text.substring(text.indexOf('.'), text.indexOf('.').length).length > 2)) {
            //event.preventDefault();
        }
    }
    var text = $(this).val();
    if ((event.which >= 48 && event.which <= 57) && (text.indexOf('.') != -1)) {
        if ((text.substring(text.indexOf('.'), text.indexOf('.').length).length) > 2) {
            //event.preventDefault();
        }
        if (event.which == 190) {
            //event.preventDefault();
        }
    }
    if (text.indexOf('.') != -1 && event.which == 190) {
        if (text.match("^[0-9]+(\.[0-9]{0,2})?$")) {} else {
            $(this).val('');
        }
    }
    if (text.indexOf('.') == -1 && text.length > 7 && (event.which != 190 && event.which != 8 && event.which != 46 && event.which != 110 && event.which != 0)) {
        event.preventDefault();
    }
});

http://jsfiddle.net/Lx9h2smh/

问题是如果我在textBox中输入一个值3434,现在我想通过将光标放在3之后并按下5来使其成为35434,它在Firefox和IE中工作正常但在chrome中,5在值之后添加了它变成了34345。

罪魁祸首是替换非数字字符的行。

如何处理这个问题??

4 个答案:

答案 0 :(得分:2)

试试这个code,它会运行。 jsFiddle

我只是做一个测试

if ( /[^0-9\.]/g.test($(this).val()) ) {
    $(this).val($(this).val().replace(/[^0-9\.]/g,'')); 
}

<强>解释

您只需确保用户输入您想要的值。如果输入的值不是integer,则替换。你的正则表达式意味着:“那些不是整数或点(。),用空值替换它们”。这就是为什么你需要做这个测试。因此,如果用户输入您想要的值,它不会执行操作替换,也不会传递给测试。

答案 1 :(得分:1)

$(".allownumericwithdecimal").live("keypress keyup ",function (event) {

    var caretP= $(this).getCursorPosition();
    $(this).val($(this).val().replace(/[^0-9\.]/g,'')); 
	var text = $(this).val();        
   
	if (!((event.which >= 48 && event.which <= 57) || event.which ==8 || event.which ==46 || event.which ==110 || event.which ==0) )
	{
		var text = $(this).val();
		if ((text.indexOf('.') != -1) && (text.substring(text.indexOf('.'), text.indexOf('.').length).length > 2)) {
			//event.preventDefault();
		}       
	} 
	var text = $(this).val(); 
	if((event.which >= 48 && event.which <= 57) &&  (text.indexOf('.') != -1))
	{	
		if((text.substring(text.indexOf('.'), text.indexOf('.').length).length)>2)
		{
			//event.preventDefault();
		}
		if(event.which==190)
		{
			//event.preventDefault();
		}
	}
	if(text.indexOf('.') != -1 && event.which==190 )
	{	
		if(text.match("^[0-9]+(\.[0-9]{0,2})?$")){
		}
		else{
			$(this).val('') ;
		}
	}
	 if(text.indexOf('.') == -1 && text.length>7 && (event.which!=190 && event.which !=8 && event.which !=46 && event.which !=110 && event.which !=0)){
		 event.preventDefault();
	 }
    
    $(this).selectRange(caretP,caretP);
    
});




(function($) {
    
    $.fn.selectRange = function(start, end) {
    return this.each(function() {
        if (this.setSelectionRange) {
            this.focus();
            this.setSelectionRange(start, end);
        } else if (this.createTextRange) {
            var range = this.createTextRange();
            range.collapse(true);
            range.moveEnd('character', end);
            range.moveStart('character', start);
            range.select();
        }
    });
};
    
    $.fn.getCursorPosition = function() {
        var input = this.get(0);
        if (!input) return; // No (input) element found
        if (document.selection) {
            // IE
           input.focus();
        }
        return 'selectionStart' in input ? input.selectionStart:'' || Math.abs(document.selection.createRange().moveStart('character', -input.value.length));
     }
   })(jQuery);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
<div>
    <input type="text" class="allownumericwithdecimal"/>saadad
</div>

答案 2 :(得分:0)

kepress似乎是罪魁祸首,当我改变小提琴只是使用keyup替换正确发生时(尽管光标移到了最后)

http://jsfiddle.net/Lx9h2smh/1/

答案 3 :(得分:-1)

只需删除'keypress'事件,keypress事件与keydown事件非常相似。如果按下按键,按键事件无法识别字符。在您的代码中,它将当前输入变为空,因此它将替换该字符。