1

私はこれを実装しています:http://jsfiddle.net/xkfqN/85/

html:

<div id="posts">
    <div class="more">Show More</div>
    <div class="commentsContainer">
        <div class="comment">Comment 1</div>
        <div class="comment">Comment 2</div>
        <div class="comment">Comment 3</div>
        <div class="comment">Comment 4</div>
        <div class="comment">Comment 5</div>
        <div class="comment">Comment 6</div>
        <div class="comment">Comment 7</div>
        <div class="comment">Comment 8</div>
        <div class="comment">Comment 9</div>
        <div class="comment">Comment 10</div>
    </div>
</div>

css:

.comment { 
    display: none;
    border:3px solid whiteSmoke;
    width:280px;
}

.more {
    cursor:pointer

}​

JQuery:

function toggleComment(index, hide) {
    //check the index to make sure it is in range
    if (index > -1 && $('.comment').length > index) {
        //get the comment at the given index and apply the animation
        $('.comment:eq(' + index + ')')
            .slideToggle(18, function() { 
                //if hiding then decrement
                var next = hide ? index + 1 : index - 1;
                //call toggle on the next index
                toggleComment(next , hide);
            });
            //set to display block so they show up on their own line
           // .css('display', 'block'); 
    }
}

$('.more').click(function() {

    //are the comments already open... returns true or false
    var hide = $(this).hasClass('open');

    //default to start at the begining... each click brings the index to 0
    var index = 0;
    //if the comments are not open then start at the end
    if (!hide) {
        index = $('.comment').length - 1
    }

    //toggle the comments
    toggleComment(index, hide);    

    //used to remember state.. adds class to more and takes it away hence toggle class
    $(this).toggleClass('open');
});
​

</ p>

ドロップダウンする予定のコメントは、デフォルトでは表示されず、例のリンクが示すようにcssで非表示になります。これは、すべてのユーザーに対してデフォルトですべてのコメントをロードするのは賢明ではないためです。

これらは、「すべて表示」リンク/送信をクリックしたときにのみロードされます。とにかく、以下のコードでは、私のコメントは、ページにレンダリングされた後、ファイル「show_all_comments」から取得されます。そのファイルには、各コメントをループし、そのhtmlとともにデータを表示するループがあります。

私がやりたいこと:

これをページに表示したくありませんが、実際のページからクラスにアクセスしようとしているかのように、メモリ内でクラスにアクセスできるようになります。このようにして、各コメントクラスにアクセスし、JSFiddleコードで使用できるようになります。

それがあなたにとって理にかなっているなら、これは可能ですか?もしそうなら、私はこれをどのように達成しますか?

JQuery:

 var postContent = $(this).parents('.post_content'),
    commentContainer = postContent.find('.comment_container');

    commentContainer.slice(0, -2).remove();
    postContent.find('.comment_container:first')
    .before("<%= j render 'users/partials/show_all_comments', :comments => @comments %>");
4

1 に答える 1

1

DOM要素を切断して検索したいようです。あなたはそれを非常に簡単に行うことができます:

var elements = $('<div><div class="one">one</div><div class="two">two</div></div>');
var divOne = elements.find('.one');

そこで、他のすべてを含む単一のトップレベルdivで構造を作成し、その周りにjQueryインスタンスをラップしました。要素はDOMになく、DOMから完全に切断されています。次に、などのjQueryメソッドを使用して、必要なfindビットを抽出できます。

抽出したビットを実際にページのどこかに配置したい場合は、おそらく次のようにcloneします。

// Put "one" on the page
elements.find(".one").clone().appendTo(document.body);

しかし、質問に関するJuhanaへのあなたのコメントを見てください:

Juhana:ユーザーが4000件のコメントを含むマイクロポストを持っていると想像してください。ユーザーがそのマイクロポストを含むページに入るたびに、4000件のコメントがすべてデータベースから読み込まれ、非表示になります。ユーザーが[すべて表示]リンクをクリックしなかった場合でも。それは私がやりたいことではありません。そのマイクロポストを表示している1000人のユーザーを想像してみてください。つまり、ユーザーが[すべて表示]をクリックしたかどうかに関係なく、4000個のコメントが読み込まれ、1000回非表示になります。

...追加のコメントはまったくロードしませ(HTMLでもスクリプトでもありません)。代わりに、表示する予定のコメントのみをロードし、ユーザーがクリックした場合に、「more」リンクで残りのコメントのajaxリクエストを起動します。HTMLからスクリプトにそれらを移動するだけでは(もしあれば)多くを得ることができません。

