【问题标题】:jQuery binding events to elements with dynamic classjQuery 将事件绑定到具有动态类的元素
【发布时间】:2014-09-29 06:03:26
【问题描述】:

我有一个触发元素和一个响应元素。

<div class="more"></div>
<div class="info"></div>

我想绑定一个打开/关闭类型的事件。

$('.more').delegate($('.more'), 'click', function(){
    $(this).removeClass('more');
    $(this).addClass('less');
    $(this).text("less...");
    $('.info').addClass("open");
});

$('.less').delegate($('.less'), 'click', function(){
    $(this).addClass('more');
    $(this).removeClass('less');
    $(this).text("more...");
    $('.info').removeClass("open");
});

它不能按预期工作,如果第二个函数嵌套在第一个函数中,那么您只能打开和关闭一次。 如果脚本的格式如上合理,它将打开但不会关闭。

谁能帮帮我? 如果脚本可以支持 .info ,则奖励可以是兄弟元素,也可以是紧跟在 $(.more/.less) 的父元素之后的元素。

我一直在玩弄 .on/.live/.bind 但不如上面成功。

【问题讨论】:

    标签: javascript jquery events dynamic


    【解决方案1】:

    使用事件delegation,并绑定到文档或直接父级,不是同一个元素

    $(document).on( 'click',".more", function(){
        $(this).removeClass('more');
        $(this).addClass('less');
        $(this).text("less...");
        $('.info').addClass("open");
    });
    
    $(document).on('click',".less", function(){
        $(this).addClass('more');
        $(this).removeClass('less');
        $(this).text("more...");
        $('.info').removeClass("open");
    });
    

    DEMO

    注意:delegate 在最新版本的 jquery 中已过时,因此请改用 onISSUE:您被委派了相同的元素 $('.less'),$('.more') 使用即时 parent 或文档

    【讨论】:

    • 您好,感谢您的快速回复和演示。我这边发生了一些奇怪的事情。 Demo 显然工作正常。可能是我们的 jQuery 版本(1.10.2)?正如我看到的那样,对 .text 的调用正在清除文档,根本没有 DOM。删除 text() 调用只是为了查看,我得到了我最初拥有的 div 将打开但不会关闭,并且链接保留类“更多”并且没有获得类“更少”。看起来这个函数发生了一些变化,因为 $(this) 等同于 $(document)
    • 尝试添加:var eSrc = $(arguments[0].target);替换 $(this) 但似乎这两个函数都在单击时触发:(更奇怪的是,如果我删除了我试图绑定到 .less 的函数(以及 console.log(eSrc) 以更好地衡量),那么我看到了打开按预期发生,但函数继续响应点击 .less
    【解决方案2】:

    只需使用 JavaScript 切换一个类,其余的交给 CSS 魔法。这是一个演示:http://jsfiddle.net/pomeh/69sX5/1/

    这里是代码:

    HTML

    <div>
        Some visible content
    </div>
    
    <div class="content-fold">
        <div class="more">More...</div>
        <div class="less">Less...</div>
    </div>
    <div class="info">Some hidden additional content</div>
    

    CSS

    /* Additional content and Less button hidden by default */
    .content-fold + .info, .content-fold .less {
        display: none;
    }
    
    /* Additional content and Less button shown when class shown is active */
    .content-fold.shown + .info, .content-fold.shown .less {
        display: block;
    }
    /* More button hidden when additional content is shown */
    .content-fold.shown .more {
        display: none;
    }
    
    /*
    You can also move the "div.info" into the "div.content-fold",
    and use ".content-fold.shown > .info" instead of ".content-fold.shown + .info"
    
    Browser support is quite good for adjacent selector (see http://www.quirksmode.org/css/selectors/#t11 and https://developer.mozilla.org/en-US/docs/Web/CSS/Adjacent_sibling_selectors#Browser_compatibility)
    */
    

    JavaScript

    $('.content-fold').on('click', function(){
        $(this).toggleClass('shown');
    });
    

    【讨论】:

    • 我几乎忽略了这一点,但这里有一些微妙的狡猾。不完全适合,为了使事情复杂化,.content-fold 和 .info 之间可能还有一个元素,但我正在玩这个,看看我是否可以适应它。
    • 一旦我把它放进去并针对特定的网站进行了调整,它就很奏效了。 (最初)不太热衷于添加到 DOM,但考虑到这是一个非常聪明的解决方案。
    • 很高兴您喜欢它并解决了您的问题 :) 我只是想为以 JavaScript 为中心的解决方案提供一个替代方案,并尽可能减少所需的 JavaScript 数量。但可以肯定的是,这段代码可以适应其他情况(divs 可以左右移动等)
    【解决方案3】:

    使用 id 来完成您的任务。这很容易。 html

    <div class="more" id="toggle"></div>
    <div class="info"></div>
    

    jQuery

    $('#toggle').click(function(){
       var $this = $(this) //store object
       if($this.hasClass('more')) {
          $this.removeClass('more').addClass('less').text('Less...')
          $this.next('.info').addClass('open');
       } else {
          $this.removeClass('less').addClass('more').text('More...')
          $this.next('.info').removeClass('open');
       }
    });
    

    js 小提琴:http://jsfiddle.net/5N6TL/53/

    【讨论】:

    • 依赖 ID 会将脚本限制为每页单次使用,在某些情况下我有 4 或 5 个。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多