Статьи

Как отправить форму с помощью Control + Enter

Вы, наверное, видели это в Twitter, Google+ или Facebook. У вас есть текстовое поле, в котором вы пишете свой статус / сообщение и затем нажимаете кнопку, чтобы отправить его. Но, если вы ленивы, как я, вам не нравится переключаться на мышь, чтобы нажать кнопку. Эти услуги помогают нам, позволяя нам нажать control + enter для отправки. Давайте воссоздадим этот сценарий для наших собственных проектов.



Конечно, причина, по которой мы не можем отправить при enter заключается в том, что мы будем использовать textarea , чтобы пользователь мог включать разрывы строк. Обычно браузер просто игнорирует control клавишу и добавляет еще один разрыв строки, когда мы нажимаем control + enter , но мы перехватим это и выполним нашу магию.


Мы здесь не для того, чтобы много говорить о HTML и CSS, поэтому вот «шаблон», с которого мы начинаем:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!DOCTYPE html>
<html lang=»en»>
<head>
    <meta charset=»UTF-8″ />
    <title>Text Box Enter</title>
    <style>
      body {
        font: 16px/1.5 helvetica-neue, helvetica, arial, san-serif;
      }
      textarea {
        border: 1px solid #ccc;
        display:block;
        width: 250px;
        height: 100px;
      }
      p {
        border: 1px solid #ccc;
        background: #ececec;
        padding: 10px;
        margin: 10px 0;
        width: 230px;
      }
      button {
        border: 1px solid #ccc;
        background: #ececec;
        -webkit-border-radius: 3px;
        padding: 5px 20px;
        margin-top:10px;
      }
    </style>
</head>
<body>
 
</body>
</html>

Нам нужно несколько элементов для работы здесь, поэтому давайте добавим их:

1
2
3
4
5
6
7
8
<textarea id=»msg»></textarea>
<button type=»submit»>Post</button>
 
<script src=»https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js»></script>
 
<script>
 
</script>

Я действительно упрощаю это здесь: у нас есть только textarea и button . Если бы это была реальная сделка, мы бы хотели получить официальную form , которая бы работала и отправляла ваше сообщение без JavaScript. Мы также включили jQuery и пустой тег сценария, которым мы воспользуемся в дальнейшем.


Мы собираемся сделать это как плагин jQuery, который мы назовем ctrlEnter . Вот с чего мы начнем:

1
2
3
4
5
$.fn.ctrlEnter = function (btns, fn) {
  var thiz = $(this);
      btns = $(btns);
 
};

Мы берем два параметра. Мы вызовем эту функцию плагина для textarea , поэтому у нас уже есть этот элемент. Первый параметр — это строка из одного или нескольких селекторов, которые будут переданы в jQuery. Это элементы, которые должны иметь одинаковую функциональность при нажатии. Второй параметр — это функция, которая будет выполняться при нажатии клавиши « control + enter . Затем мы создаем переменные: jQueryified textarea и jQueryified btns .

1
2
3
function performAction (e) {
  fn.call(thiz, e);
}

Затем мы создаем функцию, которая оборачивает переданную нами функцию. Мы делаем это так, чтобы мы могли быть уверены, что функция вызывается с элементом textarea как this внутри функции. Мы также передаем ему объект события из события.

1
2
3
4
5
6
7
8
thiz.bind(«keydown», function (e) {
  if (e.keyCode === 13 && e.ctrlKey) {
    performAction(e);
    e.preventDefault();
  }
});
 
btns.bind(«click», performAction);

Далее у нас есть фактические обработчики событий. Первый связывает функцию с событием textarea элемента textarea . e.keyCode === 13 означает, что нажата клавиша ввода. Если e.ctrlKey имеет значение true, это означает, что пользователь нажимал клавишу управления при нажатии клавиши ввода. Если нажата клавиша ввода и клавиша управления, мы вызовем эту функцию performAction . Затем мы вызовем e.preventDefault , что предотвратит новую e.preventDefault , которую обычно вводит клавиша ввода.

А теперь давайте подключим обработчики событий к кнопкам; мы просто возьмем текст, заменим все вхождения \n на <br /> , поместим его в абзац и добавим к телу:

1
2
3
4
$(«#msg»).ctrlEnter(«button», function () {
  $(«<p></p>»).append(this.val().replace(/\n/g, «<br />»)).prependTo(document.body);
  this.val(«»);
});

Теперь давайте проверим это:


Мы дадим вам быстрый совет за день. Есть другой способ сделать это? Хит комментарии!