JQuery и $ вопросы - PullRequest
       28

JQuery и $ вопросы

11 голосов
/ 14 июля 2009

Я изменяю некоторый код, в котором много 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 $ = {}?

Ответы [ 4 ]

66 голосов
/ 14 июля 2009

Пример 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»? Должен ли я заглавная "я" из Id? Вы получаете дрейф. Поскольку функции являются первоклассными гражданами в JavaScript, вы всегда можете сделать это

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

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

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

4 голосов
/ 14 июля 2009

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. Я не уверен, почему они устанавливают $ равным объекту, но он плохо пахнет.

0 голосов
/ 14 июля 2009

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

Подведем итог:

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

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

0 голосов
/ 14 июля 2009

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

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