2011-07-18 8 views
3

Мне нужна помощь с функцией JavaScript, которую я вызываю onKeyUp, это функция Ajax, но каждый раз, когда я пишу любой символ, он вызывает функцию, и это замедляет производительность страницы, и она проверяет каждый раз, это пользователь проверяет базу данных.JavaScript onKeyUp временная задержка

Я попытался это:

var timer; 
function chk_me(){ 

    clearTimeout(timer); 
    timer=setTimeout(function validate(){...},1000); 
} 

Но моя функция Validate есть параметр, так что я не в состоянии передать его, я вызываю функцию так:

<input type="text" name="usuario" id="usuario" class="required" onKeyUp="chk_me();" minlegth="4" value=/> 

правильно ли это? Что мне делать?

Это мой первый вопрос, и я надеюсь, что вы все это понимаете

Спасибо, Alberto

Спасибо всем, так как я новичок, я не могу сделать это в другом ответе, поэтому я отредактировал мой вопрос с решением. Я нахожу это: http://bytes.com/topic/javascript/answers/451142-need-advice-acting-only-last-onkeyup-event-series и использую последний метод ответа и добавляю его в код, я оставляю вам код, как будто он говорит, что это не лучший способ, но работает так, если у вас есть другой способ, я по достоинству оценю его и использую здесь. является:

var keyCount = 0; 
var timeoutCount = 0; 

function handleKeyUp() // keyup handler 
{ 
keyCount++; 
setTimeout("compareCounts()", 500); 
} 

function compareCounts() 
{ 
var usuario = document.profileForm.usuario.value; 
timeoutCount++; 
if (keyCount == timeoutCount) 
{ 
xajax_checaUsuario(usuario); 
} 
} 

Итак, я принимаю var таким образом, чтобы любые предложения, чтобы сделать его лучше?

Благодаря

+0

Можете ли вы подробнее остановиться на в чем именно проблема?: Ввод выполняется медленно, взаимодействие со страницей происходит медленно? – mrtsherman

+0

Ну, это не замедляет производительность, которую я пропускаю, аакс медленнее, чем Javascript, поэтому я показываю каждую клавишу нажатой, если она доступна или нет, и когда вы, хотя она доступна, может показать вам, что она недоступна @mrtsherman спасибо – apz2000

+0

Возможный дубликат [jQuery .keyup() delay] (http://stackoverflow.com/questions/1909441/jquery-keyup-delay) –

ответ

7

Не передавайте validate непосредственно setTimeout, а назвать его внутри анонимной функции:? Замедлить производительность страницы "

var timer; 
function chk_me(arg) { 
    clearTimeout(timer); 
    timer = setTimeout(function() { 
     validate(arg); 
    }, 1000); 
} 
+0

Я не понимал, что сначала, но потом я использую его и когда совершенен, спасибо человеку – apz2000

0

Вы можете сделать следующее

var timer; 
function chk_me(myparam){ 

    clearTimeout(timer); 
    timer=setTimeout(function validate(){...},1000); 
} 

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

<input type="text" name="usuario" id="usuario" class="required" onKeyUp="chk_me('stringval');" minlegth="4" value=/> 
+0

Я пробовал, но он принимает как разные var каждый myparam – apz2000

+0

Я нашел решение, что я делаю так: 'var keyCount = 0; var timeoutCount = 0; function handleKeyUp() // обработчик keyup {keyCount ++; setTimeout ("compareCounts()", 500); } function compareCounts() {var user = document.profileForm.usuario.value; timeoutCount ++; if (keyCount == timeoutCount) {// мой процесс}} 'Поэтому я принимаю значение этого конкретного поля. Спасибо @Zoidberg в любом случае, я думаю, что это не лучший способ, но это работает для меня. – apz2000

+0

@ Zoidberg -' setTimeout' can 't передайте параметры указанной вами функции, поэтому способ, которым вы это сделали в своем ответе, не будет работать. Вы можете передать ему функцию, которая, в свою очередь, вызывает вторую функцию с параметрами: см. Ответ gilly3. – nnnnnn

0

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

var timer; 
function chk_me(myparam) { 

    clearTimeout(timer); 
    var validate = function() { 

     //do stuff with myparam 
     var foo = myparam; 

    } 
    timer=setTimeout(validate,1000); 
} 

Как и прежде, таймер обеспечивает все предыдущие вызовы будут отменены, если не было 1 секунда ожидания, и когда вы определяете проверку в пределах области chk_me, локальная переменная myparam будет видна внутри нее, даже когда ее дескриптор передается в setTimeout.

 Смежные вопросы

  • Нет связанных вопросов^_^