Инициализация пространства имен Javascript при вызове из jquery.ready () - PullRequest
1 голос
/ 02 апреля 2010

Является ли следующий метод неправильным способом объявления пространства имен в Javascript? Это из книги, которую я читаю, и, похоже, не работает в моем коде.

<script type="text/javascript">
var mynamespace = {};

if(Drupal.jsEnabled){       
    $(document).ready(mynamespace.init);    
}

mynamespace.init = function() {
    $("#mybutton").bind("click",function(){     
        alert('hello');
    });
}

</script>

Ответы [ 5 ]

2 голосов
/ 02 апреля 2010

Похоже, ваш код зависит от jQuery. Убедитесь, что загружен, прежде чем запускать этот скрипт. Кроме того, определите свою функцию, прежде чем она будет вызвана. Попробуйте это:

var mynamespace = {};

mynamespace.init = function() {
    $("#mybutton").bind("click",function(){     
        alert('hello');
    });
}

if(Drupal.jsEnabled){       
    $(document).ready(mynamespace.init);    
}
1 голос
/ 02 апреля 2010

Будьте осторожны, используя $(document).ready(mynamespace.init);. При выполнении таким способом this больше не является ссылкой на mynamespace, обычно она будет равна window, но jQuery выполняет магию call в фоновом режиме, чтобы установить ее равной document. Это не повредит вам в этом случае, но будьте осторожны с этим в будущем.

$(document).ready(function () {
    mynamespace.init();
});

Вот как бы я это сделал.

В этом случае причина, по которой ваш код не работает, заключается в том, что метод init в mynamespace не определен в документе $(document).ready(mynamespace.init).

1 голос
/ 02 апреля 2010

Здесь, похоже, что-то идет не так, что функция mynamespace.init не определена, когда вы подключаете ее к $ (document) .ready.

Это должно работать как ожидалось:

<script type="text/javascript">
var mynamespace = {};

mynamespace.init = function() {
    $("#mybutton").bind("click",function(){     
        alert('hello');
    });
}

if(Drupal.jsEnabled){       
    $(document).ready(mynamespace.init);    
}

</script>

Вы также можете подумать о том, чтобы сформировать его таким образом, так как это легче понять (по крайней мере, для меня, во всяком случае)

<script type="text/javascript">
var mynamespace = {
    init : function() {
        $("#mybutton").bind("click",function(){     
            alert('hello');
        })
};

if(Drupal.jsEnabled){       
    $(document).ready(mynamespace.init);    
}

</script>
0 голосов
/ 02 апреля 2010

Да, вы можете использовать объект в качестве пространства имен. Другой способ сформировать пространство имен - использовать замыкания :

(function(inner_variable_1, inner_variable_2) {

    // define whatever here, they won't pollute namespace outside this closure

})(outer_variable_1, outer_variable_2);

Популярным примером является jQuery noconflict-mode , который позволяет вам использовать переменную $ в вашем коде jQuery, не делая $ глобальной переменной, оставляя глобальный $ для другого использования.

0 голосов
/ 02 апреля 2010

Что кажется мне странным, по крайней мере работа в основном в C #, так это то, что пространство имен не должно напрямую содержать логику кода. В C # это не может, для этого и нужны классы. Поэтому для меня наличие функции init в пространстве имен является противоречием.

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