Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   События формы (https://javascript.ru/forum/dom-window/70175-sobytiya-formy.html)

Роман Андреевич 17.08.2017 05:45

События формы
 
Коллеги доброго времени суток, проблема следующая:

На странице есть input в который пользователь вводит число, какое нибудь не важно. Далее скрипт на сервер отправляет данные.

Теперь собственно вопрос: я ловлю событие input'а :

document.addEventListener('input', function(e) {

    e = e || window.e;
    var target = e.target || window.target;
    
    while (target != this) {
        
        if (target.tagName != 'INPUT') return;
            
        if (target.hasAttribute('data-action')) { 
            
            if (target.getAttribute('data-action') == 'refresh') {

                console.log(target.value);
                
            } else return;
            
        } else return;
        
        target = target.parentNode;
    }


С тем что происходит внутри события все понятно, надеюсь. НО!!! как сделать, что бы в консоле выводилось не каждое value, которое выводит пользователь а последнее. Т.е. я ввожу например 50, сначала в консоле выводится 5 а потом 50, а как сделать что бы выводило сразу 50. Выводить число нужно с задержкой, т.е. пользователь что то ввел, ему дается 2 секунды, а потом выводится в консоль его число. Примерно так.

Роман Андреевич 17.08.2017 06:26

e - событие
target - записали в переменную

можно без этих строк, суть не в них

Роман Андреевич 17.08.2017 06:28

Вопрос, в том, как выводить в консоль, только одно число а не каждое, которое ввел пользователь. Т.к. input (событие) срабатывает при каждом изменении поля input, нужно взять только последнее число, через 2 секунды после

j0hnik 17.08.2017 06:34

заменить событие например на
el.addEventListener('blur', function(e) { // потеря фокуса инпутом

Роман Андреевич 17.08.2017 06:42

Rise, а в чем бред то??????? с точки зрения кроссбраузерности и делегирования в чем проблема то, везде работает!!!!!

Есть проблема и я задал вопрос, если не поняли вопроса так и скажите...

j0hnik 17.08.2017 06:43

Цитата:

Сообщение от Rise (Сообщение 461816)
j0hnik,
Товарищ, событие blur не вплывает так что же ты его на document повесил?

document.addEventListener('focusout', function(e) { // потеря фокуса инпутом

Роман Андреевич 17.08.2017 06:43

А говорить про бред это детский сад, форум для того и создан, одни просят помощи, а другие если могут помогают, по мойму все нормально

laimas 17.08.2017 06:46

Цитата:

Сообщение от Роман Андреевич
по мойму все нормально

Не нормально, тем более что "На странице есть input", то есть один, делегировать при этом его обработчики, это уже глупо.

Роман Андреевич 17.08.2017 06:48

j0hnik, в целом работает, но работает когда мышкой кликаешь в другое место, суть та же если рядом поставить кнопку.

А нужно что бы пользователь ввел какое то число, прошло 2 секунды а это число вывелось в консоль ну или в блок, какой нибудь, автоматом.

j0hnik 17.08.2017 06:48

Цитата:

Сообщение от Rise (Сообщение 461820)
Роман Андреевич,
в ie8 не работает
j0hnik,
в FF не работает focusout

тогда blur на сам input

Роман Андреевич 17.08.2017 06:51

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

Что глупого то??????

Роман Андреевич 17.08.2017 06:52

Rise, сайт работает от ie10+

laimas 17.08.2017 06:55

Цитата:

Сообщение от Роман Андреевич
Что глупого то??????

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

Роман Андреевич 17.08.2017 06:59

laimas,
А что не понятного то в моем вопросе?????? При чем тут делегирование и кроссбраузерность?????????

Я задал вопрос, как из поля вытащить value и вывести его в консоль, не каждый раз а через какое то время, при этом число должно быть последним, которое ввел пользователь....

Извиняюсь если задал изначально вопрос некорректно)))))))))

Роман Андреевич 17.08.2017 07:01

Rise,
да без разницы на кроссбраузерность!!!

laimas 17.08.2017 07:02

Цитата:

