2012-09-03 28 views
4

我有問題,在onSubmit事件的form如何才能延遲「onsubmit」事件,直到加載某個東西?

我使用javascript image元素(參數在GET)中發送一些跟蹤信息到另一個網頁。

但是,當我嘗試加載image(通過src屬性)時,頁面比請求image發生(或立即中止)更快地刷新。

這樣,沒有信息發送到外部跟蹤頁面。如何在submit處理程序中等待loadimage

編輯: 有一點我錯過了,其他的事件可以在同一個地方(例如,驗證等)

+2

使用同步[xhr](https://developer.mozilla.org/ EN-US /文檔/ 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

恐怕這只是cancell提交事件。並會強制用戶點擊兩次提交按鈕 –

+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); 

該代碼將一個加載事件偵聽器綁定到您的image元素,該元素將閉包變量設置爲true。如果在提交表單時該變量爲false,則更改加載事件的回調以提交表單。

我會承認這有點複雜,但您知道:全局變量不是解決這個問題的唯一方法。

剛剛通過JSLint也通過了很多。一些微小的調整和「容忍凌亂的空白」和「asume瀏覽器」這個代碼通過沒有任何警告或錯誤

+0

對我來說,問題似乎是:如何在提交時加載跟蹤圖像。你的解決方案假定給定的圖像已經是dom的一部分。我不認爲這是正確的。 – Yoshi

+0

@Yoshi,我有點認爲它是dom的一部分,因爲Amaan提供的答案和問題:_But當我嘗試加載該圖像(通過src屬性)_。但是,如果情況並非如此,那麼你是對的,當然,OP應該轉向ajax以解決他的問題。 –

+0

@EliasVanOotegem:很好,但我沒有提到可以有其他提交事件(請參閱我的上次編輯),所以我個人認爲我無法阻止提交和傳播。 – XaReSx