JQuery и $questions

Я модифицирую код, который содержит много jQuery, но я не уверен, что делают некоторые из операторов jQuery.

В верхней части кода jQuery есть

jQuery.noConflict

* 1. Я это понимаю. Но тогда есть некоторый код, который имеет:

<script type="text/javascript">
(function($) {

$(document).ready(function() {

    jQuery.fn.fixEmail = function() {
    {
   return $(this).each(function() {
       var $s = $(this);                  
           ...code...
        }
}
</script>

Я получаю, что jQuery используется из-за noConflict. Какой параметр $?

* 2. В другой функции они используют

<script type="text/javascript">
jQuery(function(){
    var $ = jQuery;
    var cc = {
        mode : 'teaser',
        featureVisible : true,
        $loader : '<p class="loadingAnimation"><img height="32" src="' +
                config.xoImgUrl +
                '/images/ajax-loader.gif" width="32" /></p>',
                ....more code...
            }
}
</script>

Поэтому они устанавливают $в jQuery из noConflict. Но почему? Могли ли они просто использовать jQuery?

* 3. Существует плагин, который я хочу использовать, который инициализируется:

   var $j = jQuery.noConflict();
    var $ = {};
    $j(document).ready(function(){
        $j.history.init(pageload);
        $j("a[@rel='history']").click(function(){
            ...more code...
        });
    });

Я понимаю, что делает noConflict, но что делает var $ = {}?

Ответы

Ответ 1

Пример 1:

Я думаю, вы пропустили какой-то код:

(function($) {

$(document).ready(function() {

    jQuery.fn.fixEmail = function() {
    {
   return $(this).each(function() {
       var $s = $(this);                  
           ...code...
        }
}
)(jQuery); //This line was missing in your code. 

Перепишите этот код немного, чтобы понять, что происходит.

function complicatedFunction($) {
          // the document.ready call goes here.
}

Далее, как бы вы назвали эту функцию?

complicatedFunction(someObject);

Таким образом, внутри сложной функции $ относится к someObject. Согласитесь?

Если вы пишете

complicatedFunction(jQuery);

Затем внутри функции $ ссылается на объект jQuery. Таким образом, все внутри, complexFunction может использовать "$" так же, как и обычный пользователь jQuery.

Возвращаясь к исходному коду, если мы решили не называть эту функцию, т.е. сделать ее анонимной, вы можете визуализировать код, например,

(function($) { })(jQuery);

Вы создаете анонимную функцию, используя один аргумент с именем $. Вы немедленно вызываете эту анонимную функцию, передавая ей объект jQuery. Таким образом, вы не изменяете глобальный объект $, но весь код внутри вашей анонимной функции работает как $всегда. Круто, не так ли?:)

Пример 2:

jQuery(function(){
        var $ = jQuery;
        var cc = {
                mode : 'teaser',
                featureVisible : true,
                $loader : '<p class="loadingAnimation"><img height="32" src="' +
                                config.xoImgUrl +
                                '/images/ajax-loader.gif" width="32" /></p>',
                ....more code...
            }
});

Как и в примере 1, я не видел этот стиль кодирования. (Я даже не уверен, что это сработает)

В любом случае внутри анонимной функции, которая передается в jQuery, вы локализуете использование $без влияния на другой код. И да, они могли бы просто использовать объект jQuery повсюду, но это будет очень многословно, не так ли?

Пример 3:

var $ = {};

Над строкой определяет пустой объект и присваивает его переменной $.

Это то же самое, что и делать,

var $ = new Object();

Это похоже на то, как вы можете определить массив, используя два разных синтаксиса.

var items = [];  //same as var items = new Array();

Немного истории

Помните, что в '$' нет ничего особенного. Это переменное имя, как и любое другое. Раньше люди писали код, используя document.getElementById. Поскольку JavaScript чувствителен к регистру, было нормально ошибиться при написании document.getElementById. Должен ли я использовать капитал "b"? Должен ли я использовать "i" идентификатора? Вы получаете дрейф. Поскольку функции являются гражданами первого класса в JavaScript, вы всегда можете это сделать

var $= document.getElementById;//свобода от document.getElementById!

Когда прибыла библиотека прототипов, они назвали свою функцию, которая получает элементы DOM, как '$'. Почти все библиотеки JavaScript скопировали эту идею. Прототип также вводил функцию $$ для выбора элементов с помощью селектора CSS.

jQuery также адаптировал функцию $, но расширился, чтобы заставить все типы "селекторов" получать нужные элементы. Теперь, если вы уже используете Prototype в своем проекте и хотите включить jQuery, вы столкнулись с проблемой, поскольку "$" может ссылаться на реализацию Prototype или реализацию jQuery. Именно поэтому у jQuery есть опция noConflict, чтобы вы могли включить jQuery в свой проект, который использует Prototype и медленно переносит ваш код. Я думаю, это был блестящий шаг на стороне Джона!:)

Ответ 2

1

Вам не хватает кода в конце этого фрагмента? Обычно конвенция заключается в следующем:

jQuery.noConflict();

(function($){

$(document).ready(function() {

    jQuery.fn.fixEmail = function() {
    {
   return $(this).each(function() {
       var $s = $(this);                  
           ...code...
        }
}

})(jQuery);

Обратите внимание, что jQuery передается как параметр выражения функции, поэтому значение $равно jQuery, но только внутри этого выражения функции.

2

Они могли использовать jQuery, но они, вероятно, полагаются на копируемый/вставленный код, который использует $.

3

Я, вероятно, реорганизую их, чтобы использовать соглашение, аналогичное тому, которое я упоминаю в # 1. Я не уверен, почему они устанавливают $равным объекту, но у него плохой запах.

Ответ 3

В этом коде есть вонь. Используют ли они другую библиотеку JavaScript?

  • $обычно является функцией JQuery, но я считаю, что Prototype также использует ее. Может ли это быть прототипом кода? 2: Вы правы. По крайней мере, я не могу придумать причину. 3: Сбрасывает {} на новый объект. В основном, отмена JQuery

Ответ 4

Я предполагаю, что вы видели это Использование jQuery с другими JS-библиотеками? Я думаю, что эта страница отвечает на ваши вопросы (см. Ссылку "Магия ссылок" для jQuery в нижней части страницы).

Подводя итог:

  • Передача $- это способ использования jQuery внутри функционального блока без постоянной перезаписи.
  • В предположении я могу только сказать, что автор предпочел более сжатый $, а не jQuery.
  • Это внутри другого блока? Снова для удобства я думаю, что они хотят повторно использовать $для другой цели, без постоянной перезаписи.

Использование различных механизмов предотвращения конфликтов несколько противоречиво в коде, который вы опубликовали, поэтому вы можете захотеть реорганизовать это, если сможете.