6

他の投稿を見て、コードに live() と on() を追加しようとしましたが、クリック機能は一度しか機能せず、それ以降は機能しません。誰かが私が間違っていることを指摘できますか。これが私の最新のコードです:

<script language="javascript">
//Used to delete a step from the database after confirming with user
$(document).ready(function(){
    $("#success_message2").hide();
    $(".delete_it").on('click',function() {
    var answer = confirm('Are you sure you want to delete this step?');
    if (answer){
          var data = {
              'hospid': '<? echo $hospid; ?>',
              "step_id" : $(this).parent().attr("name")
              }; 
        $.post("../php/progress_steps_delete.php",
                data,
                function (data) {
                    if (data.success) {
                        $("#success_message2").show('slow');
                        setTimeout(function () {
                            $("#success_message2").hide('slow');
                        }, 5000);
                        $('#step_list').html(data.success);
                    } else {
                        alert('not done');
                        $("#non-grid").prepend(data.error);
                    }
                }, "json");
    }
});
});
</script>

すみません、htmlはこちら

<body>
<div id="body-wrapper">
  <?php include_once(getBasePath()."site_hospital_files/elements/navbar.php"); ?>
  <div id="main-content">
    <div class="content-box">
      <div class="content-box-header">
        <h3>Progress Steps</h3>
      </div>
      <div class="content-box-content">
        <div class="msg-status div_message" id="success_message">New step added successfully!</div>
        <div class="msg-status div_message" id="success_message1">New List Order Updated!</div>
        <div class="msg-status div_message" id="success_message2">Step Deleted!</div>
        <div id="non-grid">
          <form method="post" name="upload_form" id="upload_form">
            <fieldset style="height:100px;  margin-left:25px; margin-top:15px; background-color:#FFF;">
              <legend style="padding:2px;">Add a Step</legend>
              <div class="column-left" style="width:50%;">
                <label class="space">Step Name</label>
                <input class="text-input tall-input required alnum" type="text" id="step_add" name="step_add" style="width:90%;"/>
              </div>
              <div class="column-left" style="width:20%; padding-top:25px;">
                <input type="hidden" name="hosp" id="hosp" value="<? echo $hospid; ?>"/>
                <input type="submit" id="snd_upload" name="snd_upload" value="Submit Step" class='button'  />
              </div>
            </fieldset>
          </form>
          <form name="delete_form" method="post" id="delete_form">
            <fieldset style="height:100%;  margin-left:25px; margin-top:15px; background-color:#FFF;">
              <legend style="padding:2px;">List of Steps</legend>
              <h3>Drag and Drop to Change Step Order</h3>
              <input type="hidden" name="hosp" id="hosp" value="<? echo $hospid; ?>"/>
              <div id="step_list">
              <? echo $step_list ?>
              </div>
            </fieldset>
          </form>
        </div>
      </div>
    </div>
    <div class="clear"></div>
    <div id="footer">&#169; Copyright 2012  Inc. | <a href="#">Top</a></div>
  </div>
</div>
</body>

わかりました、2番目の編集、私はここで問題を理解し始めていると思います. これが私のリストを生成しているphpです。クリックしている要素はコンテナに埋め込まれています。コンテナ全体をクリックするのではなく、内部の画像だけをクリックします。それは可能ですか?これまでのすべてのアドバイスに感謝します。勉強中です....

function getSteps($dbh, $hospid)
{
    $sql1 = $dbh->prepare('
    SELECT COUNT(*) 
    FROM progress_steps
    WHERE hospital_id = :hospid
    ');
    $sql1->bindValue('hospid', $hospid);
    $sql1->execute();   
    $num_rows = $sql1->fetchcolumn();

    $sql = $dbh->prepare('
    SELECT * 
    FROM progress_steps
    WHERE hospital_id = :hospid
    ORDER BY step_number
    ');
    $sql->bindValue('hospid', $hospid);
    $sql->execute();
    if ($num_rows > 0) {
        $steps_table = '';
        $isOdd           = true;
        while (($row = $sql->fetch(PDO::FETCH_ASSOC)) !== false) {
            $steps_table .= "<div class='hover_hand' name='$row[step_id]' id='item_$row[step_id]'><div style='float:left' class='delete_it'><img src='../images/delete_icon.gif'></div> <div style='float:left' class='middle_text'>&nbsp;&nbsp;&nbsp;&nbsp;$row[step_name]</div><input type='hidden' name='itemid[]' value='$row[step_id]'/></div>";
        };
     } else {
        $steps_table = '';
            $steps_table .= "<div>You need to add steps.</div>";
    };
    return $steps_table;
}
4

3 に答える 3

19

私は(あなたのコードで).delete_itアイテムが#step_list要素の中にあると仮定しています。

したがって、html を ajax の結果に置き換えると、バインドされたハンドラーも削除されます。

ハンドラーを、削除されない DOM 階層内の要素 (たとえば、#step_listそれ自体) にバインドする必要があります。

したがって、バインディングを次のように変更します

$(".delete_it").on('click',function() {

$("#step_list").on('click','.delete_it', function() {
于 2012-12-02T18:09:32.883 に答える
3

ここからだと見えにくいです。HTMLを共有していただけませんか?data.success に何が含まれているかを知らなくても、簡単にはなりません。.html(data.success) は削除ボタンに何らかの影響を与えますか?

.live() を正しく実行したと確信していますか?

$('.delete_it').live("click",function(){

});

詳しく教えていただけると助かります。

于 2012-12-02T18:02:22.393 に答える
2

イベントは DOM ノードにバインドされます。バインドしている DOM が削除されると、関連するイベントも削除される可能性があります。これを修正するか、DOM イベントの「バブルアップ」の性質を利用することができます。たとえば、私の HTML が次のようになっているとします。

<div id="container">
  <div class="item delete_me_on_click"></div>
  <div class="item delete_me_on_click"></div>
  <div class="item delete_me_on_click"></div>
</div>

私ができることは、#containeror にバインドしdocumentてクリック イベントをリッスンし、イベントのターゲットを調べて、アクションを実行するかどうかを確認することです。上記の HTML の例:

$('#container').on('click', function (event) {
    var target = $(event.target);
    if (target.hasClass('delete_me')) {
        target.remove();
    }            
});​

これは次と同じです:

$('#container').on('click', '.delete_me', function (event) {
    $(event.target).remove();      
});​

または、ドキュメント レベルで聞くこともできます。

$(document).on('click', '.delete_me', function (event) {
    $(event.target).remove();      
});​

これが実際の例です: http://jsfiddle.net/Kcapv/

event.stopPropagation()子ノードで使用するとイベントのバブリングが停止するため、このアプローチを試す場合はstopPropagationの使用に注意する必要があることに注意してください。

于 2012-12-02T18:04:58.853 に答える