2009-05-10 7 views
1

jQueryメソッドに機能を追加しようとしています。Javascript関数ラッパーが失敗しますか?

は私がli.s一致する複数の要素があります

$('li.s').appendTo('#target'); 

コードを持っている、と私はそれが正しくてFirebugを使ってつかんだ見ることができます。

appendメソッドはラッパーなしで正常に動作します。しかし、(機能については何も変更しないでください)私のラッパーを持つ:正しいjQueryオブジェクトではなく、それらのすべてを、返されたが、唯一の最初のli.s#targetに追加され

var oldAppend = $.fn.append; 

$.fn.append = function(expr) { 
    return oldAppend.call(this, expr); 
}; 

。どうしてこれなの? oldAppendへのコールで私の他の要素を失うのはどこですか?

+0

あなたはCONSOLE.LOG場合() 'oldAppend.call(this、expr)'を返す直前に 'this'の 'length'プロパティを返します。 :: console.log(this.length); – James

+0

あなたの例では "appendTo"を使用していますが、 "append"をラップしていますか? –

+0

@great_llama、はい、jQuery.appendToはjQuery.appendを呼び出します。 – strager

答えて

0

問題は、あなた(私が)ノートでappendに送信された引数のすべてを渡しているということですappendTo。そのようapplyargumentsを使用します。

var oldAppend = $.fn.append; 

$.fn.append = function() { 
    return oldAppend.apply(this, arguments); 
}; 

$.eachを使用した場合など、すべての機能がargumentsを持っているので、あなたは、これらの引数にアクセスするために、適切な範囲でvar args = argumentsに必要なことを覚えておいてください。)

0

私はこれを確認するためにjQueryのコードに掘り下げていないが、ほとんどの機能は通常this.each(FN)を返す必要があります。

$.fn.append = function(expr) { 
    return this.each(function() { 
     oldAppend.call($(this), expr); 
    }); 
}; 

あなたは私がthisをラップしなければならなかった気付くでしょうがappendメソッドはそれがコンテキストであることを期待しているので、内部関数の内側にjQueryオブジェクトがあります。私はわからないんだけど、あなたは同様thisへの外部参照をラップする必要があるかもしれません:

return $(this).each 
+0

まだ(同じ問題)が失敗します。私はこれを自分で試してみましたが、私が最初に邪魔していないことを確認するためにそれを再実行しました。 – strager

関連する問題