JQuery прототип конфликта только в ie8 - PullRequest
1 голос
/ 31 января 2011

Я использую jQuery для сборки модуля для существующей страницы.На странице также используется прототип, поэтому существует обычный конфликт jQuery-прототип.Я использую jQuery.noConflict (), и все работает нормально во всех браузерах, кроме ie (протестировано в ie8).Я прочитал все подобные вопросы здесь и на других сайтах, но не могу заставить его работать.Вот как это работает: страница загружает прототип и другие файлы .js с использованием прототипа (effect.js, prototip.js и т. Д.), А затем загружает мой модуль (он же jQuery загружается после прототипа).Я читал об изменении функции $ () прототипа на $$$ (), но это невозможно (многие другие модули, использующие прототип, необходимо будет изменить), поэтому речь идет только об изменении моего js.

ТогдаЯ читал об использовании

(function($) {
    //my jQuery code in here

})(jQuery);

, но не совсем понимаю.Мой код примерно такой:

$J = jQuery.noConflict();
$J(document).ready(function(){
     fun1();
     //jquery stuff
     fun2();
});

function fun1(){
     //stuff/jQuery code/ call other functions
}

function fun2(){
     //stuff/jQuery code/ call other functions
}

, если я помещу все вышеперечисленное в (function($) { /*all the above*/})(jQuery);

, я получаю, что все функции не определены.

Что я делаюнеправильно?Или есть другое решение?

Ответы [ 2 ]

1 голос
/ 31 января 2011

Чтобы jQuery.noConflict(); работал, он должен быть вызван до загрузки всех остальных библиотек javascript, иначе вы уже перезаписали переменную $.Ошибка, которую вы получаете с (function($) { /*all the above*/})(jQuery);, заключается в том, что она определяет анонимную функцию, любая функция внутри нее существует только внутри нее и не может использоваться вне ее, если только она не является частью объекта вне области действия анонимной функции.1004 *

Так что вам нужно использовать это так.

//Must be called before any other library in included on the page.
$J = jQuery.noConflict();

(function($){
    $(document).ready(function(){
        fun1();
        //jquery stuff
        fun2();
    });
})(jQuery);

function fun1(){
    //stuff/jQuery code/ call other functions
}

function fun2(){
    //stuff/jQuery code/ call other functions
}
0 голосов
/ 14 марта 2011

Единственный способ, которым я смог это исправить, для IE8 (который был единственным с этой проблемой) и других браузеров, это поместить jQuery и вызов noConflict () в заголовок сразу после инициализации другая библиотека. Вот так:

<script type="text/javascript" src="/path/to/prototype.js"></script>

<script type="text/javascript" src="/path/to/jquery.js"></script>

<script type="text/javascript">var $j = jQuery.noConflict(); </script>

... за которыми следуют любые другие скрипты, использующие jQuery или Prototype.

...