javascript - 修改 DOM 时 jQuery onclick 事件无法正常工作

标签 javascript jquery html css dom

我在理解 jQuery (v1.11) 的事件以及 DOM 交互如何影响这些事件方面遇到了一些困难。

设置:

我创建了一个带有“字母”类的内联 block 网格并观察点击:

$('.letter).on('click',function(){ // do something })

当我点击其中一个时,它会扩展到其父容器的大小。

问题:

即使我删除了类“letter”,div 仍然响应点击事件。理想情况下,我想展开 div 以显示更多信息,然后在用户完成后让它收缩回原位。

这是我的 html, fiddle 在底部。

<!DOCTYPE html>
<html lang="en-US">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Test</title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
    <style type="text/css">
        /* apply a natural box layout model to all elements */
        *, *:before, *:after {
          -moz-box-sizing: border-box; 
          -webkit-box-sizing: border-box; 
          box-sizing: border-box;
        }
        .square { 
            font-size: 20px;
            color: white;
            padding: 5px;
            display: inline-block;
            background-color: #69f;
            height: 50px;
            width: 50px;
            vertical-align: top;
        }
        .grid {
            width: 390px;
            padding: 5px;
            }
        .row { padding-top: 5px; }
        .square.empty { background-color: #87afff; }
        .square-highlight { background-color: #36f; }
    </style>
    </head>
    <body>
    <!-- begin content -->
    <div class="grid">
        <div class="rows">
            <div class="row">
                <div class="square empty"></div>
                <div class="square empty"></div>
                <div class="square empty"></div>
                <div class="square empty"></div>
                <div class="square empty"></div>
                <div class="square empty"></div>
                <div class="square letter">a</div>
            </div>
            <div class="row">
                <div class="square letter">b</div>
                <div class="square letter">c</div>
                <div class="square letter">d</div>
                <div class="square letter">e</div>
                <div class="square letter">f</div>
                <div class="square letter">g</div>
                <div class="square letter">h</div>
            </div>
            <div class="row">
                <div class="square letter">i</div>
                <div class="square letter">j</div>
                <div class="square letter">k</div>
                <div class="square letter">l</div>
                <div class="square letter">m</div>
                <div class="square letter">n</div>
                <div class="square letter">o</div>
            </div>
            <div class="row">
                <div class="square letter">p</div>
                <div class="square letter">q</div>
                <div class="square letter">r</div>
                <div class="square letter">s</div>
                <div class="square letter">t</div>
                <div class="square letter">u</div>
                <div class="square letter">v</div>
            </div>
            <div class="row">
                <div class="square letter">w</div>
                <div class="square letter">x</div>
                <div class="square letter">y</div>
                <div class="square letter">z</div>
                <div class="square empty"></div>
                <div class="square empty"></div>
                <div class="square empty"></div>
            </div>
        </div>
    </div>
</body>
  <script type="text/javascript" charset="utf-8">
    $(document).ready(function(){

        $('.letter').hover(function(){
            $(this).addClass('square-highlight');
        },function(){
            $(this).removeClass('square-highlight');
        });

        $(".letter").not('.large').on('click',function(){
            $(this)
                .addClass('large')
                .css('position','absolute')
                .stop()
                .animate({
                    height: $('.rows').height()-5, 
                    width: $('.rows').width(),
                    top: $('.rows').position().top+5,
                    left: $('.rows').position().left
                },"fast")
                .append('<input type="button" name="Save" value="save" />');
        });
        $(".large").on('click',function(){
            alert('test');
        });
    });
  </script>
</html>

这是我的 fiddle :http://jsfiddle.net/aKpLQ/

最佳答案

点击事件在 $(document).ready 期间使用选择器和当时元素的状态绑定(bind)到元素。更改元素的类不会更改绑定(bind)到它的事件。

要更改事件,您必须取消绑定(bind)单击事件并将其与新事件绑定(bind)。或者,您可以将相同的事件处理函数与一个条件函数一起使用,该函数的行为会根据元素的当前状态而有所不同。像这样的东西:

$(".letter").on('click',function(){
  if($(this).hasClass('large')){
    alert('test');
    $(this).removeClass('large');
  } else
    $(this)
      .addClass('large')
      .css('position','absolute')
      .stop()
      .animate({
        height: $('.rows').height()-5, 
        width: $('.rows').width(),
        top: $('.rows').position().top+5,
        left: $('.rows').position().left
      },"fast")
      .append('<input type="button" name="Save" value="save" />');
  });

关于javascript - 修改 DOM 时 jQuery onclick 事件无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21866219/

相关文章:

html - 滚动表格时如何使 <table> 的第一列不可移动?

javascript - 如何在按钮之间换行

javascript - 删除用户输入文本区域周围的红色边框(已加载ajax)

javascript - jQuery — 无法识别变量但手动输入完全相同的值是吗?

javascript - React js从事件中调用函数

jquery - $.getJSON 不返回 MVC3 的响应

jquery - 如何使用 jQuery 将同一个处理程序绑定(bind)到多个事件

javascript - 如何随机选择 child

javascript - 如何更改 <span> 类名?

jquery - 将下拉元素与绝对位置对齐