С сайта документации API jQuery дляready
Все три из следующих синтаксисов эквивалентны:
- $ (документ) .ready (обработчик)
- $ (). ready (обработчик) (не рекомендуется)
- $ (обработчик)
Выполнив домашнее задание - прочитав исходный код и поигравшись с ним , я понятия не имею, почему
$().ready(handler)
не рекомендуется. Первый и третий способы абсолютно одинаковы, третий вариант вызывает функцию готовности кэшированного объекта jQuery с помощью document
:
rootjQuery = jQuery(document);
...
...
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}
Но функция ready не взаимодействует с селектором выбранных узловых элементов. ready
Исходный код:
ready: function( fn ) {
// Attach the listeners
jQuery.bindReady();
// Add the callback
readyList.add( fn );
return this;
},
Как видите, он просто добавляет обратный вызов во внутреннюю очередь ( readyList
) и не изменяет и не использует элементы в наборе. Это позволяет вам вызывать ready
функцию для каждого объекта jQuery.
Подобно:
- обычный селектор:
$('a').ready(handler)
DEMO - Селектор глупостей :
$('fdhjhjkdafdsjkjriohfjdnfj').ready(handler)
DEMO - Неопределенный селектор:
$().ready(handler)
DEMO
Напоследок ... на мой вопрос: почему $().ready(handler)
не рекомендуется?
javascript
jquery
callback
document-ready
gdoron поддерживает Монику
источник
источник
$.ready
например) и в первую очередь не требовать создания объекта jQuery..ready()
возможности для отдельных элементов, не должно быть причин для создания объекта jQuery.$.ready
уже занято внутренней функцией jQuery, найдите в исходном кодеready:
.Ответы:
Получил официальный ответ от одного из разработчиков jQuery:
$().ready(fn)
работает только потому, что$()
раньше был ярлыком для$(document)
(jQuery <1.4)Так
$().ready(fn)
был читаемый код.Но люди совершали подобные вещи
$().mouseover()
и прочие безумие.и люди должны были
$([])
получить пустой объект jQueryИтак, в 1.4 мы изменили его так, чтобы он
$()
давал пустой jQuery, и мы просто сделали$().ready(fn)
работу, чтобы не сломать много кода.$().ready(fn)
буквально сейчас просто пропатчен в ядре, чтобы он работал должным образом в устаревшем случае.Лучшее место для
ready
функции есть$.ready(fn)
, но это действительно старое дизайнерское решение, и это то, что у нас есть сейчас.Я спросил его:
Его ответ был:
источник
$()
в первую очередь (как бестолковый , как поведение может быть) . С другой стороны, ты прав. Они не всегда так склонны вносить критические изменения, как было показано, когда они пытались что-то изменить.attr()
, а через несколько дней быстро вернулись. Это связывало их с некоторыми из их неудачных дизайнерских решений в раннем (и среднем) возрасте.$(selector[, context])
и есть$(html[, ownerDocument])
. Фактически, вы можете просто использоватьjQuery()
вместо этого,$()
если проблема заключается в том, чтобы знать, что он работает. Или зачем вообще использовать jQuery?Поскольку разные варианты делают примерно то же самое, что вы указываете, пора надеть шляпу писателя библиотеки и сделать некоторые предположения.
Возможно, люди, использующие jQuery, хотели бы иметь
$()
доступ к нему для будущего использования (сомнительно, поскольку$().ready
документально подтверждено, что оно работает, даже если оно не рекомендуется; это также испортит семантику$
особого случая).Гораздо более практичная причина: вторая версия - единственная, которая не завершается упаковкой
document
, поэтому ее легче сломать при поддержке кода. Пример:// BEFORE $(document).ready(foo); // AFTER: works $(document).ready(foo).on("click", "a", function() {});
Сравните это с
// BEFORE $().ready(foo); // AFTER: breaks $().ready(foo).on("click", "a", function() {});
В связи с вышеизложенным:
ready
это урод в том смысле, что это (единственный?) Метод, который будет работать одинаково независимо от того, что объект jQuery обертывает (даже если он ничего не обертывает, как здесь). Это серьезное отличие от семантики других методов jQuery, поэтому полагаться на него не рекомендуется.Обновление: как указывает комментарий Esailija, с инженерной точки зрения
ready
действительно должен быть статический метод именно потому, что он работает так.Обновление №2: копаясь в источнике, кажется, что в какой-то момент ветка 1.4
$()
была изменена, чтобы соответствовать$([])
, а в 1.3 она вела себя как$(document)
. Это изменение усилит приведенные выше обоснования.источник
$(document).ready( function(){ //your code here } );
selector = selector || document
наif(!selector) return this
.Я бы сказал, что это просто тот факт, что
$()
возвращает пустой объект, тогда$(document)
как вы не применяете егоready()
к разным вещам; он все еще работает, но я бы сказал, что это не интуитивно понятно.$(document).ready(function(){}).prop("title") // the title $().ready(function(){}).prop("title") //null - no backing document
источник
$()
.ready
потому что это устоявшаяся идиома. Конечно, есть теоретическая вероятность того, что кто-то сделает это, но я никогда не видел, чтобы код делал это (что не является хорошим аргументом, но вы знаете: D).Скорее всего, это просто ошибка документации, и ее следует исправить, единственный недостаток использования
$().ready(handler)
- это удобочитаемость. Конечно, утверждать, что$(handler)
это так же нечитабельно. Согласен, поэтому не использую .Вы также можете возразить, что один метод быстрее другого. Однако как часто вы вызываете этот метод достаточно раз подряд на одной странице, чтобы заметить разницу?
В конечном итоге все сводится к личным предпочтениям. Нет никаких недостатков в использовании
$().ready(handler)
другого аргумента, кроме удобочитаемости. Я думаю, что в этом случае документация неверна.источник
Просто чтобы сделать очевидным, что есть некоторая несогласованность в трех, плюс я добавил четвертую часто используемую форму:
(function($) {}(jQuery));
С такой разметкой:
<div >one</div> <div>two</div> <div id='t'/>
и этот код:
var howmanyEmpty = $().ready().find('*').length; var howmanyHandler = $(function() {}).find('*').length; var howmanyDoc = $(document).ready().find('*').length; var howmanyPassed = (function($) { return $('*').length; }(jQuery)); var howmanyYuck = (function($) {}(jQuery)); var howmanyYuckType = (typeof howmanyYuck); $(document).ready(function() { $('#t').text(howmanyEmpty + ":" + howmanyHandler + ":" + howmanyDoc + ":" + howmanyPassed + ":" + howmanyYuckType); });
Отображаемые результаты div из последнего оператора: 0: 9: 9: 9: undefined
Итак, только версии Handler и Doc согласуются с соглашением jQuery о возврате чего-то полезного, поскольку они получают селектор документов, и с формой Passed вы должны что-то вернуть (я бы не стал этого делать, я бы подумал, но просто вставьте это в показать "внутри" есть что).
Вот его версия для любопытных: http://jsfiddle.net/az85G/
источник
null
так что.find('*').length
возвращает 0 . Вы находите что-то плохое в этом (очевидном) поведении?if(!selector) return this
если вы дадите что-то еще, естьregex
и другие вещи ... Спасибо за добрые слова ... Думаю, я мог бы попросить команду jQuery ответь на это (черт возьми, это не моя библиотека:-)
).jQuery(document).ready(function(){});
форму в нашей базе кода в настоящее время, поскольку существуют разные уровни опыта jQuery, и для новичков «наиболее очевидно», что это функция обработчика событий для jQuery.Я думаю, что это больше для удобочитаемости, чем что-либо еще.
Этот не такой выразительный
в качестве
$(document).ready(handler)
Возможно, они пытаются продвигать какую-то форму идиоматического jQuery.
источник
$(document).ready(handler)
более читабелен, чем$(handler)
рекомендованный ...