2016-05-25 41 views
1

私はこの単純な関数をいくつかのhtmlをコピーし、別のdivに配置します。 私は関数のコードをclickイベントに入れてもうまく動作しますが、複数の場所で使用する関数に移動すると機能しません。 これはなぜですか?

I console.log($(this));関数ではウィンドウ要素を返します。 http://codepen.io/ashconnolly/pen/ebe7a5a45f2c5bbe58734411b03e180e

私は別の方法で$(this)を参照する必要があります - ?ここcodepen

function addHTMLtoComponent() { 
     var wrapper = $(this).closest(".wrapper"); 
     var component = $(wrapper).find(".component"); 
     var componentCodeHolder = $(wrapper).find('.target'); 

     $(componentCodeHolder).text(component.html()) 
     //console.log($(this)); 
} 

$(".js_show_html").click(function() { 
    addHTMLtoComponent(); 
}); 

+2

あなたの関数に '' $(この)合格する必要があります'addHTMLtoComponent($(this)) 'で呼び出す – TAGraves

+1

関数は呼び出し元が誰であるかを知らないので、' this'が誰を指しているのかわからないので、それをパラメータとして渡す必要があります – ochi

+1

また、 'this'がなぜそれを行うのかについての詳細はhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/thisを見てください。 – TAGraves

答えて

3

あなたは関数を呼び出したため、手動では、したがって、それはウィンドウオブジェクトを使用するように戻す、「この」文脈を知りません。

$(".js_show_html").click(function() { 
    addHTMLtoComponent(); 
}); 

// Change to this 

$(".js_show_html").click(function() { 
    addHTMLtoComponent.call(this); 
}); 

参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

+0

素晴らしい!ありがとう! :D – Ash

3

thisは、click()のイベントはクリックされた要素です。関数の文脈では、addHTMLtoComponentthisは、もはやクリックされた要素への参照ではありません。

クリックしたオブジェクトを関数に渡して、オブジェクト参照を維持してみてください。


function addHTMLtoComponent ($obj) { 
    var $wrapper = $obj.closest(".wrapper"); 
    var $component = $wrapper.find(".component"); 
    var $componentCodeHolder = $wrapper.find('.target'); 
    $componentCodeHolder.text($component.html()); 
} 

$(".js_show_html").click(function() { 
    addHTMLtoComponent($(this)); 
}); 
+0

これは質問に答えますが、 'addHTMLtoComponent'は' this'の値で呼び出されるべきではありませんか?例えば盲目的にjQueryオブジェクトを渡すのではなく、 'addHTMLtoComponent.call(this);' –

+0

@DavidBarker関数が常にjQueryオブジェクトを受け入れるように記述されていて、そのように文書化されている場合、それを渡すのはなぜですか? –

+1

私はDavidに同意する必要があります。 '$(this) 'の代わりに' this'を使う利点は、*と* jQueryオブジェクト(http://api.jquery.com/jQuery/)の両方を含む、jQueryコンストラクタがサポートするすべてのものをサポートすることです。 – cyberbit

0

あなたはこの関数のパラメータとしての要素を渡す必要があります。 例:他の回答について

<div onclick="addHTMLtoComponent ($(this))"></div> 
+0

文脈の設定と違っていても間違っていても構いません。 –

+0

間違いではありませんが、インライン部分は本当に恐ろしいです! –

6

、私は最も簡単なものを置く必要があります:あなたが考えることができ

$(".js_show_html").click(addHTMLtoComponent); 
+0

面白い! 'this'を吸収するラッパー関数がないので、これは機能しますか? – cyberbit

+2

@cyberbit jQueryは 'this'がイベントに関わる要素を参照するように手配します。 – Pointy

+2

@ Pointyそうですね、私は、OPのソリューションに別の関数で 'addHTMLtoComponent'がラップされていることを指摘していたので、コンテキストが上書きされました。最も簡単な解決策のためにUpvoted。 – cyberbit

0

ことの一つはaddHTMLtoComponent()は、jQueryの機能自体に作ることができるということです。

$.fn.addHTMLtoComponent = function() { 
    return this.each(function() { 
     var wrapper = $(this).closest(".wrapper"); 
     var component = $(wrapper).find(".component"); 
     var componentCodeHolder = $(wrapper).find('.target'); 

     componentCodeHolder.text(component.html()) 
    }); 
} 

他のjQueryメソッドと同じように呼び出すことができます。

$(".js_show_html").click(function() { 
    $(this).addHTMLtoComponent(); 
}); 

jQueryメソッド内のthisの値はjQueryオブジェクト自体であるため、$()で再ラップする必要はありません。規約(およびそれが意味をなされるとき)によって、jQueryメソッドはルートオブジェクトによって参照されるすべての要素で動作し、さらにチェーンされた操作のためにそのオブジェクトを返します。それが外側のreturn this.each()の構造です。

.each()コールバックの中には、典型的なjQueryコールバック状況があります。thisが外側のjQueryオブジェクトの各メンバーに順番に設定されています。

+0

なぜそれのためだけにfn空間を汚染するのですか? –

+2

@DuD。何故なの?それは神聖なものではなく、何かではなく、メソッド名にかなり注意が払われる限り、衝突はあまりありません。これがアプリケーションの重要な機能である場合は、悪い考えではありません。もちろん、それは意見の問題です。フラットなjQueryメソッドの名前空間に*存在することは間違いありません。 – Pointy

0

特殊キーワードthisは、関数を単独で呼び出すと、windowオブジェクト(これはあなたが観察したものです)です。``関数addHTMLtoComponent($この){}、:あなたが必要とする動作については、単に適切なコンテキストをロードする関数にパラメータを追加します。

function addHTMLtoComponent(context) { 
    var wrapper = $(context).closest(".wrapper"); 
    var component = $(wrapper).find(".component"); 
    var componentCodeHolder = $(wrapper).find('.target'); 

    $(componentCodeHolder).text(component.html()) 
    //console.log($(context)); 
} 

$(".js_show_html").click(function() { 
    addHTMLtoComponent(this); 
}); 
関連する問題