Нужно ли мне иметь каждую функцию Javascript в application.js, заключенную в $ (function () {}? - PullRequest
2 голосов
/ 17 ноября 2010

Мой application.js имеет это снаружи:

$(function() {
    // My functions are in here, and some of them even work.
}

Я вырезал и вставил, пока не получил что-то, что работает, теперь я изучаю jQuery всерьез.Я немного отстал, я знаю.

Какова цель этого кода выше, $(function() { }?

Ответы [ 3 ]

7 голосов
/ 17 ноября 2010

Это ярлык для :

$(document).ready(function () {

});

Это означает, что после полной загрузки DOM ваш скрипт будет запущен.Это означает, что любые части вашего сценария, которые используют определенные существующие узлы DOM, будут работать.Если бы ваш файл .js находился вверху страницы, он работал бы до того, как появились узлы DOM, а это значит, что вы пытались бы работать с чем-то, чего там не было.$(document).ready() позволяет отложить выполнение вашего кода до тех пор, пока страница не будет готова.

Так, например, скажем, у вас есть следующий JavaScript, загруженный в тег script в заголовке:

$('a').click(function () {
    alert("You can't leave!!!");
    return false;
});

Он пытается добавить обработчик щелчка ко всем тегам <a>, но тегов <a> пока нет, поэтому он ничего не сделает.Если вы поместите его в $(document).ready(), это будет выглядеть так:

$(document).ready(function () {
    $('a').click(function () {
        alert("You can't leave!!!");
        return false;
    });
});

Теперь он будет выполняться только тогда, когда документ будет готов.

Чтобы ответить на вопрос в заголовке, нет,вам не нужно все оборачивать в $(document).ready() - только код, который полагается на то, что DOM полностью загружен.

1 голос
/ 17 ноября 2010

В основном, что делает при запуске кода при загрузке тела

Позвольте мне объяснить немного подробнее.

Когда страница загружается, браузер загружается с первой строки до последней строки. Когда вы загружаете jQuery в ваш тег <head>, он загружается до <body>, так как <head> находится над телом

Возьмите этот пример:

<!DOCTYPE html>
<html>
    <head>
        <script type="x" source="jquery.js" />
        <script type="x">
            $("#my_id").remove();
        </script>
    </head>
    <body>
        <div id="my_id"></div>
    </body>
</html>

Как вы можете видеть, первый загруженный ресурс - jquery.js, и строка ниже, где у меня есть код jQuery, будет lexecute, потому что jquery был загружен, поэтому $() существует.

проблема в том, что код jquery ищет несуществующее, потому что DOM еще не проанализировал его.

используется следующий синтаксис, чтобы при отправке «анонимной функции» в jquery она сохранялась до полной загрузки документа, поэтому <div> будет существовать и команда будет выполнена успешно.

$(function(){
})

есть несколько способов написать это, основной способ выглядит так:

$(document).ready(function(){
   //Code here will only be run upon document ready.
});

Но я предпочитаю делать что-то:

mysite = {}; //Creates a "namespace / Object" for me to work within
mysite.dialog = function(title,message){/*blah*/}
mysite.init = function(){
   //Code here is for the Document Ready state.
   mysite.dialog("hey","the document has been loaded");
}

А потом я сохраняю это в моем Application.js файле и включаю после jquery.js

затем в моем документе выполните следующую команду.

$(document).ready(mysite.init);
1 голос
/ 17 ноября 2010

Нет, вам нужны только те операторы, которые вы хотите выполнить при первой загрузке страницы внутри $(function(){});

Все функции могут быть определены в другом месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...