JQuery в Rails не работает после ссылки с другой страницы, работает при загрузке страницы

У меня есть ротатор цитат, который я использую на моей домашней странице. Когда я загружаю страницу из браузера напрямую (набираю адрес в браузере и нажимаю Enter), она работает нормально .. Однако, если я нажимаю ссылку на другую страницу своего сайта, а затем возвращаюсь на главную, она перестает работать. В частности, кавычки начинают перекрываться почти так, как если бы выполнялись два экземпляра метода.

Думаю, проблема в том, как загружается javascript. Поскольку у меня есть сценарий вкладки на другой странице сайта, и он будет загружаться нормально, но если я перейду и вернусь на страницу, он больше не будет работать ...

Не получаю ошибок в консоли.

Я использую Rails 4, Ruby 2.0.0, Foundation в Ubuntu 12 и использую WebBrick для тестирования. Gemfile размещен ниже:

source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.0'

# Use mysql as the database for Active Record
gem 'mysql2'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0'


# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby
#gem 'nokogiri' '~> 1.5.10'
# Use jquery as the JavaScript library
gem 'jquery-rails'

gem 'activerecord-session_store', github: 'rails/activerecord-session_store'

gem 'activemerchant'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'

gem 'ransack'

gem 'xml-simple'

# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 1.2'

gem 'zurb-foundation'

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

# Use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.0.0'

# Use unicorn as the app server
# gem 'unicorn'

# Use Capistrano for deployment
 gem 'capistrano', group: :development

# Use debugger
# gem 'debugger', group: [:development, :test]

Сценарий:

    function rotateQuotes() {
            var oCurQuote = $('#quotes div.current');
            var oNxtQuote = oCurQuote.next();
            if (oNxtQuote.length == 0)
                oNxtQuote = $('#quotes div:first');

            oCurQuote.removeClass('current').addClass('previous');
            oNxtQuote.css({ opacity: 0.0 }).addClass('current').animate({ opacity: 1.0 }, {duration: 4500},
                function() {
                    oCurQuote.removeClass('previous');});
                    oCurQuote.animate({opacity: 0.0}, {duration: 500});

    }; 

$(function(){

                setInterval(rotateQuotes, 5000);
            });

application.js

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file.
//
// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details
// about supported directives.
//
//
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .

person Davey    schedule 04.09.2013    source источник


Ответы (1)


Я предполагаю, что это связано с Turbolinks. Из точного руководства:

События

С Turbolinks страницы будут меняться без полной перезагрузки, поэтому вы не можете полагаться на DOMContentLoaded или jQuery.ready() для запуска вашего кода. Вместо этого Turbolinks запускает события на document, чтобы обеспечить привязку к жизненному циклу страницы.

AFAIK, Rails4 по умолчанию включает турболинки (и они есть в вашем application.js), поэтому $(function() { ... }) не всегда срабатывает при смене страниц. Вместо этого вы можете попробовать привязать к turbolinks:load:

$(document).on('turbolinks:load', function() {
    setInterval(rotateQuotes, 5000);
});

Возможно, вы захотите привязать к turbolinks:before-visit, чтобы также очистить ситуацию.

В качестве альтернативы вы можете отключить Turbolinks, если вам это не интересно.

person mu is too short    schedule 04.09.2013
comment
Вау, спасибо большое! Я борюсь с этим несколько дней - person Davey; 05.09.2013
comment
Включение чего-то вроде Turbolinks по умолчанию кажется мне немного грубым, я уверен, что многие люди сталкиваются с подобными проблемами. - person mu is too short; 05.09.2013