2012-03-31 43 views
0

我正在寫一個庫,它在一個包裝器元素中創建多個元素,並將所有這些及其函數存儲在JavaScript對象中。我試圖避免ID,因爲頁面上可能有多個此對象的實例。我有一個允許用戶更改某些元素的功能,並且我需要幫助瞭解如何添加圖像。如何傳遞元素以將圖像追加到image.onload()函數中

下面是函數:

foo.prototype.rebrand = function(line1, line2, imgUrl){ 
    this.branding.childNodes[1].innerHTML = line1; 
    this.branding.childNodes[2].innerHTML = line2; 
    var brandImage = document.createElement('img'); 
    brandImage.onload = function(){ 
     this.branding.childNodes[0].appendChild(brandImage); 
        //this won't work 
    } 
    brandImage.src = imgUrl; 
} 

你會打電話foo.rebrand('hello', 'world', 'example.png')

不幸的是,.onload函數內部,this將參照圖像元素本身。那麼,我怎麼能通過this.branding.childNodes[0]進入圖像載入?

如果我寫的功能,像這樣:

  brandImage.onload = function(anything){ 
     this.branding.childNodes[0].appendChild(brandImage); 
        //this won't work 
    } 

然後anything將只是給onload事件的引用。

編輯添加的jsfiddle: http://jsfiddle.net/KtJd6/

+0

你試過'VAR是這個=;'和'使用代替that'?所以你有一個本地參考'this'? – 2012-03-31 14:38:51

+0

是的,我有var'self = this;'在我的對象中,但在onload中,'self'似乎指的是'window'對象。 – 2012-03-31 14:39:54

+0

你有更全面的小提琴演示與合作? – 2012-03-31 14:40:47

回答

2

你需要改變你引用特定元素來檢索元素,不是的childNodes的方式。這將使它更加健壯。而且,當你這樣做時,onload處理程序中也不需要參考this

foo.prototype.rebrand = function(line1, line2, imgUrl){ 
    var brandImage = document.createElement('img'); 

    // find child divs 
    var divs = this.branding.getElementsByTagName("div"); 
    divs[0].innerHTML = line1; 
    divs[1].innerHTML = line2; 

    brandImage.onload = function(){ 
     divs[0].appendChild(brandImage); 
    }; 
    brandImage.src = imgUrl; 
}; 

。注意,我越來越有getElementsByTagName()和不是指直接childNode索引元素。這使得它對文本節點的位置不敏感,並且更加可靠地引用要定位和修改的元素。

你可以看到它在這裏工作:http://jsfiddle.net/jfriend00/kkXCg/

+0

'textNode'也在用'childNode'引用向它引入一個小小的扳手:http ://jsfiddle.net/ebYgg/ – 2012-03-31 14:51:21

+0

@JaredFarrish - 你必須對你想要的幫助以及你的HTML看起來更加具體。像你在做的引用節點索引通常是一個壞的方法來找到一個特定的元素。使用classnames或者比'childNodes [1]'更簡單的東西'。 – jfriend00 2012-03-31 14:53:32

+0

我不是OP;你在談論我提出的同樣的問題。 ':)'我正在猜測這個標記(請參閱我的評論下面的問題)。如果支持查詢選擇器並且不使用jQuery或Mootools,那麼我會在這些行上提供一些建議。 – 2012-03-31 14:55:20