Подтвердить что ты не робот

Путаница над простым объявлением переменной jQuery "$ variable" vs javascript "var"

У меня есть эта простая реализация призрачного текста:

Код HTML:

<div id="searchPanel">
     <form method="get" id="searchBox" action="somePage.php">
     <input class="ghText" type="text" name="query" value="search here"/>
     </form>
</div>

Код jQuery:

$(document).ready(function(){
        $txtField = "#searchPanel form input.ghText";
        var value = $($txtField).val();
        $($txtField).focus(function(){
            if($(this).val() == value)
                $(this).val("").removeClass("ghText");
        });
        $($txtField).blur(function(){
            if($(this).val()==""){
                $(this).val(value).addClass("ghText");
            }
        });
});

Приведенный выше пример не будет работать. Когда пользователь фокусирует курсор на строке поиска, класс "ghText" по какой-то причине не удаляется.

Однако теперь, если я изменил значение "var" (переменная инициализация) и "значение" с помощью "$ value", как в:

$value = $($txtField).val(); 
$(this).val($value).removeClass("ghText");
$(this).val($value).addClass("ghText");

все работает отлично.

Я могу просто заснуть и не слишком беспокоюсь об этом... но мне очень любопытно, почему что-то подобное может случиться?

это из-за того, что "this" не ссылается на правый объект, или это потому, что я попытался сохранить объект jQuery в переменной, отличной от jQuery, или это о чем-то еще. Кто-нибудь может указать мне, что было не так? Я всегда думал, что "var x" совпадает с "$ x"..?

4b9b3361

Ответ 1

Кажется, вы смущены переменными JavaScript. Нет такой вещи, как "переменные jQuery" и "переменные без jQuery". Некоторые конкретные случаи:

  • Переменная, объявленная с помощью var, отличается от переменной без нее. "var x" - это локальная переменная, поэтому она не будет использовать значение с другими функциями, которые также имеют переменную, называемую "x". Это почти всегда хорошо, поэтому вы должны почти всегда объявлять переменные с помощью "var".
  • $in jQuery является своего рода специальным. Это не так уж и важно; это просто, что jQuery объявила переменную под названием "$", которая выполняет некоторые причудливые операции.
  • Нет ничего особенного в переменных, начинающихся с "$". Другими словами, "$ x" - это просто имя переменной. Это переменная "x", и это не "переменная jQuery". Это просто переменная JavaScript, называемая "$ x". (Это отличается от PHP, где $- фактически специальный синтаксис переменной.)

Таким образом, вы можете просто назвать это "значение" вместо "$ value".

Возможно, факт, что вы удалили "var", изменили ситуацию, превратив ее в глобальную переменную.

Что касается "this", да, это сложный аспект JavaScript и может вызвать вашу проблему. Значение "this" внутри внутренних функций "фокус" и "размытие", вероятно, будет отличаться от значения "this" снаружи. Я не уверен точно, что "this" относится к обработчику событий, но это не будет тот же объект. Итак, что вы, вероятно, захотите сделать, это присваивать переменной "this" переменной во внешней функции, а затем ссылаться на эту переменную внутри вместо "this".

Ответ 2

При сохранении выбора jQuery в переменной его обычной практикой следует добавить $ перед именем переменной следующим образом:

var $banner = $('#banner');

Не обязательно включать знак доллара - var banner = $(‘#banner’) - будет работать так же хорошо. Однако знак доллара напоминает вам, что переменная содержит выбор jQuery, а не только любое старое значение, например число или строку.

Ответ 3

@mgiuca полностью прав насчет переменных Javascript - предшествующее им "$" - это просто соглашение об именах, которое наиболее часто используется для идентификации объектов jQuery. Я добавляю это, потому что вы говорите

потому что я попытался сохранить объект jQuery в переменной non-jQuery

но это неправильно. $txtField - это строка, которую вы используете для выбора объекта. Если вы хотите сохранить сам объект, вы должны сделать $txtField = $(#searchPanel form input.ghText), а затем использовать его таким образом $txtField.val().

Сказав, что ваш код работает отлично для меня неизменным. Я настроил демонстрацию, которая работает в Chrome, - это вырезанная версия вашего кода?

Ответ 4

В дополнение к @mgiuca ответ здесь немного более продуманный подход к вашей проблеме, который также показывает некоторые из jQuery:

$(document).ready(function () { 
  // define two helper functions
  var removeDefault = function () {
    if( $(this).val() == $(this).data("defaultValue") ) {
      $(this).val("").removeClass("ghText");
    }
  };
  var setDefault = function () {
    if( $(this).val() == "" ) {
      $(this).val( $(this).data("defaultValue") ).addClass("ghText");
    }
  };
  // the following works on all input elements
  $("#searchPanel form input.ghText").each(function () {
    $(this)
    .data("defaultValue", $(this).val())
    .focus(removeDefault)
    .blur(setDefault);
  });
}); 

Примечание

  • использование .data() для привязки значения к определенному элементу.
  • использование .each() для применения одного и того же поведения к любому количеству элементов
  • ссылки на функции использования для .focus() и .blur() - jQuery всегда будет устанавливать this самостоятельно
  • Посмотрите, как он работает здесь http://jsfiddle.net/xsXxn/

Ответ 5

Итак, $x - переменная jQuery в конце концов:)... Ну, во всяком случае, вот один экземпляр, когда $или not $сделал большую разницу в моем коде:

... load ( "whatever.php", {par1: var1, par2: var2})

не работал, по крайней мере внутри назначения $(obj).attr(), если не используется переменная $var1, $var2. Это сработало:

$(obj).attr( "onClick", $( "# wherever" ). load ( "whatever.php", {par1: $var1, par2: $var2})...