功能适用于'按键'事件,但没有相同的'按键'我发起的事件

时间:2015-12-23 21:21:54

标签: javascript jquery

这是我的代码:

$( '#Example' ).on( "keypress", function( keyEvent ) {

    if ( keyEvent.which != 44 ) {

        myFunction( keyEvent, $(this) );

    } else {

        event.preventDefault();
        var myEvent = jQuery.Event( "keypress" );
        myEvent.which = 46;
        $(this).trigger( myEvent );

    }
});


function myFunction( event, element ) {
    //do stuff
    console.log( "Finished." );
}

如果按下"。" (which = 46),myFunction完美地完成任务,事件"。"被输入了。但如果是媒体"," (which = 44),myFunction也可以做事,但事件"。"手动射击不是输入!在这两种情况下,"完成"由控制台打印。

我需要按照以前的方式做,因为如果我这样做:

$( '#Example' ).on( "keypress", function( keyEvent ) {

    myFunction( keyEvent, $(this) );

});


function myFunction( event, element ) {

    if (event.which == 44) {

        event.which = 46;

    }

    //do stuff
    event.preventDefault();
    $( '#Example' ).val('.'); //is a example

}

as'。'不是由事件创建的,而是由我手动创建,.on( 'input', anotherFunction() )事件未被触发。

最后,myFunction如下:

function myFunction(event, element) {

    var text = element.val();

    if (((event.which != 46 || element.val().indexOf('.') != -1) &&
    ((event.which < 48 || event.which > 57) &&
    (event.which != 0 && event.which != 8))) || 
    ((event.which == 46) && (element.val().indexOf('.') == -1) && 
    ((text.length - element[0].selectionStart) > 2))) {

        event.preventDefault();

    }

    if ((text.indexOf('.') != -1) &&
    (text.substring(text.indexOf('.')).length > 2) &&
    (event.which != 0 && event.which != 8) &&
    (element[0].selectionStart >= text.length - 2)) {

        event.preventDefault();

    }
}

有什么建议吗?

提前致谢!

2 个答案:

答案 0 :(得分:0)

您的第一个功能问题是event.preventDefault();应该是keyEvent.preventDefault();,因为事件未定义:

$( '#Example' ).on( "keypress", function( keyEvent ) {

    if ( keyEvent.which != 44 ) {

        myFunction( keyEvent, $(this) );

    } else {

        keyEvent.preventDefault();
        var myEvent = jQuery.Event( "keypress" );
        myEvent.which = 46;
        $(this).trigger( myEvent );

    }
});

答案 1 :(得分:0)

我认为您不需要再次触发事件,而是将更改后的值传递给函数。像这样:

$( '#Example' ).on( "keypress", function( event ) {
    var key = event.which;
    myFunction( key !== 44 ? 46 : key, $(this), event );
});

function myFunction(key, element, event) {

    var text = element.val();

    if (((key !== 46 || text.indexOf('.') !== -1) &&
      ((key < 48 || key > 57) &&
      (key !== 0 && key !== 8))) || 
      ((key === 46) && (text.indexOf('.') === -1) && 
      ((text.length - element[0].selectionStart) > 2))) {
        event.preventDefault();
    }

    if ((text.indexOf('.') != -1) &&
      (text.substring(text.indexOf('.')).length > 2) &&
      (key !== 0 && key !== 8) &&
      (element[0].selectionStart >= text.length - 2)) {
        event.preventDefault();
    }
}