0

コードの最初の部分は次のとおりです。

$('ul li').click(function(){ //when an <li> is clicked

    $('ul .clicked').removeClass('clicked'); // remove .clicked class from any other <li>'s inside a <ul>
    $(this).addClass('clicked'); // add .clicked class to the clicked <li> ($(this))

    screen = $(this).attr('id'); // screen = the clicked elements' id
    screen = "#" + screen; // screen = the clicked elements' id with a # infront of it 
    $(screen).screenSlide(); // is basically = $('#elementsID').screenSlide();, correct?
});

私が書いた以前の関数では、セレクターとして画面を渡す代わりに、最後のステップを除いてまったく同じことをしたので、奇妙ですそれをセレクターとして使用すると、機能しました。しかし、先に進むと、screenSlide は

function screenSlide(){ // $(this) should = an <li> who's id is screen
    var test = $(this).attr('class');
    alert(test);
    $(this).addClass('current'); // add the .current class to $(this), which should be an <li>
    $(this).slideDown();
};

今、アラート テストは何も警告しなかったので、CSS セレクターとしての画面の受け渡しがうまくいかなかったと推測しています。ご覧のとおり、screenSlide 関数は $(this) < li > にクラスを追加してからスライドアップすることになっています。

何が問題なのですか?

4

2 に答える 2

2

あなたが定義した方法screenSlideは単なる関数であり、jquery オブジェクトに添付されていません。jquery オブジェクトの関数として呼び出されるようにするには、それを として追加する必要があります$.fn.screenSlide

$.fn.screenSlide = function(){
    var test =this.attr('class');
    alert(test);
    this.addClass('current'); // add the .current class to $(this), which should be an <li>
    this.slideDown();
    return this; //return this to enable chaining
}

この関数内では、jquery オブジェクトを $(this) として再定義する必要はありません。これは、既に jquery オブジェクトになっているためです。またthis、チェーンを有効にするために戻ります。

個別に呼び出したい場合は、function.callを使用できます

screenSlide.call($(this));

これthisもjqueryオブジェクトであり$(this)、関数内でもう一度やり直す必要はありません。

ちなみに、$(this).screenSlide();IDを複製していない限り、それを呼び出す必要があるようです。その場合、とにかく期待どおりに動作しません。

デモ

于 2013-10-10T02:29:51.757 に答える
1

$(screen).screenSlide();はjQuery ラッパー オブジェクトに関連付けられたメソッドではないscreenSlideため、オブジェクトのようなメソッドは存在しないというエラーがスローされます。そのためのプラグインとしてscreenSlide書く必要がありますscreenSlide

$.fn.screenSlide = function(){
    var test = this.attr('class');
    alert(test);
    this.addClass('current'); // add the .current class to $(this), which should be an <li>
    this.slideDown();
}

screenSlideまたは、次のようなカスタムコンテキストで呼び出します

screenSlide.call($(screen))
于 2013-10-10T02:29:17.367 に答える