2012-03-31 6 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; 
} 

あなたは残念ながら、.onload関数の内部で、thisは、画像要素そのものを指しますfoo.rebrand('hello', 'world', 'example.png')

を呼び出します。ですから、どうすれば画像のロードにthis.branding.childNodes[0]を渡すことができますか?

私はそうのような機能を記述する場合:

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

そしてanythingはちょうどonloadイベントへの参照になります。

編集jsFiddleを追加する:あなたは、あなたが要素、ないのchildNodesを取得するために、特定の要素を参照する方法を変更する必要が http://jsfiddle.net/KtJd6/

+0

http://jsfiddle.net/jfriend00/kkXCg/は、あなたがこれを= 'VARを試してみました;'し、代わりにthat' '使用:

あなたは、それはここで働いて見ることができますか?だからあなたは 'this'へのローカルリファレンスを持っていますか? –

+0

私はvar 'self = this;'をオブジェクトに持っていますが、onloadでは、 'self'は' window'オブジェクトを参照しているようです。 –

+0

もっとフィデリックなフィドルデモがありますか? –

答えて

2

。これにより、より堅牢になります。そして、あなたがそうするときには、参照thisonloadハンドラに必要ないでしょう。

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インデックスを指示するために参照するじゃないことに注意してください。これは、テキストノードがどこにあるかに影響されず、ターゲットとしたい要素を参照するロバストな方法です。

+0

'textNode'は' childNode'参照でわずかなレンチを投げています:http ://jsfiddle.net/ebYgg/ –

+0

@JaredFarrish - あなたは、あなたが何を助けたいか、あなたのHTMLがどのように見えるかについて、より具体的にする必要があります。あなたが行っているようなノードインデックスの参照は、通常、特定の要素を見つけるための悪い方法です。 'childNodes [1]'よりも格段に安全なクラス名や何かを使用してください。 – jfriend00

+0

私はOPではありません。あなたは私が育てているのと同じ問題について話している。 ':)'そして、私はマークアップについて推測しています(質問の下の私のコメントを見てください)。クエリセレクタがサポートされていてjQueryまたはMootoolsが使用されていない場合は、これらの行に沿って何かを提案します。 –

関連する問題