допустим на странице есть инпуты, куда вводят текст. Текст должен отсылаться автоматом из каждого инпута, через некоторое время, как юзер перестал печатать. Т.е. по нажатию кнопки создаем таймер, который отправит содержимое аяксом. Если юзер снова нажал кнопку - убиваем предыдущий таймер и запускаем новый. вопрос. как реализовать это автоматически в форме плагина. ну тоесть $('input.autosend').autosend(); и все они получили этот механизм. где в данном случае хранить идентификатор таймера? в самом инпуте одним из параметров не хочется. Жук как-то без этого обходится. Как можно привязать к инстансу какую-то переменную внутри функции, которая не будет сбрасывать значение между вызовами?
Код (Text): jQuery.fn.autosend= function(options) { var .... тут переменные ...; this.each(function() { .. тут сажаем обработчики, переменные доступны }); };
я не понимаю, как мне запомнить таймер, после его создания, чтобы похерить. в js есть статик переменные какиенить? почитаю...
Делал такое для чата , моим вариантом стало Код (Text): function onkey(el){ var inpval=el.val(); setTimeout(function(){ if(inpval==el.val()) { sendfunction(el.attr('name')); } },1000); } ну в таком виде соотв в инпуте onkeyup="onkey($(this))"
Код (Text): if(inpval==$(this).val()) { sendfunction($(this).attr('name')); } а это что ? =D нажмёшь раз - запустится таймер , пока не истёк таймер нажимаешь ещё раз - два таймера , первый поймёт что содержимое инпута не равно тому которое было при вызове ф-ции и не выполнится дальшейщий код.
хз. я через таймеры сделал и потом вобще все переделал на такой код через jQuery autocomplete: <input name='search' data-target='это куда выводить результаты' data-url='/это куда делать реквест'> Код (PHP): $(document).ready(function() { jQuery.fn.autosubmit = function (options) { var options = $.extend({ url: false, target: false, delay: 300 }, options); return this.each(function() { $(this).autocomplete({ source: '', search: function(event, ui) { var target = $($(this).data('target')); var request = new Object(); request[$(this).attr('name')] = $(this).val() jQuery.get($(this).data('url'), request, function(reply){ target.html(reply); }); return false; } }); }); } }); Работает на пять с плюсом. а было так: Код (PHP): $(document).ready(function() { jQuery.fn.autosubmit = function (options) { var options = $.extend({ url: false, target: false, delay: 300 }, options); return this.each(function() { var settings=new Object(); settings.Timer = 0; settings.me = $(this); settings = $.extend(settings, options); //console.log(settings) function pupu () { clearTimeout(settings.Timer); settings.Timer = setTimeout(function() { var data = new Object(); data[settings.me.attr('name')] = settings.me.val() jQuery.get(settings.url, data, function(reply){ $(settings.target).html(reply); }); }, settings.delay); }; // $(this).click(function () { // pupu(); // }); $(this).keyup(function () { pupu(); }); $(this).blur(function () { pupu(); }); $(this).change(function () { pupu(); }); $(this).bind('paste', function(e) { pupu(); }); }); } });
Ну по задаче - мой вариант самый простой Если бы я на работе вхерачил автокомплит , то когда-нибудь его пришлось бы оптимизировать и в итоге я бы пришёл к своему же варианту , а я не люблю двойную работу =) И там интервал 300мс , думаю это мало , я на чат ставил 1500 и то нужно было 2000
согласен. я б даже сказал, самый хитрый =) хотя и не элегантный. 300мс самое то для аяксовой формы быстропоиска