2012-07-17 26 views
1

我想要做一件簡單的事情:我有一堆正在通過JS加載的圖像。 我將一個事件監聽器附加到加載事件上,並且在加載Image之後,在監聽器函數中,我想要調用Image並從中檢索屬性。 這裏是我的代碼,簡化:從attachEvent獲取事件的調用者

function loadImages() { 
    for (var i = 0; i < arrDownloadQueueBasic.length; i++) { 
       var path = arrDownloadQueueBasic[i].path; 

       var img = new Image(); 
       img.type = arrDownloadQueueBasic[i].type; 
       img.attachEvent(img, 'load', setBasicElement); 
       img.src = path; 
      } 
    } 

function setBasicElement(e) { 
     var caller = e.target || e.srcElement; 
     alert(caller); // THIS DOESNT WORK - RETURN NULL 
     alert(caller.type) // OF COURSE THIS DOESNT WORK AS WELL... 
    } 

回答

0

有一對夫婦,你需要正確的事情。首先,attachEvent方法不應該用於IE以外的瀏覽器。你應該構造代碼,以檢查方法的實現,然後採取相應的行動,像這樣:

if(img.addEventListener) { 
    img.addEventListener('load', setBasicElement, false); 
} 
else if(img.attachEvent) { 
    img.attachEvent('onload', setBasicElement); 
} 
else { 
    img.onload = setBasicElement; 
} 

的另一個問題是,你使用的attachEvent時需要的前綴事件名稱「上」。

編輯

你可以通過使用setBasicElement功能如下代碼來電:

var caller = e.target || e.srcElement || window.event.target || window.event.srcElement; 

這裏是一個工作的例子 - http://jsfiddle.net/BMsXR/3/

+0

謝謝,實際上我正在做所有這些......我想簡化代碼,以便專注於這個問題,並忘記在編寫代碼時寫上「on」。無論如何,我的問題仍然存在...... – Light 2012-07-17 14:50:42

+0

這是否可以在任何瀏覽器中使用? – tjscience 2012-07-17 14:57:43

0

試試這個:

var caller = window.event ? window.event.srcElement : e.target; 

如果我沒有記錯,當你使用attachEvent()時,IE不會將事件對象作爲參數傳遞,但它具有全局的event對象。

+0

它應該是':'而不是'||' ?無論如何,這也在IE中返回null ... – Light 2012-07-17 15:11:26

+0

對不起,是的,它應該是一個':'。 – nnnnnn 2012-07-17 21:47:25

+0

在IE中仍然返回null – Light 2012-07-18 07:47:47