Как работать с бесконфликтным режимом jQuery и несколькими сценариями - PullRequest
0 голосов
/ 21 июня 2011

Какой дерьмовый заголовок. Может быть, кто-то может отредактировать это для меня. Вот совок:

Мне нужно работать в бесконфликтном режиме jQuery, но я все же хотел бы воспользоваться сочетанием клавиш $, поэтому все мои функции и т. Д. Определены в типичном закрытии (function($){ ... })(jQuery);

Все это определено во внешнем файле source.js, который находится вверху моей HTML-страницы.

Чуть позже мне нужно добавить несколько встроенных <script>, которые используют одну из служебных функций, которые я определил в замыкании. Очевидно, я поместил свое имя в поле и не могу получить доступ к этой функции.

Какую модель использовать здесь?

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Ответ Магнара - путь к чему-то сложному. Но просто ради полноты, для чего-то очень простого, вы можете просто сделать его глобальным, например:

$.noConflict();

(function($){
    window.doSomething = function(){
        $("body").css("background-color","red");
    }        
})(jQuery);


doSomething();

добавив функцию к window, она становится глобальной.

http://jsfiddle.net/cxTYV/

1 голос
/ 21 июня 2011

Для контроля того, сколько и что вы выставляете в глобальном пространстве имен, принято выставлять то, что вам нужно, через один глобальный объект, обычно заглавными буквами.

FOO.module1.init();
FOO.module2.init();

Вы бы сделали это, убедившись, что FOO существует, а если нет: создайте его.

var FOO = this.FOO || {};

То же самое для пространств имен вашего модуля:

FOO.module1 = FOO.module1 || {};

и затем внутри анонимной функции выставьте то, что вы хотите.

Полный пример

module1.js:

var FOO = this.FOO || {};
FOO.module1 = FOO.module1 || {};

(function ($) {
    var my, local, data;

    function init() {
        // use my, local and data here.
    }

    FOO.module1.init = init;
}(jQuery));

module2.js:

var FOO = this.FOO || {};
FOO.module2 = FOO.module2 || {};

(function ($) {
    var some, other, data;

    function init() {
        // use some, other and data here.
    }

    FOO.module2.init = init;
}(jQuery));

controller.js:

FOO.module1.init();
FOO.module2.init();
...