ここに例があります-ライブの例| ソース

HTML:

<div id="commentsContainer">
  <div class="comment">Comment 1</div>
  <div class="comment">Comment 2</div>
  <div class="comment">Comment 3</div>
  <div class="comment">Comment 4</div>
  <div class="comment">Comment 5</div>
  <div class="comment">Comment 6</div>
  <div class="comment">Comment 7</div>
  <div class="comment">Comment 8</div>
  <div class="comment">Comment 9</div>
  <div class="comment">Comment 10</div>
  <div><a href="fallback.php" id="moreComments">more</a></div>
</div>

JavaScript:

jQuery(function($) {

  $("#moreComments").click(function(event) {
    var $this = $(this),
        moreDiv,
        container;

    event.preventDefault();
    moreDiv = $this.parent();
    container = moreDiv.parent();
    $this.replaceWith("<em>Loading...</em>");
    $.ajax({
      method: 'get',
      url:    'http://jsbin.com/ijarov',
      dataType: 'html',
      success: function(data) {
        moreDiv.remove();
        container.append(data);
      }
    });
  });

  function display(msg) {
    $("<p>").html(msg).appendTo(document.body);
  }
});

ajax呼び出しによって返されるもの:

<div class="comment">Comment 11</div>
<div class="comment">Comment 12</div>
<div class="comment">Comment 13</div>
<div class="comment">Comment 14</div>
<div class="comment">Comment 15</div>
<div class="comment">Comment 16</div>
<div class="comment">Comment 17</div>
<div class="comment">Comment 18</div>
<div class="comment">Comment 19</div>
<div class="comment">Comment 20</div>

以下のコメントを再確認してください。

「データ」を追加したくないが、そのファイルのクラスにアクセスするとします。それは可能ですか?

「...クラスにアクセスする...」とはどういう意味かわかりませんが、追加せずに戻ってきた要素を操作する場合は、これの冒頭で行ったように、インスタンス化するだけです。リテラル文字列で答えます。たとえば、ajax成功ハンドラでこれを行います。

var elements = $(data);

divこれは、異なる戻りデータ(要素の組み合わせ、一部はクラスcomment、一部はクラスother)を使用した上記の例です。ここでは、データを追加する前にデータを確認し、コメントのみを追加します。「その他」は追加しません。ライブ例| ソース

HTML:

<div id="commentsContainer">
  <div class="comment">Comment 1</div>
  <div class="comment">Comment 2</div>
  <div class="comment">Comment 3</div>
  <div class="comment">Comment 4</div>
  <div class="comment">Comment 5</div>
  <div class="comment">Comment 6</div>
  <div class="comment">Comment 7</div>
  <div class="comment">Comment 8</div>
  <div class="comment">Comment 9</div>
  <div class="comment">Comment 10</div>
  <div><a href="fallback.php" id="moreComments">more</a></div>
</div>
<hr>

JavaScript (変更のみがsuccess関数にあります)

jQuery(function($) {

  $("#moreComments").click(function(event) {
    var $this = $(this),
        moreDiv,
        container;

    event.preventDefault();
    moreDiv = $this.parent();
    container = moreDiv.parent();
    $this.replaceWith("<em>Loading...</em>");
    $.ajax({
      method: 'get',
      url:    'http://jsbin.com/ijarov/2',
      dataType: 'html',
      success: function(data) {
        var elements = $(data);
        moreDiv.remove();
        display("Number of <code>.comment</code> elements: "+
                elements.filter('.comment').length);
        display("Number of <code>.other</code> elements: "+
                elements.filter('.other').length);
        display("Appending only the <code>.comment</code> ones.");
        elements.filter('.comment').appendTo(container);
      }
    });
  });

  function display(msg) {
    $("<p>").html(msg).appendTo(document.body);
  }
});

ajax呼び出しによって返されたデータ:

<div class="comment">Comment 11</div>
<div class="other">Other 11</div>
<div class="comment">Comment 12</div>
<div class="other">Other 12</div>
<div class="comment">Comment 13</div>
<div class="comment">Comment 14</div>
<div class="comment">Comment 15</div>
<div class="comment">Comment 16</div>
<div class="comment">Comment 17</div>
<div class="comment">Comment 18</div>
<div class="comment">Comment 19</div>
<div class="comment">Comment 20</div>
于 2012-04-20T11:11:23.947 に答える