javascript - 为什么这个 JS 会触发部分呈现在一页上而不是另一页上的表单?

标签 javascript jquery ruby-on-rails ruby-on-rails-4 asset-pipeline

我有一个如下所示的 posts.js 文件:

var ready;
ready = function() {

    var toggleSidebar = $(".togglesidebar");
    var primary = $("#primary");
    var secondary = $("#secondary");

    toggleSidebar.on("click", function(){

        if(primary.hasClass("col-sm-9")){
            primary.removeClass("col-sm-9");
            primary.addClass("col-sm-12");
            secondary.css('display', 'none');
        }
        else {
            primary.removeClass("col-sm-12");
            primary.addClass("col-sm-9");
            secondary.css('display', 'inline-block');
        }
    }); 
};

var counter = function(event) {
    var fieldValue = $(this).val();
    var wc = fieldValue.trim().replace(regex, ' ').split(' ').length;
    var regex = /\s+/gi;
    var $wcField;
    var maxWc;

    if ($(this)[0] === $('#post_title')[0]) {
      $wcField = $('#wordCountTitle');
      maxWc = 7;
    } else {
      $wcField = $('#wordCountBody');
      maxWc = 150;
    }

    $wcField.html(wc);
    $wcField.toggleClass('over-limit', wc > maxWc);
};

$(document).ready(ready);
$(document).on('ready page:load', function () {
    $('#post_title, #body-field').on('change keyup paste', counter);
});

在我的 application.html.erb 页面中,我有这个:

<div id="secondary" class="col-sm-3 sidebar" style="display: none;">
    <aside>
      <div class="about">
        <h4>Submit Report</h4>
            <%= render "posts/form" %>
        </div>
    </aside> 
</div>  <!-- /#secondary --> 

当我切换此 div 并显示 _form 部分时,JS 在这些字段中工作正常。

但如果我转到 posts/new/posts/:id/edit,它不会。

即使我检查该页面的源代码,我也会看到其中包含的 post.js

这可能是什么原因造成的?

编辑 1

如果重要的话,我正在使用 Turbolinks。

编辑2

根据答案中的建议,我试过了:

var ready;
ready = function() {

    // This is the Sidebar toggle functionality
    var toggleSidebar = $(".togglesidebar");
    var primary = $("#primary");
    var secondary = $("#secondary");

    $(document).on("click", ".togglesidebar", function(){       

        if(primary.hasClass("col-sm-9")){
            primary.removeClass("col-sm-9");
            primary.addClass("col-sm-12");
            secondary.css('display', 'none');
        }
        else {
            primary.removeClass("col-sm-12");
            primary.addClass("col-sm-9");
            secondary.css('display', 'inline-block');
        }
    }); 
};

但这并没有奏效。

我遇到的关键问题是“计数器”,即 #wordCountTitle#wordCountBody 在我的 /posts/上不起作用新的,即使当 .toggleSidebar 被激活时它们在 posts/index 上工作。

最佳答案

与其直接绑定(bind)到需要仔细处理 Turbolinks 事件的元素的 onclick,不如在文档上使用事件处理程序,尝试更改直接事件

toggleSidebar.on("click", function(){

委托(delegate)事件

$(document).on("click", ".togglesidebar", function(){

如果您使用直接事件动态修改 DOM(如 Turbolinks 替换它时),则需要重新分配它。

有关详细说明,请参阅 http://api.jquery.com/on/#direct-and-delegated-events


与第一个功能相同的是第二个功能。此外,对于委托(delegate)事件,“就绪”检查变得不必要。考虑到这一点,您的代码将变为:

$(document).on("click", ".togglesidebar", function(){

    var primary = $("#primary");
    var secondary = $("#secondary");

    if(primary.hasClass("col-sm-9")){
        primary.removeClass("col-sm-9");
        primary.addClass("col-sm-12");
        secondary.css('display', 'none');
    }
    else {
        primary.removeClass("col-sm-12");
        primary.addClass("col-sm-9");
        secondary.css('display', 'inline-block');
    }

}); 

$(document).on('change keyup paste', '#post_title, #body-field', function () {
    var fieldValue = $(this).val();
    var wc = fieldValue.trim().replace(regex, ' ').split(' ').length;
    var regex = /\s+/gi;
    var $wcField;
    var maxWc;

    if ($(this)[0] === $('#post_title')[0]) {
      $wcField = $('#wordCountTitle');
      maxWc = 7;
    } else {
      $wcField = $('#wordCountBody');
      maxWc = 150;
    }

    $wcField.html(wc);
    $wcField.toggleClass('over-limit', wc > maxWc);
});

关于javascript - 为什么这个 JS 会触发部分呈现在一页上而不是另一页上的表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28619731/

相关文章:

ruby-on-rails - 带 if 的 ruby​​ 1 行迭代器

javascript - 使用 Ajax on Rails 4 关注/取消关注

ruby-on-rails - 介绍深层嵌套的资源管理

javascript - 比较两个 JSON 对象以查看 Angular 的变化

javascript - jQuery 悬停导致 div 消失

jquery - 使用jquery ajax后如何通过选择器获取元素? $.ajax()

php - 仅在第一次单击时添加动态行

javascript - 弹出窗口时焦点关闭按钮

javascript - Facebook 网络数据 API 和 D3.JS

jquery - 如何将路径助手与 jquery 单击事件一起使用?