2015-04-09 5 views
0

В поле формы я работаю с двумя активными функциями: keyup и focusout. Функции выполняют один и тот же код, только клавиатура использует функцию задержки.JQuery слияние двух функций keyup и focusout

Функция задержки:

$(function() { 
    var delay = (function(){ 
    var timer = 0; 
    return function(callback, ms){ 
     clearTimeout (timer); 
     timer = setTimeout(callback, ms); 
    }; 
    })(); 

Функции KeyUp и focusout:

$("#name").on('keyup', function(){ 
    var textn = $(this).val(); 
    var nbrCharn = textn.length; 
      delay(function(){ 
       if(nbrCharn > '2'){ $('#nameMsg').html('Nice.'); 
       }else { $('#nameMsg').html(''); } 
      }, 1000); 
    }); 

    $("#name").on('focusout', function(){ 
    var textn = $(this).val(); 
    var nbrCharn = textn.length; 
      if(nbrCharn > '2'){ $('#nameMsg').html('Nice.'); 
      }else { $('#nameMsg').html(''); } 
    }); 

KeyUp нужна задержка, то focusout не делает. Этот код работает нормально, но возможно ли объединить эти функции, поэтому у меня нет одинакового кода дважды?

+0

ваша функция задержки выглядит как он испортил скобки – Plato

+0

TNX для обратной связи. Пробовал все, не могу заставить его работать по-другому. – Aiken

+0

Я думаю, что на самом деле это просто, что вы не вставляете закрывающую скобку «$()' – Plato

ответ

1

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

var handler = function (completion){ 
    return function(){ 
     var textn = $(this).val(), 
      nbrCharn = textn.length; 
     completion(function(){ 
       if(nbrCharn > '2'){ 
        $('#nameMsg').html('Nice.'); 
       } else { 
        $('#nameMsg').html(''); 
       } 
     }); 
    }; 
}; 

, а затем определить обработчики

$("#name").on('keyup',handler(function(cb){delay(cb,1000);})); 
$("#name").on('focusout',handler(function(cb){cb();})); 
+0

в этом случае значение $ this внутри обработчика будет неправильным. вы можете решить это с помощью '.bind() 'или с моим ответом на замыкание – Plato

+0

@Plato функция возвращает другую функцию, которая затем используется как обработчик событий, поэтому' this' имеет то же значение, что и в OPs-коде –

1

Если вы используете несколько событий в одном обработчике использовать объект события аргумент, чтобы проверить event.type

$("#name").on('keyup focusout', function (evt){ 
    if(evt.type === 'keyup'){ 
     /* keyup only code */ 
    } 
}); 

Или что-то вроде

var delay = evt.type === 'keyup' ? 0 :1000; 

затем использовать задержку() для обоих

+0

Очень полезно уже быть новым для jquery, потому что это одна функция меньше. Остается тот факт, что функция delay является родительской, поэтому один и тот же код по-прежнему используется дважды. – Aiken

+0

Не понимаю, что вы подразумеваете под этим, все равно используется дважды – charlietfl

+0

$ ("# name"). On ('keyup focusout', function (evt) { if (evt.type === 'keyup') { /* delayfunction и код для html */ } if (evt.type === 'focusout') { /* тот же код для html */ } }); – Aiken

1

Один простой путь - .trigger() одно событие от другого после задержки:

$("#name").on('keyup', function(){ 
    var $this = $(this); 
    setTimeout(function() { 
     $this.trigger('focusout'); 
    }, 1000); // milliseconds 
}); 

В качестве альтернативы, use an external callback function for both, используя .call() пройти вдоль того же элемента, как this:

$("#name").on('keyup', function() { 
    var el = this; 
    setTimeout(function() { callbackFunc.call(el) }, 1000); // milliseconds 
}); 
$("#name").on('focusout', callbackFunc); 
1

Вы можете попробовать Передавая соответствующие Jquery this объекта функции:

var delay = 
(function(){ 
    var timer = 0; 
    return function(callback, ms){ 
    clearTimeout (timer); 
    timer = setTimeout(callback, ms); 
    } 
)() 

$(document).ready(init); 

function init() { 
    $("#name").on('keyup', function(){ 
    var self = this; 
    delay(
     (function(self){ 
     return function(){ 
      writeNameMsg(self) 
     }; 
     })(self) 
    , 1000); 
    }); 

    $("#name").on('focusout', function(){ 
    writeNameMsg(this); 
    }); 
} 

function writeNameMsg(self){ 
    var textn = $(self).val(); 
    var nbrCharn = textn.length; 
    if(nbrCharn > '2'){ 
    $('#nameMsg').html('Nice.'); 
    } else { 
    $('#nameMsg').html(''); } 
    } 
}; 
Смежные вопросы