2012-03-31 3 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]을 이미지 onload에 어떻게 전달할 수 있습니까?

나는 기능과 같이 작성하는 경우 :

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

다음 anything 그냥 onload 이벤트에 참조가 될 것입니다.

편집 jsFiddle를 추가합니다 : http://jsfiddle.net/KtJd6/

+0

http://jsfiddle.net/jfriend00/kkXCg/는 당신이 ='VAR를 시도,'대신 that''사용

당신은 여기서 일 볼 수 있습니까? 그래서 당신은'this'에 대한 지역 참조를 가지고 있습니까? –

+0

그래, 내 개체에 var'self = this;'가 있지만 onload에서'self'는'window' 개체를 참조하는 것으로 보입니다. –

+0

더 많은 바이올린 데모가 있습니까? –

답변

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() 및 NOT이 childNode 인덱스를 직접 참조하여 요소를 얻고있다. 이렇게하면 텍스트 노드가있는 위치를 구분하지 않고 대상을 지정하고 수정할 요소를 훨씬 더 강력하게 참조 할 수 있습니다.

+0

'textNode'도'childNode' 참조로 약간의 렌치를 던지고 있습니다 : http : //jsfiddle.net/ebYgg/ –

+0

@ JaredFarrish - 당신은 당신이 무엇을 원하고 HTML이 어떻게 생겼는지에 대해 훨씬 더 구체적이어야합니다. 자신이하는 것처럼 노드 인덱스를 참조하는 것은 일반적으로 특정 요소를 찾는 나쁜 방법입니다. 'childNodes [1]'보다 훨씬 더 안전한 클래스 명이나 무언가를 사용하십시오. – jfriend00

+0

나는 OP가 아니다. 당신은 제가 제기하고있는 것과 같은 문제에 대해 이야기하고 있습니다. ':)'그리고 나는 마크 업에 대해서 추측하고있다. (질문 아래의 나의 코멘트를 보라). 쿼리 선택기가 지원되고 jQuery 또는 Mootools가 사용되지 않는다면, 나는 그 라인을 따라 뭔가를 제안 할 것이다. –