IE не вызывает событие клавиатуры на форме с ОДНЫМ ПОЛЕМ - PullRequest
5 голосов
/ 24 марта 2010

Я вижу код моего друга здесь ...

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> Check action </TITLE>

<script>

    function detectEvent(){
    if(window.event.keyCode==13)
        {
            alert("you hit return!");
        }

    }
</script>


</HEAD>

<BODY>
    <form name="name1" onkeyup="detectEvent()" action="page2.html">
        <p> Field1
            <input type="text" id="text1"/>
        </p>
    </form>
</BODY>
</HTML>

и когда он попытался ввести значение в текстовое поле и нажал клавишу ввода, он не вызвал DetectEvent (). Я сказал, что он всегда будет вызывать на кнопку отправки при вводе ..... и он удивил меня,

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> Check action </TITLE>

<script>

    function detectEvent(){
    if(window.event.keyCode==13)
        {
            alert("you hit return!");
        }

    }
</script>


</HEAD>

<BODY>
    <form name="name1" onkeyup="detectEvent()" action="page2.html">
        <p> Field1
            <input type="text" id="text1"/>
        </p>
        <p> Field1
            <input type="text" id="text2"/>
        </p>
    </form>
</BODY>
</HTML>

Теперь нажмите ввод, функция вызывается ..... Почему так!?

Почему onKeyUp не вызывается в формах только с одним полем. !!! я что-то упустил?

Ответы [ 2 ]

6 голосов
/ 24 марта 2010

Порядок событий:

keydown
keypress
submit
keyup

Таким образом, к тому времени, когда ваш обработчик keyup был бы вызван, форма уже начала отправлять. Если action формы - это page2.html в локальной файловой системе, она будет перемещаться очень быстро и, вероятно, отойдет от страницы до вызова keyup; установите action на внешний сайт, с другой стороны, и keyup успеет выстрелить.

Добавление второго поля ввода - это другая проблема: в этом случае форма вообще не отправляется. Любопытно, что браузеры отправляют форму, в которой есть только один вход и нет кнопки отправки, но отказываются отправлять форму с более чем одним вводом и без кнопки отправки. Это восходит к спецификации HTML 2.0:

Если в форме имеется только одно однострочное поле ввода текста, пользовательский агент должен принять Enter в этом поле в качестве запроса на отправку формы.

В HTML 2.0 не указывалось, следует ли принимать Enter для отправки формы при любых других обстоятельствах (кажется, что целью было только дублирование функциональности древнего элемента <isindex>), но браузерами того времени похоже, что это означает, что ввод-отправка не должна происходить при наличии нескольких полей, но любая кнопка отправки в любом случае вызывает ввод-отправку. IE и другие более поздние браузеры скопировали это странное поведение.

Несвязанный момент: опора на window.event делает код ненужным только для IE. Для всех других браузеров объект события передается в качестве аргумента функции-обработчику события. Вы можете сделать onkeyup="detectEvent(event)" в HTML, а затем использовать этот аргумент в функции detectEvent, которая работает в обеих моделях, потому что используется либо локальный аргумент event, либо глобальный window.event. Но обычный подход состоит в том, чтобы потерять атрибут обработчика событий и назначить из JavaScript:

<form action="page2.html" id="enterform">
    <p> Field1
        <input type="text" id="text1">
        <!-- Note: *no* trailing slash - the doctype says HTML4, not XHTML -->
    </p>
</form>

<script type="text/javascript">
    document.getElementById('enterform').onkeyup= function(event) {
        if (event===undefined) event= window.event; // for IE
        if (event.keyCode===13)
            alert('You pressed Enter');
    };
</script>

Сказав все это ... я обычно с подозрением отлавливаю клавишу Enter. Я не совсем уверен, что вы пытаетесь сделать, но если это обычный случай изменения кнопки по умолчанию в форме, это определенно не способ сделать это и вызовет множество проблем. Нет веской причины, по которой вы должны удерживать клавишу Enter для вызова .submit() в форме.

2 голосов
/ 24 марта 2010

Интересно, что в Google Chrome форма со вторым полем ввода все равно будет отправлена, поэтому она никогда не перехватывает клавишу ввода для события keyup, независимо от того, сколько у вас полей.нажатие клавиши или нажатие клавиши.

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