2015-01-11 6 views
1

".slick-next"버튼을 클릭하면 브라우저가 3 초 동안 기다린 다음 loadPHP() 함수를 실행합니다. 아래 코드는 이론적으로는 작동하지만 보이지는 않는 것 같습니다. setTimeout 함수는 페이지가로드 될 때 한 번 실행되지만 다음 버튼을 클릭하면 아무 것도 수행하지 않습니다.jQuery로 setTimeout을 즉시 실행 하시겠습니까?

var timeout = null; 

$(".slick-next").click(nextButton(timeout)); 

var nextButton = (function(timeout) { 
    window.clearTimeout(timeout); 
    timeout = setTimeout(function() { 
     loadPHP(); 
    }, 3000); 
}); 

전체 jQuery 표현식을 setTimeout에 래핑하려고했으나 작동하지 않습니다. 3 초 동안 버튼을 클릭 할 수 없지만 끝까지 클릭 할 수는 있습니다.

setTimeout(function() { 
    $(".slick-next").click(nextButton(timeout)); 
}, 3000)); 

왜 이런 현상이 발생합니까?

+0

'click'은'nextButton'이 반환하는 함수가 아니라'undefined'가 아닌 함수를 기대합니다. 아마도'.click (nextButton)'을 원할 것이고, 또한 JS에서 참조에 의한 참조가 없다는 것에 주목하자. – elclanrs

+0

@elclanrs 이것을 확장 할 수 있습니까? – aaronmcavinue

+0

http://jsfiddle.net/0y1gzf94/ –

답변

1

당신은, 클릭 핸들러로 nextButton을하지 연결 즉시 실행합니다.

당신은 쓸 수 :

$(".slick-next").click(nextButton); 

을 인수를 전달할 필요를 제외하고. 또한

$(".slick-next").click(nextButton.bind(null, timeout)); 

의의 setTimeout 식을 단순화 :

timeout = setTimeout(loadPHP, 3000); 
+0

이것은 나를 가장 멀리하게했다. 이제 자동으로로드되지 않고 버튼을 클릭하면 loadPHP() 함수가 한 번 실행됩니다. 하지만 한 번만 실행할 수 있습니다. 버튼을 클릭해도 함수가 다시 실행되지 않습니다. – aaronmcavinue

+0

'loadPHP'의 부작용처럼 보이지만 프로세스가 의존하는 무언가를 파괴합니다. '.slick-next'가 예를 들어 대체 될까요? –

+0

당신은 뭔가를 망쳐 놓는 것이 옳다. 다른 답변들이 효과가 있었을지라도, 이것은 내가하고있는 일에 가장 잘 맞았습니다. – aaronmcavinue

1

.click(nextButton(timeout))을 수행하면서 타이머를 시작하면서 이미이 기능을 호출하고 있기 때문입니다.

대신

, 참조 전달합니다

var timeout = null; 
 
var clickCount = 0; 
 

 
var loadPHP = function() { 
 
    $('#output').text(clickCount + ': Loading from server ...'); 
 
}; 
 

 
var nextButton = function() { 
 
    clickCount++; 
 
    window.clearTimeout(timeout); 
 
    timeout = setTimeout(loadPHP, 3000); 
 
    $('#output').text('Timeout ' + timeout + ' set. Waiting 3s.'); 
 
}; 
 

 
$(".slick-next").click(nextButton);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button class="slick-next">Run</button> 
 
<div id="output"></div>

을 ... 또는 의견 중 하나에 제안 function.prototype.bind를 사용하지만 그것은 정말 여기에 원하는 무엇을 필요하지 않습니다 그리고 그것은 ECMA입니다 script 5.1 기능을 제공하므로 이전 JavaScript 브라우저 구현에서는 사용할 수 없습니다. 또한 노트

: 는 변수함수식을 할당, 이는 변수가 사용 전에을 수행한다; 그렇지 않으면 undefined 값을 전달합니다. 이 필요를 피하려면 declaration hoisting을 사용하십시오. 오른쪽에있는 표현식은 값에 대해 평가되고 있기 때문에

+0

약간의 주제를 벗어나지 만 답변에 "run code snippet"을 어떻게 포함 시켰습니까? – aaronmcavinue

+0

그것에 관한 [블로그 게시물] (http://blog.stackoverflow.com/2014/09/introducing-runnable-javascript-css-and-html-code-snippets/)이 있습니다. 의견은 질문에 대한 답변을 논의하기위한 것입니다. @ featherlight53 답변을 수락 된 것으로 표시하는 것을 잊지 마십시오. –

-1

는 드롭 바깥 쪽 함수 주위에 괄호 :

var nextButton = function(timeout) { 
    window.clearTimeout(timeout); 
    timeout = setTimeout(function() { 
     loadPHP(); 
    }, 3000); 
}; 
+0

'var x = (function() {})';'var x = function() {};'같은 결과에서 나온 결과 : 두 번 익명 함수가'x'에 할당됩니다. –

0

내가 일이 원하는 것은 때 ".slick - 다음"버튼을 클릭, 브라우저 대기입니다 즉 .bind()가 무엇인지입니다 삼초 후 loadPHP() 함수를 실행

우리는 이벤트 클릭에 바인딩 이벤트 핸들러와 같은 기능을 설정하여 쉽게 할 수

:

$(".slick-next").on("click",function(){ 
    setTimeout(function() { 
     loadPHP(); 
    }, 3000); 
}); 

코드에 문제가있는 것은 click 함수 $ (". slick-next")를 호출하여 click 이벤트를 발생시킨 것입니다.