2013-06-16 5 views
1

Я зову Require.js справа перед закрывающим тегом тела:JQuery document.ready() не работает с Require.js

<script data-main="assets/scripts/src/main.js" src="assets/scripts/lib/requirejs/require.js"></script> 
</body> 

Вот что мой main.js содержит:

requirejs.config({ 
    urlArgs: "bust=" + (new Date()).getTime(), // override browser cache 
}); 

require(['views/appView'], function (App) { 
    App.initialize(); // this is just to test the module is actually loading 
}); 

И appView.js содержит:

define([ 
    'modernizr', 
    'jquery', 
    'underscore', 
    'backbone', 
    'common', // this module has about 4 other dependencies too 
    'dust', 
    'routers/main', 
    'views/main' 
], function (Modernizr, $, _, Backbone, Common, dust, router, mainView) { 
    // This is supposed to load, even if jQuery loads after the DOM ready event 
    $(document).on('ready', function() { 
     console.log("I don't want to play nice"); 
    }); 

    return { 
     initialize: function() { 
      console.log("Init"); 
     } 
    } 
}); 

К сожалению, это: console.log("I don't want to play nice"); не бывает на всех.

Вот как выглядит моя временная шкала сети в Chrome Dev Tools. Как вы можете видеть, событие готовности DOM запускается до загрузки jQuery - но AFAIK, jQuery знает, как с этим справиться! Так что я потерян. enter image description here

+0

Ответ на ваш вопрос в стороне, называя require.js непосредственно перед тег закрывающего тела полностью поражает точку асинхронной загрузки. Сам файл require.js загружается последовательно - поэтому, если вы вызываете его в конце вашего документа, тогда установленные вами модули не начнут загружаться (хотя и асинхронно), пока после содержимого ... вся цель requireJS и асинхронная загрузка заключается в том, что вы можете вызывать скрипты сначала в голове на выделенном одновременном потоке браузера, чтобы они загружались, пока контент не замедляет работу. – BenLeah

ответ

7

Должно быть,

$(document).ready(function() { 
    console.log("I don't want to play nice"); 
}); 

$(document).on("ready", handler), нежелателен из JQuery 1.8 http://api.jquery.com/ready/

+0

Спасибо, очень много. – pilau

+2

Обратите внимание, что проблема не в том, что версия '.on (« ready »' устарела (хотя она и не должна ее использовать), это значит, что '.on (« ready »' version не вызывает обработчик, если он связан после события готовности. – nnnnnn

+0

@ChamikaSandamal это неверно, вы можете вызвать '$ (document) .ready' после того, как он уже запущен, и функция, которую вы передаете, будет вызываться мгновенно. – pilau

2

Учитывая, что RequireJS используется для загрузки только модули, необходимые для конкретной страницы, разработчики могут не захотеть загружать всю библиотеку jQuery на некоторые страницы только для своего обратного вызова $(document).ready(function(){}). В качестве альтернативы, используйте RequireJS»domReady в appView.js:

define([ 
    'domReady', 
    'modernizr', 
    'etc' 
], function (domReady, Modernizr, etc) { 
    domReady(function() { 
     console.log("I'll play nice"); 
    }); 
}); 

или добавьте ! на domReady определить, чтобы избежать вложенных обратных вызовов:

define([ 
    'domReady!', 
    'modernizr', 
    'etc' 
], function (domReady, Modernizr, etc) { 
    console.log("I'll also play nice"); 
});