为什么这个JS会在一页上部分呈现而不是另一页?

mar*_*ion 3 javascript jquery ruby-on-rails asset-pipeline ruby-on-rails-4

我有一个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);
});
Run Code Online (Sandbox Code Playgroud)

在我的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 --> 
Run Code Online (Sandbox Code Playgroud)

当我切换这个div,并_form显示partial时,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');
        }
    }); 
};
Run Code Online (Sandbox Code Playgroud)

但这没效果.

我有一个问题,问题的关键是"柜台",即#wordCountTitle#wordCountBody没有对我的工作/posts/new,即使他们在工作posts/index的时候.toggleSidebar被激活.

agi*_*ios 7

而不是直接绑定到需要仔细处理Turbolinks事件的元素的onclick,您可以在文档上使用事件处理程序,尝试更改直接事件

toggleSidebar.on("click", function(){
Run Code Online (Sandbox Code Playgroud)

委派活动

$(document).on("click", ".togglesidebar", function(){
Run Code Online (Sandbox Code Playgroud)

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

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


与第一个函数相同的代表第二个函数.此外,通过委派事件,"就绪"检查变得不必要.考虑到这一点,您的代码将变为:

$(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);
});
Run Code Online (Sandbox Code Playgroud)