e.target.value显示一个键'后面'的值

时间:2012-02-07 13:48:24

标签: javascript javascript-events

id为'typehere'的输入类型。在classhere上设置了一个keydown事件。简单的问题是,e.srcElement.value似乎有一个键后面的值。即如果值应为's',则其安慰'记录为空白''。如果我键入'ss',则显示的值为's'。我似乎无法想出这个。

console.log(e),显示e.srcElement.value的正确值(在控制台中),但console.log(e.srcElement.value)显示错误的值。为什么呢?

<script type="text/javascript">
            var xmlHttp = createXmlHttpRequestObject();
            selectOption = document.getElementById('choose_colony') ;

            document.body.onload = function () {
                typehere = document.getElementById('typehere') ;

                addAnEvent(typehere,"keydown",handleKeyDownevent,false )  ;
            }

            function handleKeyDownevent (e) {
                e = e || window.event ;
                if (xmlHttp) {
                    try {
                        //xmlHttp.open('GET' , 'async.txt', true ) ;
                           console.log(e.srcElement.value ) ;
                       var target=  e.target || e.srcElement ;
                        var typed = target.value      ;
                        if (typed != ""){
                            console.log('sennding request') ;
                            //ajax request
                        }
                        else {
                            console.log(e.srcElement.value + "is blank") ;
                        }
                    }
                    catch(e) {
                        console.log('could not connect to server') ;
                    }
                }

            }
</script>

脚本标记位于标记btw

之前

由于

3 个答案:

答案 0 :(得分:3)

(对于可输入字符,您通常需要keypress而不是keydown作为keypress重复。)

keydown在值更改之前被触发(keypress也是如此),尤其是您可以取消按键,因此如果您想在更改后处理该值,您可能希望使用setTimeout(func, 0)推迟通话。事件链解除后,您的电话将被处理。 (通常在5-10毫秒内。)

Live example

所以在你的代码中,这可能是这样的:

addAnEvent(typehere,"keydown",function(e) { // or "keypress"
    e = e || window.event;
    setTimeout(function() {
        handleKeyDownevent(e);
    }, 0);
},false )  ;

答案 1 :(得分:0)

使用keyup事件代替keydown。

答案 2 :(得分:0)

简单的答案在于,当您尝试确定事件中变量的值时,它由事件处理程序处理,因此最好只记录事件本身。因此,您可以尝试修改代码以适应这种情况,看看是否有帮助。此外,我不同意以上关于需要设置/包含超时(功能)的答案,除非您试图取消任何击键等。澄清:

<script type="text/javascript">
        var xmlHttp = createXmlHttpRequestObject();
        selectOption = document.getElementById('choose_colony') ;

        document.body.onload = function () {
            typehere = document.getElementById('typehere');
            addAnEvent(typehere, "keydown", function(e) { 
                e = e || window.event;
                handleKeyDownevent(e);}, false);
        }
function handleKeyDownevent (e) {
            e = e || window.event ;
            if (xmlHttp) {
                try {
                    //xmlHttp.open('GET' , 'async.txt', true ) ;
                       console.log(e.srcElement.value ) ;
                   var target=  e.target || e.srcElement ;
                    var typed = target.value      ;
                    if (typed != ""){
                        console.log('sennding request') ;
                        //ajax request
                    }
                    else {
                        console.log(e.srcElement.value + "is blank") ;
                    }
                }
                catch(e) {
                    console.log('could not connect to server') ;
                }
            }
          return true;
        }
</script>

我希望能帮到你。底部的return true允许浏览器的默认响应。