2011-01-17 7 views
0

사용자가 텍스트 상자에 무엇인가를 입력 할 때마다 제출해야하는 AJAX 양식이 있습니다.ASP.NET MVC : 지연이있는 AJAX 제출 양식

다음 코드는 작동 : 나는 양식을 제출에서 1 초 지연이되도록 코드를 업데이트하기 위해 노력했습니다

<% using (Ajax.BeginForm("myAction", "myController", null, new AjaxOptions() { InsertionMode = InsertionMode.Replace, UpdateTargetId = "resultDiv" }, new { id = "myForm" })) 
    {%> 

<script type="text/javascript" language="javascript"> 
    jQuery("#myForm").keyup(function() { $('#myForm').trigger('onsubmit'); }); 
</script> 

Search: <input type="text" id="myTextField" /> 

<%} %> 

. 이 지연은 사용자가 1 초 간격으로 타이핑을 중단 할 때만 양식이 제출되도록합니다. 이 코드 작동하지 않습니다

<% using (Ajax.BeginForm("myAction", "myController", null, new AjaxOptions() { InsertionMode = InsertionMode.Replace, UpdateTargetId = "resultDiv" }, new { id = "myForm" })) 
    {%> 

<script type="text/javascript" language="javascript"> 
    var timerid; 
    jQuery("#myForm").keyup(function() { 
     clearTimeout(timerid); 
     timerid = setTimeout(function() { $('#myForm').trigger('onsubmit'); }, 1000); 
    }); 

</script> 

Search: <input type="text" id="myTextField" /> 

<%} %> 

사용자가 짧은 시간 동안 입력이 멈출 때까지 제출되는 아약스 양식을 지연하는 방법에 대한 어떤 제안이?

업데이트 : Chrome을 사용하여 스크립트가 catch 된 예외에서 MicrosoftAjax.js의 어딘가에서 멈추는 것을 발견했습니다. 나는 예외가 정확히 무엇인지 찾는 방법을 모른다. 2 초를 기다린다 정확하게

var timerid; 

    jQuery("#myForm").keyup(submitWithTimeout); 

    function submitWithTimeout() { 
     clearTimeout(timerid); 
     timerid = setTimeout(submitAjaxForm, 2000); 
    } 

    function submitAjaxForm() { 
     $('#myForm').trigger('onsubmit'); 
    } 

코드는 "submitWithTimeout"기능 양쪽 라인을 실행하고, 다음과 같이 디버깅 목적

는 I 코드를 재 작성. submitAjaxForm 함수에 도달하고 앞서 언급 한 것처럼 MicrosoftAjax.js 파일의 catch 된 예외에서 중지합니다.

업데이트 2 : 현재 MicrosoftAjax.js의 디버그 버전을 사용하고 있으며 오류의 원인을 발견했습니다. Chrome에서 expression watcher를 사용하여 다음 문제로 범위를 좁힐 수있었습니다. MicrosoftAjax.js가 실행되는 동안 "eventObject"변수가 null입니다. 소스 코드에서 수집 한 것은 타이머를 사용하여 양식을 제출할 때 onsubmit 코드의 "이벤트"가 null이라는 것입니다. 어떤 아이디어? 시간 제한 방법을 사용하는 경우

<form action="myAction" id="myForm" method="post" onsubmit="Sys.Mvc.AsyncForm.handleSubmit(this, new Sys.UI.DomEvent(event), { insertionMode: Sys.Mvc.InsertionMode.replace, updateTargetId: 'myResult' });"> 

new Sys.UI.DomEvent(event)은 "이벤트"파라미터에 널 값을 갖는다.

+0

무엇 "작동하지 않습니다"않습니다 의미 : 이와 같이

는 코드는 다음이된다? 오류? 취소되지 않았습니까? 다른 것? 아마도 초기화되지 않은 변수에 대해 clearTimeout을 사용하면 안됩니다. –

+0

아니요, 오류가 없습니다. 사실, 나는 아무것도 볼 수 없다. 자바 스크립트 오류 목록이 명확하고 MVC의 액션 메소드에 대한 호출이 없습니다. 어딘가에 자바 스크립트 문제가 있다고 생각하지만 찾을 수 없습니다. ClearTimeout을 어떻게 다룰 생각입니까? 이 코드는 http://stackoverflow.com/questions/2006870/submit-form-with-delay-while-entering-data-into-input-field에서 발췌 한 것입니다. – Remus

+0

@ 루 : 오류가 잡혔습니다. 나는 그것을 보지 못했습니다. 오류가 무엇인지 아직 모르겠지만, 어디서 왔는지 알고 있습니다 ... 자세한 내용은 업데이트를 참조하십시오. ClearTimeout에 문제가없는 것 같습니다. – Remus

답변

0

.

마지막 업데이트 (질문 참조)에서 언급했듯이 MicrosoftAjax.js 라이브러리가 실행될 때 event 변수가 할당되지 않아서 양식을 제출하려고 시도 할 때 문제가 발생합니다. event 변수에는 양식 제출을 트리거 한 KeyboardEvent (또는 MouseEvent, 상상해보십시오)가 있습니다. 이 event 변수는 "keyup"이벤트 발생시 할당되지만 시간 제한이 만료 된 후에는 더 이상 사용할 수 없으며 범위가 손실되었을 수 있으므로 일 수 있습니다.

제 해결 방법은 이벤트 데이터를 키를 누를 때의 상태로 재설정하기 위해 값을 전역 변수에 저장하는 것입니다.

var timerid; 
var timerEvent; 

jQuery("#myForm").keyup(submitWithTimeout); 

function submitWithTimeout() { 
    clearTimeout(timerid); 
    timerEvent = event; 
    timerid = setTimeout(function() { submitAjaxForm(); }, 2000); 
} 

function submitAjaxForm() { 
    event = timerEvent; 
    $('#myForm').trigger('onsubmit'); 
} 
1

TypeWatch jquery plugin을 사용하는 것이 좋습니다. 이렇게하면 매우 쉽게 구현할 수 있습니다. 코드는 간단하게 다음과 같습니다 일정 지연 후 AJAX 양식을 제출하려고 할 때 특별한 요구 사항이있는 것 같습니다

$("#myForm input").typeWatch({ 
    callback: function() { 
     $('#myForm').trigger('onsubmit'); 
    }, 
    wait: 1000, 
    highlight: true, 
    captureLength: 3 
}); 
+0

이 플러그인을 사용하려고하는데 아무 문제가없는 비슷한 문제가 발생합니다. 문제가 "방아쇠"방법이 아닌지 궁금합니다. – Remus

+0

언급 한 코드 또는 언급 한 TypeWatch 코드를 사용하는지 여부에 관계없이 MicrosoftAjax.js 파일에서 문제가 발생하는 것처럼 보입니다. 자세한 내용은 내 업데이 트를 참조하십시오 ... – Remus

+0

이 질문에 대한 내 자신의 대답을 참조하십시오. AJAX 양식 요청에는 onsubmit 메서드가 트리거되면 더 이상 설정되지 않는 '이벤트'변수가 필요하다는 범위 문제가 있음을 알 수 있습니다. 이것이 아마도 시나리오에서 TypeWatch 플러그인이 작동하지 않는 이유 일 것입니다. +1하면 AJAX 양식에서 작동합니다. – Remus