2012-09-03 1 views
4

formonSubmit 이벤트에 문제가 있습니다.무언가가로드 될 때까지 어떻게 "onsubmit"이벤트를 지연시킬 수 있습니까?

JavaScript 페이지 image을 사용하여 다른 웹 페이지로 일부 추적 정보를 보내고 있습니다 (매개 변수는 GET에 있음).

image (src 속성을 통해)로드하려고하면 페이지가 image에 대한 요청이 수행되는 (또는 즉시 중단됨) 것보다 빨리 새로 고쳐집니다.

이렇게하면 외부 추적 페이지로 정보가 전송되지 않습니다. 이 에 대한 submit 처리기에서 image을 어떻게 처리 할 수 ​​있습니까?

편집 : 나는 다른 이벤트가

+2

동기식 [xhr] (https://developer.mozilla.org/)을 사용하십시오. en-US/docs/DOM/XMLHttpRequest). – Yoshi

+0

'jQuery'를 사용합니까? – sabithpocker

+0

@sabithpocker : 더 이상 페이지와의 호환성을 위해 일반 JS가 필요하지 않습니다. – XaReSx

답변

1

이 잘 작동합니다 (예를 들어, 검증 등) 같은 장소에있을 수 있다는 놓친 또 하나의 포인트가있다 :

var img = document.getElementById('image'), 
    form = document.getElementById('form'); 

img.addEventListener('load', function(){ 
    window.imageIsLoaded = true; 
    if(window.submitForm === true){ 
     form.submit(); 
    } 
}, false); 

form.addEventListener('submit', function (e){ 
    window.submitForm = true; 
    if(window.imageIsLoaded !== true){ 
     e.preventDefault(); 
     return false; 
    } 
}, false);​ 

Demo

+1

이건 그냥 이벤트 제출을 취소 할까 봐 걱정됩니다. 그리고 사용자가 제출 버튼을 두 번 클릭하도록합니다. –

+0

@FAngel 바로 그 점에 대해 감사드립니다. 내 대답을 편집했습니다. –

+0

그리고 여기서 아무런 문제가 보이지 않습니까? –

1

필요에 따라 양식을 자동 제출할 수있는 대체 방법은 다음과 같습니다.

document.getElementById('yourFrm').addEventListener('submit',(function() 
{ 
    'use strict'; 
    var imgLoaded,img,tmpImgLoad; 
    imgLoaded = false; 
    img = document.getElementById('yourImg'); 
    tmpImgLoad = function() 
    { 
     imgLoaded = true; 
     img.removeEventListener('load',tmpImgLoad,false);//remove obsolete listener? 
    }; 
    img.addEventListener('load',tmpImgLoad,false); 
    return function(e) 
    { 
     if (!imgLoaded) 
     { 
      tmpImgLoad = function() 
      { 
       imgLoaded = true; 
       img.removeEventListener('load',tmpImgLoad,false); 
       document.getElementById('yourForm').submit(); 
      }; 
      e.preventDefault(); 
      e.stopPropagation(); 
     } 
    }; 
})(),false); 

이 코드는 이미지 요소에로드 이벤트 리스너를 바인딩합니다.이 요소는 클로저 변수를 true로 설정합니다. 양식이 제출 될 때 해당 변수가 false 인 경우,로드 이벤트의 콜백도 양식을 제출하도록 변경됩니다.

이것은 좀 더 복잡하지만, 여러분도 알다시피 : 전역이이 문제를 해결할 수있는 유일한 방법은 아닙니다.

그냥 JSLint를 통해 많은 정보를 전달했습니다. 이 코드는 경고 또는 오류없이 전달됩니다.

+0

나에게 질문은 제출하는 동안 추적 이미지를로드하는 방법 인 것 같습니다. 당신의 솔루션은 주어진 이미지가 이미 dom의 일부라고 가정합니다. 나는 이것이 정확하다고 생각하지 않는다. – Yoshi

+0

@Yoshi, 저는 Amaan이 제공 한 답과 질문에 대해 이미 dom의 일부라고 가정합니다 : _ 그러나 src 속성을 통해 이미지를로드하려고 할 때 _. 그러나 이것이 사실이 아니라면, 당신 말이 맞습니다. 그리고 OP는 그의 문제에 대한 가장 쉬운 해결책을 위해 아약스로 바뀌어야합니다. –

+0

@EliasVanOotegem : 좋아요.하지만 다른 제출 이벤트가있을 수 있다고 언급하지 않았습니다. (마지막 편집 참조) 개인적으로 제출 및 전파를 막을 수 없다고 생각합니다. – XaReSx

관련 문제