Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   onkeydown и GET запрос (https://forum.antichat.xyz/showthread.php?t=161682)

Jekel 07.12.2009 02:58

onkeydown и GET запрос
 
Как сделать чтобы при нажатии на Enter запрос посылался безпрерывно до того момента пока клавишу не отпустят? т.е Нажал и держишь клавишу - отправка запроса происходит безпрерывно...ну раз в пол-секунды можно..Пожалуйста помогите

Вот сейчас так выглядит функция отправки запроса:

Код HTML:

document.onkeydown = function keyIsDown() {
    if (event.keyCode == 13) {
    xmlHttp.open("GET", "controls.php?keyEnter=1", true); 
    xmlHttp.onreadystatechange = readData;
    xmlHttp.send(null);
  }
};


и почему этот код (нажатие клавишы) не работает в FF и IE ???

VDShark 09.12.2009 03:49

Цитата:

Сообщение от Jekel
Как сделать чтобы при нажатии на Enter запрос посылался безпрерывно до того момента пока клавишу не отпустят? т.е Нажал и держишь клавишу - отправка запроса происходит безпрерывно...ну раз в пол-секунды можно..Пожалуйста помогите

Вот сейчас так выглядит функция отправки запроса:

Код HTML:

document.onkeydown = function keyIsDown() {
    if (event.keyCode == 13) {
    xmlHttp.open("GET", "controls.php?keyEnter=1", true); 
    xmlHttp.onreadystatechange = readData;
    xmlHttp.send(null);
  }
};


и почему этот код (нажатие клавишы) не работает в FF и IE ???

Не работает из за нескольких причин.
1) Мелкософт как всегда идут своим путем. Во всех более ли менее адекватных браузерах объект сбытия передается в функцию как аргумент event (где то скрытым, где то первым). В IE же создается поле у корневого элемента DOM (window).
Т.е. что бы решить эту проблему необходимо сделать следующий маневр ушами
Код:

if(!event) event = window.event;
И дальше спокойно работать с event'ом.
2) Код клавиши в некоторых браузерах зранится в свойстве объекта event под именем which (а не keyCode). Решить можно аналогично первому

Итак, из вышесказанного мы можем написать
Код:

        <script type="text/javascript">
                var interval;
               
                document.onkeydown = function(event)
                {
                        if(!event) event = window.event;
                        var key = event.which ? event.which : event.keyCode;
                        if(key == 13)
                        {
                                interval = setInterval("foo()", 500);
                        }
                }
               
                document.onkeyup = function()
                {
                        clearInterval(interval);
                }
               
                function foo()
                {
                        //код твоей функции
                }
        </script>

Но опять таки, единственным адекватноотработавшим браузером является Опера. И ослик, и фуфлофокс отличились природной неадекватностью, и мы видим лавинообразное "нарастание" события. Самое простое решение - поставит флаг, говорящий что кнопка нажата, но еще не отпущена. И в итоге получим следующее:
Код:

        <script type="text/javascript">
                var interval;
                var flag = false;
               
                document.onkeydown = function(event)
                {
                        if(!event) event = window.event;
                        var key = event.which ? event.which : event.keyCode;
                        if(key == 13 & !flag)
                        {
                                flag = true;
                                interval = setInterval("foo()", 500);
                        }
                }
               
                document.onkeyup = function()
                {
                        clearInterval(interval);
                        flag = false;
                }
               
                function foo()
                {
                        //код твоей функции
                }
        </script>



Время: 04:58