2016-04-16 3 views
2

ボタン(OpenMessageButton)のように機能するdivを動的に作成しています。jQuery .on( 'click')を使用して複数のhtml要素を独立して制御する

これらのdivはメッセージのテンプレートであり、クエリに基づいてさまざまな情報が入力されますが、html要素自体は、使用するhtmlクラスを含めて同一です。

私はメッセージを読み取るための引き出しの影響下にスライドを表示したいが、私はそれが私が

のボタンをクリックした特定のメッセージとは対照的に、すべてのメッセージのためのトリガーとして、この効果をトリガーしようとすると問題があります私はこの質問で検索しましたし、私が見つけた最寄のはこれです:私はトリガするために使用していたdiv

<?php 
      while($row = mysql_fetch_assoc($myMessages)) 
      { 
      ?> 

    <!-- First Div to be clicked --> 
    <div class="OpenMessageButton">Click to Open/Close</div> 

    <!-- Div to be shown when OpenMessageButton is clicked --> 
    <div class="panel panel-default messageContent" style="display:none;"> 
     <div class="panel-body"> 
     <h4 class="card-title">Message: </h4> 
     <p class="card-text">Text.</p> 
     <div class="OpenMessageButton">Open</div> 
     </div> 

    </div> 

    <!-- Second Div to be clicked --> 
    <div class="OpenMessageButton">Click to Open/Close</div> 

    <!-- Div to be shown when OpenMessageButton is clicked --> 
    <div class="panel panel-default messageContent" style="display:none;"> 
     <div class="panel-body"> 
     <h4 class="card-title">Message: </h4> 
     <p class="card-text">Text.</p> 
     <div class="OpenMessageButton">Open</div> 
     </div> 

    </div> 

    <!-- Third Div to be clicked --> 
    <div class="OpenMessageButton">Click to Open/Close</div> 

    <!-- Div to be shown when OpenMessageButton is clicked --> 
    <div class="panel panel-default messageContent" style="display:none;"> 
     <div class="panel-body"> 
     <h4 class="card-title">Message: </h4> 
     <p class="card-text">Text.</p> 
     <div class="OpenMessageButton">Open</div> 
     </div> 

</div> 

jQueryのため jQuery $(".class").click(); - multiple elements, click event once

コードは次のとおりです。

$('.OpenMessageButton').on('click',function(){ 
     var link = $(this);  
     $('.panel.panel-default.messageContent').slideToggle('fast', function(){ 
     if ($(this).is(':visible')){ 
      link.text('Close');      
     }else{ 
      link.text('Open');      
     } 
     });   
    }); 

ボタンの識別子は、ボタンのいずれかがクリックされたときにトリガまだjQueryの望まれないすべてのdivをトリガしますOpenMessageButtonあります。私はボタンがクリックされたときにそのトップdivに関連するdivだけが表示される方法を理解したいと思います。

フィドルhttps://jsfiddle.net/rasa56j8/

を参照してください - UPDATE - (私が提案答えが働いて得るのに苦労していますので、私は、私は完全を期すため、完全なページをポストだろうと思った)

<?php 
require 'core/database/db_connect.php'; //DB Connection 
require 'get_inbox_messages.php'; //Retrieves inbox msgs from db 
require 'getprofile.php'; //Get Profile 
?> 

    <!DOCTYPE html> 
    <html lang="en"> 
     <head> 
     <meta charset="utf-8"> 
     <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
     <meta name="viewport" content="width=device-width, initial- scale=1"> 

     <title>BlackBook Profile</title> 

     <!-- Bootstrap core CSS --> 
     <link href="css/bootstrap.min.css" rel="stylesheet"> 
     <!-- Bootstrap theme --> 
     <link href="css/bootstrap-theme.min.css" rel="stylesheet"> 
     <!-- Custom styles for this template --> 
     <link href="css/signin.css" rel="stylesheet"> 
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
     </head> 

     <body role="document"> 

     <!-- Fixed navbar --> 
     <nav class="navbar navbar-inverse navbar-fixed-top"> 
      <div class="container"> 
      <div class="navbar-header"> 
       <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> 
       <span class="sr-only">Toggle navigation</span> 
       <span class="icon-bar"></span> 
       <span class="icon-bar"></span> 
       <span class="icon-bar"></span> 
       </button> 
       <a class="navbar-brand image" href="profile.php" ><img src="Graphics/topLogo3.png" alt="BookLove"></a> 
       <a class="navbar-brand" href="#">LoveBook</a> 
      </div> 
      <div id="navbar" class="navbar-collapse collapse"> 
       <ul class="nav navbar-nav navbar-right"> 
       <li ><a href="profile.php">Profile</a></li> 

       <li class="dropdown"> 
       <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Messages<span class="caret"></span></a> 
       <ul class="dropdown-menu"> 
       <li><a href="message_inbox.php">Inbox</a></li> 
       <li><a href="sent_messages.php">Sent Messages</a></li>    
       </ul> 
       </li> 

       <li role="presentation"><a href="matched_users_output.php">Matches 
       <?php 
       $result = mysql_fetch_array($NewMatchesResult); 

       if ($result[0][0] != 0) { 
        echo '<span class=badge>'; 
        echo $result[0][0];  
        echo '</span>'; 
       }               
       ?> 
       </a></li> 
       <li ><a href="browse.php">Browse</a></li> 

       <li class="dropdown"> 
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Options <span class="caret"></span></a> 
        <ul class="dropdown-menu"> 
        <li><a href="changeprofilepic.html">Change Profile Pic </a></li> 
        <li><a href="payment.html">Payment Details</a></li> 
        <li><a href="populate_questions.php">Update Interests</a></li> 
        <li role="separator" class="divider"></li> 
        <li class="dropdown-header"></li> 
        <li><a href="cancel.html">Cancel Account</a></li> 
        <li><a href="signin.html">Logout</a></li> 
        </ul> 
       </li> 
       </ul> 
      </div><!--/.nav-collapse --> 
      </div> 
     </nav> 

     <div class="container theme-showcase" role="main"> 

      <div class="page-header" > 
      <h1> 
      <?php $username = mysql_fetch_assoc($usernameResult); 
      echo $username['username']. '\'s';?> Inbox</h1>        
      </div> 


      <?php 
      while($row = mysql_fetch_assoc($myMessages)) 
      {  
      $subject = $row['subject']; 
      $content = $row['content']; 
      $recipientID = $row['recipient_id']; 
      ?> 

      <!-- Message Div --> 
      <div class="row"> 
      <div class="col-md-12"><div class="card card-block messages">  
      <h4 class="card-title"><em>Subject: <?php echo $subject; ?></em></h4> 
      <h4 class="card-title">From:  
      <?php 
      echo $row['member_id'];  
      $from = mysql_query("SELECT username FROM members WHERE member_id = '$recipientID'"); 
      while($row = mysql_fetch_assoc($from)) {   
       echo $row['username']; } 
      ?></h4> 
      <!-- <p class="card-text">MESSAGE CONTENT.</p> --> 
      <div class="OpenMessageButton">Open</div> 
      <div class="ReplyMessageButton">Reply</div> 
      <div class="MarkAsReadButton">Mark as Read</div> 
      <div class="DeleteMessageButton">Delete</div> 
     </div> 
     </div> 
     </div> 
     <!-- Opened Message Div --> 
     <div class="panel panel-default messageContent"> 
     <div class="panel-body"> 
     <h4 class="card-title">Message: </h4> 
     <p class="card-text"><?php echo $content; ?>.</p> 
     </div> 
    </div> 
     <?php 
      } 
     ?> 

     <script> 

     $('.OpenMessageButton').on('click',function(){ 
      var link = $(this);  
      $('.messageContent').slideToggle('fast', function(){ 
      if ($(this).is(':visible')){ 
       link.text('Close');      
      }else{ 
       link.text('Open');      
      } 
      });   
     }); 


     // $('.OpenMessageButton').on('click',function(){ 
     //  var link = $(this);  
     //  $('.panel').slideToggle('fast', function(){ 
     //  if ($(this).is(':visible')){ 
     //   link.text('Close');      
     //  }else{ 
     //   link.text('Open');      
     //  } 
     //  });   
     // }); 
     </script> 


     <!-- Bootstrap core JavaScript 
     ================================================== --> 
     <!-- Placed at the end of the document so the pages load faster --> 
     <!-- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> --> 
     <script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script> 
     <script src="js/bootstrap.min.js"></script> 
     <script src="js/docs.min.js"></script> 
     </body> 
    </html> 
+0

私は私がこれまで私が持っている – roryjmaher

答えて

2

この行は、問題:

$('.panel.panel-default.messageContent') .... 

現在地すべてマッサージを一致させます。あなたは、クリックされたボタンに属するメッセージだけを照合する方法を見つけなければなりません。

解決策の一つは次のように追加のコンテナとすべてのボタン+メッセージをラップすることができ

<div class="MessageContainer"> <!--added this container --> 
    <!-- First Div to be clicked --> 
    <div class="OpenMessageButton">Click to Open/Close</div> 

    <!-- Div to be shown when OpenMessageButton is clicked --> 
    <div class="panel panel-default messageContent" style="display:none;"> 
     <div class="panel-body"> 
     <h4 class="card-title">Message: </h4> 
     <p class="card-text">Text.</p> 
     <div class="OpenMessageButton">Open</div> 
     </div> 

    </div> 
</div> 

そしてあなたは、この変更することができます。これに

$('.panel.panel-default.messageContent') 

link.closest('.MessageContainer').find('.panel.panel-default.messageContent') 

ここでの動作例

https://jsfiddle.net/rasa56j8/2/

+0

作業推奨的回答を得ることができない何らかの理由で、ちょうど完全にするために、メインのコードブロックを掲載します私のOpenMessageButtonは私が上に表示されますが、これは私にとってはうまくいかないようです。 – roryjmaher

+1

私の例の 'div.MessageContainer'は**ボタンとメッセージの両方をラップして動作させるべきです。 –

+0

あなたは正しいです、なぜ私は最初の試みでそれが私のためにはうまくいかないのか分かりませんが、今はそれです。親切にありがとう! – roryjmaher

0

各オープン/クローズリンクをそれぞれのdivに何らかの形で関連付ける必要があります。 div idsとjQueryを使用して、これを行う1つの方法があります。データ(JSで続い)

<!-- Third Div to be clicked --> 
<div class="OpenMessageButton" data-control="message3">Click to Open/Close</div> 

<!-- Div to be shown when OpenMessageButton is clicked --> 
<div id="message3" class="panel panel-default messageContent" style="display:none;"> 
    <div class="panel-body"> 
    <h4 class="card-title">Message: </h4> 
    <p class="card-text">Text.</p> 
    <div class="OpenMessageButton">Open</div> 
    </div> 

$(document.body).on('click', '.OpenMessageButton', function(){ 
     var link = $(this); 
     var div_id = $(this).data('control');  
     $(div_id).slideToggle('fast', function(){ 
     if ($(this).is(':visible')){ 
      link.text('Close');      
     }else{ 
      link.text('Open');      
     } 
     });   
    }); 
+0

data-control = "message3"がダイナミックに作成されたすべてのdivで本質的に同じであるため、以前と同じような問題がありますか? – roryjmaher

+1

右のように、PHPのwhileループでdivを作成しても動的に作成するにしても、divはすべて動作するためには一意のIDが必要です。また、動的に追加されたdivを処理するためにリスナーを書き直します。 – larsAnders

0

それだけで次の要素(あなたのケースでは、クラスとdiv要素「パネル」)を選択したので、あなたは、代わりにjQueryのメソッドnext()を使用する必要がありますすべてのパネルの代わりに

だからあなたのJSコードをに変更します。あなたはjQueryのイベント・ソース用に切り替えるしようとしているので、変更するべき

$('.OpenMessageButton').click(function(){ 
     var link = $(this);  
     link.next().slideToggle('fast', function(){ 
     if ($(this).is(':visible')){ 
      link.text('Close');      
     }else{ 
      link.text('Open');      
     } 
     });   
    }); 
+0

ターゲットのdivが技術的にリストの次のdivではなく、おそらく第3または第4のdiv .OpenMessageButtonの後にあるので、.next()がうまくいくかどうか分かりません – roryjmaher

0

$('.panel.panel-default.messageContent').slideToggle('fast', function(){ 

$(this).slideToggle('fast', function(){ 

jQuery docさんのコメント:

jQueryがハンドラを呼び出すとき、thisキーワードは、イベントが配信されている 要素への参照です。直接バインドされたイベントの場合 これはイベントがアタッチされた要素であり、委任された場合は イベントです。これは要素マッチングセレクタです。 ( は、イベントが子孫 要素からバブリングされた場合、event.targetと等しくないことに注意してください。) をjQueryメソッドで使用できるように要素からjQueryオブジェクトを作成するには、$(this)を使用します。

私は、関数の実装方法の異なる視点を取った:

$('.OpenMessageButton').on('click', function() { 
    var link = $(this); 

    // If sub-text is already visible 
    if (link.next().is(':visible')) { 
    // Reset the link text 
    link.text('Open'); 
    // Hide the sub-text 
    link.next().hide(); 
    } else { 
    // Reset the link text 
    link.text('Close'); 
    // Show the sub-text 
    link.next().slideToggle('fast', function(){ }); 
    } 
}); 
+0

これは意味があるので、私の例ではありません。より多くの文脈を与えるために上記のコードを更新しました。 – roryjmaher

関連する問題