За последние 24 часа нас посетили 30875 программистов и 1477 роботов. Сейчас ищут 874 программиста ...

Множественные таймеры на инпутах

Тема в разделе "JavaScript и AJAX", создана пользователем igordata, 23 апр 2012.

  1. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    допустим на странице есть инпуты, куда вводят текст. Текст должен отсылаться автоматом из каждого инпута, через некоторое время, как юзер перестал печатать.
    Т.е. по нажатию кнопки создаем таймер, который отправит содержимое аяксом. Если юзер снова нажал кнопку - убиваем предыдущий таймер и запускаем новый.

    вопрос.

    как реализовать это автоматически в форме плагина.
    ну тоесть $('input.autosend').autosend(); и все они получили этот механизм.

    где в данном случае хранить идентификатор таймера? в самом инпуте одним из параметров не хочется. Жук как-то без этого обходится. Как можно привязать к инстансу какую-то переменную внутри функции, которая не будет сбрасывать значение между вызовами?
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    То есть у тебя форма с инпутами?
    Или много форм с инпутами!?

    Таймер это ты для себя сказал ?)))
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты не шаришь =)
     
  4. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Я пытаюсь понять, твои слова =)
     
  5. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Код (Text):
    1. jQuery.fn.autosend= function(options) {
    2.  
    3.   var .... тут переменные ...;
    4.  
    5.   this.each(function() {
    6.       .. тут сажаем обработчики, переменные доступны
    7.   });
    8. };
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я не понимаю, как мне запомнить таймер, после его создания, чтобы похерить.

    в js есть статик переменные какиенить?

    почитаю...
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    разобрался. this у всех будет разное и зашибись.
     
  8. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    Делал такое для чата , моим вариантом стало
    Код (Text):
    1. function onkey(el){
    2. var inpval=el.val();
    3. setTimeout(function(){
    4. if(inpval==el.val())
    5. {
    6. sendfunction(el.attr('name'));
    7. }
    8. },1000);
    9. }
    ну в таком виде
    соотв в инпуте onkeyup="onkey($(this))"
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    у тебя таймер не отменяется при продолжающемся вводе.
     
  10. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    Код (Text):
    1. if(inpval==$(this).val())
    2. {
    3. sendfunction($(this).attr('name'));
    4. }
    а это что ? =D
    нажмёшь раз - запустится таймер , пока не истёк таймер нажимаешь ещё раз - два таймера , первый поймёт что содержимое инпута не равно тому которое было при вызове ф-ции и не выполнится дальшейщий код.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    хз. я через таймеры сделал и потом вобще все переделал на такой код через jQuery autocomplete:
    <input name='search' data-target='это куда выводить результаты' data-url='/это куда делать реквест'>
    Код (PHP):
    1. $(document).ready(function() {
    2.   jQuery.fn.autosubmit = function (options) {
    3.     var options = $.extend({
    4.       url: false,
    5.       target: false,
    6.       delay: 300
    7.     }, options);
    8.     return this.each(function() {
    9.       $(this).autocomplete({
    10.         source: '',
    11.         search: function(event, ui) {
    12.           var target = $($(this).data('target'));
    13.           var request = new Object();
    14.           request[$(this).attr('name')] = $(this).val()
    15.           jQuery.get($(this).data('url'), request,
    16.             function(reply){
    17.               target.html(reply);
    18.             });
    19.           return false;
    20.         }
    21.       });
    22.     });
    23.   }
    24. }); 
    Работает на пять с плюсом.


    а было так:

    Код (PHP):
    1. $(document).ready(function() {
    2.   jQuery.fn.autosubmit = function (options) {
    3.     var options = $.extend({
    4.       url: false,
    5.       target: false,
    6.       delay: 300
    7.     }, options);
    8.     return this.each(function() {
    9.       var settings=new Object();
    10.       settings.Timer = 0;
    11.       settings.me = $(this);
    12.       settings = $.extend(settings, options);
    13.       //console.log(settings)
    14.       function pupu () {
    15.         clearTimeout(settings.Timer);
    16.         settings.Timer = setTimeout(function() {
    17.           var data =  new Object();
    18.           data[settings.me.attr('name')] = settings.me.val()
    19.           jQuery.get(settings.url, data,
    20.             function(reply){
    21.               $(settings.target).html(reply);
    22.             });
    23.         }, settings.delay);
    24.       };
    25. //      $(this).click(function () {
    26. //        pupu();
    27. //      });
    28.       $(this).keyup(function () {
    29.         pupu();
    30.       });
    31.       $(this).blur(function () {
    32.         pupu();
    33.       });
    34.       $(this).change(function () {
    35.         pupu();
    36.       });
    37.       $(this).bind('paste', function(e) {
    38.         pupu();
    39.       });
    40.     });
    41.   }
    42. });
    43.  
     
  12. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    Ну по задаче - мой вариант самый простой
    Если бы я на работе вхерачил автокомплит , то когда-нибудь его пришлось бы оптимизировать и в итоге я бы пришёл к своему же варианту , а я не люблю двойную работу =)
    И там интервал 300мс , думаю это мало , я на чат ставил 1500 и то нужно было 2000
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    согласен. я б даже сказал, самый хитрый =) хотя и не элегантный.

    300мс самое то для аяксовой формы быстропоиска
     
  14. siiXth

    siiXth Активный пользователь

    С нами с:
    14 мар 2010
    Сообщения:
    1.447
    Симпатии:
    1
    а тьху , забыл что у тебя не чат =D