Сообщение от Роман Андреевич
При чем тут делегирование и кроссбраузерность?

Вам это и пытаются пояснить, но до вас это не доходит.

Роман Андреевич 17.08.2017 07:02

Суть в том, что пользователь ввел какое то число, а через какое то время, если он закончил ввод вывести в консоль это число!!!!!!!!!

Вопрос как это сделать

Роман Андреевич 17.08.2017 07:03

laimas, покажите как это сделать....

Роман Андреевич 17.08.2017 07:04

Rise, что в нем бредового???????

Роман Андреевич 17.08.2017 07:10

ясно

Роман Андреевич 17.08.2017 07:10

Видимо разное развитие

laimas 17.08.2017 07:12

Цитата:

Сообщение от Роман Андреевич
laimas, покажите как это сделать....

Много разговоров по данному вопросу потому, что вы вопрос "размазали". Хоть 100 полей ввода, это еще не означает, что требуется делегирование. Делегируют тогда, когда, например, поля добавляются в документ динамически, в этом случае обработку делегируют их ближайшему общему родителю.

Если ваши поля присутствуют на странице, то установите обработчики прямо на них, и вам поможет onblur, который не всплывает, а поэтому не подходит под делегирование.

Роман Андреевич 17.08.2017 07:23

laimas, blur срабатывает только при потере фокуса, а нужно что бы автоматом выводились символы в консоль, без дополнительных действий

Роман Андреевич 17.08.2017 07:25

Ладно, все равно спасибо, разберусь

laimas 17.08.2017 07:28

Цитата:

Сообщение от Роман Андреевич
blur срабатывает только при потере фокуса, а нужно что бы автоматом выводились символы в консоль

А что в случае если blur, то в консоли их китайцы прописывать будут?

Можно и таймер, но при фокусе если таймер запущен уже (другим полем), то очищать его, а по отпусканию кнопки запускать новый.

Роман Андреевич 17.08.2017 07:32

laimas, в том и дело, что нет кнопки, с кнопкой то все просто, тык и работает, это сделано. Нужно не фокус искать, а отслеживать изменение input'а

laimas 17.08.2017 07:39

Цитата:

Сообщение от Роман Андреевич
Нужно не фокус искать, а отслеживать изменение input'а

Даже так? А что есть "изменение поля ввода"? Пожалуйста - обрабатывайте событие onchange поля ввода. Но, это событие сработает только тогда, когда поле потеряет фокус.

Что же нужно обрабатывать, что знать, что значение поля изменилось?

Роман Андреевич 17.08.2017 07:45

Rise, спасибо, )))))))))) пока баталии развивались, я то же самое сделал. Проблема оказалась в очистке таймера.

Роман Андреевич 17.08.2017 07:53

laimas,
Изменение: change, input, cut, copy, paste - https://learn.javascript.ru/events-change

Роман Андреевич 17.08.2017 07:55

laimas, в моем случае это событие input, хотя так же все работает и после keyup. Во втором случае можно проверить быстро что ввел пользователь. Разрешить ему определенные кнопки

Роман Андреевич 17.08.2017 07:56

Rise, единственное чем отличается твой и мой код, это то что ты убрал target = target.parentNode;

laimas 17.08.2017 08:04

Роман Андреевич,
вот спасибо. Это вам нужно почитать. Кстати ваш код с ошибками. С атрибутами сами разбирайтесь, откуда они появляются, а делегирования не требуется.
[].forEach.call(document.querySelectorAll('input'), function() {
    this.addEventListener('input', function (e) {
        e = e.target;
        clearTimeout(e.timeoutId);
        e.timeoutId = setTimeout(function () {
            console.log(e.value);
        }, 2000);
    })
})


Только я имел ввиду один таймер для всех. Но чего вы там делаете, бог его знает.

Роман Андреевич 17.08.2017 08:07

laimas, спасибо за помощь

Роман Андреевич 17.08.2017 08:39

Rise, да не куда сочинять, все равно спасибо, все равно с вашей помощью вопрос решился, за что вам большое спасибо


Часовой пояс GMT +3, время: 18:00.