2012-03-31 1 views
0

Я пишу библиотеку, которая создает несколько элементов внутри элемента оболочки и сохраняет все это и свои функции внутри объекта JavaScript. Я пытаюсь избежать идентификаторов, поскольку на странице могут быть несколько экземпляров этого объекта. У меня есть функция, позволяющая пользователю изменять некоторые элементы, и мне нужна помощь в том, как добавить изображение.Как передать элемент для добавления изображения в функцию 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

Вы пробовали 'вар, что = это;' и использовать 'that' вместо этого? Итак, у вас есть локальная ссылка на 'this'? –

+0

Да, у меня есть var 'self = this;' в моем объекте, но в onload, 'self', похоже, ссылается на объект' window'. –

+0

У вас есть более полная демонстрационная скрипка для работы? –

ответ

2

Вы должны изменить способ вы ссылающийся конкретные элементы для извлечения элементов, а не ChildNodes. Это сделает его намного более надежным. И, когда вы это сделаете, вам не понадобится ссылка this в обработчике onload.

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''s также бросает в него небольшой ключ с ссылками' childNode': http : //jsfiddle.net/ebYgg/ –

+0

@JaredFarrish - вам нужно быть более конкретным относительно того, с чем вам нужна помощь, и как выглядит ваш HTML. Ссылка на индексы узлов, как вы делаете, обычно является методом BAD, чтобы найти определенный элемент. Используйте классные имена или что-то гораздо более надежное, чем 'childNodes [1]'. – jfriend00

+0

Я не ОП; вы говорите о той же проблеме, которую я воспитываю. ':)' И я догадываюсь о разметке (см. Мой комментарий ниже вопроса). Если селектора запросов поддерживаются, а jQuery или Mootools не используются, я бы предложил что-то в этих строках. –