e.target.value показывает значения одним ключом «позади» - PullRequest
1 голос
/ 07 февраля 2012

тип ввода с идентификатором 'typehere'.На typhere установлено событие 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 ]

3 голосов
/ 07 февраля 2012

(Для печатаемых символов обычно требуется keypress вместо keydown при повторении keypress.)

keydown запускается до изменения значения (как и keypress), что не менее важно, чтобы вы могли отменить нажатие клавиши, поэтому, если вы хотите обработать значение после его изменения, вы можете отложить вызов, используя setTimeout(func, 0). Ваш звонок будет обработан после того, как цепочка событий раскрутится. (Обычно в течение 5-10 миллисекунд.)

Живой пример

Итак, в вашем коде это может выглядеть так:

addAnEvent(typehere,"keydown",function(e) { // or "keypress"
    e = e || window.event;
    setTimeout(function() {
        handleKeyDownevent(e);
    }, 0);
},false )  ;
0 голосов
/ 06 декабря 2017

Простой ответ заключается в том, что когда вы пытаетесь определить значение переменной, находящейся в событии, она обрабатывается обработчиком события, и поэтому лучше всего зарегистрировать само событие.Таким образом, вы можете попробовать изменить свой код, чтобы приспособиться к этому, чтобы посмотреть, поможет ли это.Кроме того, я не согласен с приведенным выше ответом о необходимости установить / включить тайм-аут (функцию), если только вы не пытаетесь отменить какие-либо нажатия клавиш и т. Д. Чтобы уточнить:

<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 внизу разрешает ответ браузера по умолчанию.

0 голосов
/ 09 октября 2013

использовать событие keyup вместо keydown.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...