2009-04-25 4 views
16

У меня есть динамическая веб-страница с JS. Есть textarea и a кнопка, но нет Форма теги. Как сделать Отправить кнопку огня и текстового поля списываться при Enter нажат в текстового поля?Отправка данных из textarea путем нажатия «Enter»

+0

Прошу прощения за ввод в заблуждение. Я прочитал textarea, но думаю, что тип ввода = «текст» ...... Удален мой дрянной ответ :) –

+0

Люди спрашивают, почему бы не использовать ввод [текст] вместо textarea. Для меня причина в том, что я хочу разрешить пользователю вводить только одну строку текста, но я хочу, чтобы текст был перенесен на несколько строк. Вход [текст] не переносит –

ответ

26

Вы можете использовать обработчик клавиатуры для текстового поля (хотя я бы посоветовал против него *).

[SomeTextarea].onkeyup = function(e){ 
    e = e || event; 
    if (e.keyCode === 13) { 
    // start your submit function 
    } 
    return true; 
} 

* Почему бы не использовать текстовое поле ввода для этого? Textarea особенно подходит для многострочного ввода, текстового поля ввода для однострочного ввода. С помощью обработчика ввода вы вставляете многострочный вход. Я помню, что однажды использовал его для приложения чата XHR (aka AJAX) (так что текстовая область вела себя как область ввода MSN), но снова активировала многострочный ввод с помощью клавиши CTRL-enter для новых строк. Может быть, это идея для вас? Слушатель будет продлен, как это:

[SomeTextarea].onkeyup = function(e){ 
    e = e || event; 
    if (e.keyCode === 13 && !e.ctrlKey) { 
    // start your submit function 
    } 
    return true; 
} 
+0

Выглядит неплохо, спасибо. Какая вам нужна линия * e = e || событие; * для? – Alex

+7

@Alex: firefox, opera и safari (и другие браузеры, которые вставляют webkit) передают события как аргумент обработчику событий, но IE этого не делает. В IE событие является свойством глобального объекта. К счастью, семантика || в JS сделать это действительно чистым, чтобы обойти это. В JS результат выражения 'a || b' будет либо значением 'a', либо если' a' считается ложным, результатом будет 'b'. Итак, в этом случае e = e || event' либо присваивает 'e' самому себе, если событие передано в качестве аргумента, либо оно установит' e' в 'событие', что позволит этому коду работать во всех браузерах. – olliej

15

Нажатие Enter в textarea вставляет разрыв строки, а не представляет родительскую форму; это не будет работать таким образом даже с обычными тегами формы.

Было бы нецелесообразно пытаться обойти это поведение, поскольку это нарушит ожидания пользователя о том, как ведут себя элементы управления текстовыми областями, как на других веб-сайтах, так и в других приложениях на своей платформе.

+4

++ для абзаца «нецелесообразного». Всегда зная, что делает ключ ввода в текстовом поле сайта, это одна из многих небольших консистенций, которые я пропускаю при использовании других графических интерфейсов. – Shog9

+1

Хотя я полностью согласен с вашим советом, вопрос под рукой очень точно сформулирован и требует скорее реального ответа, чем хорошего совета. +1 все еще, но не могли бы вы посоветовать, как привязать какой-то keyListener к текстовой области, чтобы отправить форму на Enter, как просили? Мне очень интересно ... –

+5

Я уже давно ответил на этот ответ, но бывают случаи, когда пользователь не знает, что он вводит текстовое поле. Рассмотрим, например, строку ввода чата facebook. Он запускается как одна строка и расширяется вертикально по мере того, как пользователь вводит больше. Для пользователей абсолютно разумно ожидать, что он будет отправлен на вход. – hasen

1

Вот мое решение:

В Javascript:

function isEnterPressed(e){ 
var keycode=null; 
if (e!=null){ 
    if (window.event!=undefined){ 
     if (window.event.keyCode) keycode = window.event.keyCode; 
     else if (window.event.charCode) keycode = window.event.charCode; 
    }else{ 
     keycode = e.keyCode; 
    } 
} 
return (keycode == 13);} 

В HTML:

<input type="text" onkeyup="if(isEnterPressed(event)){/*do something*/}" /> 
13

@ Shog9 предположил, что я копирую мой ответ на дублируемую версию этого вопроса: Одна из проблем, которые игнорируется, - это запуск пользователей ный метод ввода (редакторы) - например. нелатинская текстовая запись. IME, с которым я знаком, - это Kotoeri Hiragana IM на OSX, но есть множество других как для японцев (только у Kotoeri есть несколько разных режимов ввода, и есть, по крайней мере, еще один крупный, называемый ATOK), помимо режимов для hangul, традиционный и упрощенный китайский, а также множество других менее известных языков. И эти методы ввода существуют на всех основных платформах (особенно Win, Mac и Linux).

Проблема, которую они представляют с точки зрения кода, аналогичного тому, что вы пытаетесь, заключается в том, что точные физические нажатия клавиш не обязательно соответствуют фактическому вводу, который вводит пользователь.

Например, набрав последовательность символов toukyou<enter> под хираганом по умолчанию будет производить строку とうきょう, обратите внимание, что в полученном тексте нет <enter> потому что вписывает подтверждает составленный текст. Но в дополнение к этому фактической последовательности символов, которая появляется изменения как вход напечатал:

t // t 
と // to 
とう // tou 
とうk // touk 
とうky // touky 
とうきょ // toukyo 
とうきょう // toukyou 

Если память, когда я реализовал это в WebKit, необходимо было сделать KEYCODE быть 229 на KeyDown для всех клавиш набраны в IME (для совместимости с IE) - но я не могу вспомнить, что такое поведение keyUp.

Также стоит отметить, что в некоторых IME вы не обязательно получите нажатия клавиш, нажатия клавиш или клавиш. Или вы получите несколько. Или все они отправлены вместе в конце ввода.

В целом это очень ... нечистая ... часть реализации событий DOM в настоящее время.

+2

++ Часто забытая ловушка ... – Shog9

+2

Это показывает, что многие люди считают, что языки, на которых они говорят, имеют один символ за каждое нажатие клавиши. Вот что я сделал. – Alex

-1

Текстовое поле позволяет пользователям вводить несколько строк текста, поэтому нажатие клавиши ввода только вставляет новую строку в текст. Вместо этого используйте нормальное текстовое поле, если вы хотите этого поведения

1

Есть ли причина, по которой вы не используете оболочку формы?

$('#input_id').keypress(function(e){ 
    if(e.which == 13){ 
     $('#form_id').submit(); 
     return false; //prevent duplicate submission 
    } 
});