JQuery - разделение переменных между функциями - PullRequest
2 голосов
/ 08 июля 2010

Это должно быть довольно просто; я почти уверен, что просто не понял этого.

К вашему сведению, веб-сайт использует jQuery для запуска ajax .load () для контента.

На моей главной родительской странице в заголовке у меня есть код nav .load () jQuery: -

<script type="text/javascript" charset="utf-8">

    $(document).ready(function(){

        $('a.nav').click(function() {
            page = $(this).attr('page');
            projID= $(this).attr('projID');

            if($("#mainRight").is(":visible")) { $('#mainRight').hide(200); }

            switch(page) {

            case 'projSettings': $("#mainRight").load("content.php?load=" + page, { projID: projID}); break;
            case 'projMetrics': $("#mainRight").load("content.php?load=" + page, { projID: '5000227' }); break;
            case 'projTags': $("#mainRight").load("content.php?load=" + page, { projID: projID}); break;
            case 'projShare': $("#mainRight").load("content.php?load=" + page, { projID: '5000227' }); break;

            }
            $('#mainRight').show(300);

        });

Теперь я хочу, чтобы projID запоминался для использования другими щелчками a.nav, которые его не предоставляют.

Связанный якорь, вызывающий это, выглядит как <a page="projSettings" projID="522" class="nav">Settings</a>, и я бы хотел сохранить это 522. Итак, другие запросы (которые не имеют projID, поскольку данные были загружены в DOM для других навигационных систем и не знаю projID. Надеюсь, это имеет смысл.

Итак, я хотел бы знать, как иметь ссылки типа <a page="projSettings" class="nav">settings</a>, когда projID уже использовался в предыдущем вызове.

Есть мысли?

Ответы [ 8 ]

6 голосов
/ 08 июля 2010

По иронии судьбы, вы уже экономите projID в глобальном масштабе (лучше сказать, в пределах window object на , а не , используя var в вашем объявлении.

Таким образом, вы уже можете получить доступ к projID из любого места в вашем коде после его инициализации.

В любом случае, это не хорошая практика, напротив, это очень плохая практика.

Лучший способ, о котором я могу подумать, - это создать свой собственный объект приложения, в котором вы храните все свои данные и получаете к ним доступ оттуда.

var your_application = {
    var foo  = 'bar',
        base = 'ball';        
};

// your_application.foo = 'another bar';

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

var your_application = function(){
    var foo  = 'bar',
        base = 'ball';  

    return {
        getfoo: function(){
            return foo;
        },
        setfoo: function(newfoo){
            foo = newfoo;
        }
    };
});

var app = your_application();
app.setfoo('foobar!');
alert(app.getfoo());

Такова идея методического программирования javascript. Там есть несколько хороших книг, я бы порекомендовал начать с Javascript: the good parts Дугласа Крокфорда.

Другим решением для этого должен быть метод jQuery .data(), который способен хранить данные в глобальном хэше.

// store
$.data(document.body, 'projID', projID);

// access
var foo = $.data(document.body, 'projID');

// remove
$.removeData(document.body, 'projID');
0 голосов
/ 08 июля 2010

Разве прототипы не лучше сделать с этим?

например

function System()
{
    settings = {
       'Foo': 'Bar'
    }
}

//Then define a prototype
System.prototype.getSetting = function(key)
{
   return settings[key] || undefined;
}


System = new System();
alert(System.getSetting('Foo'));​
0 голосов
/ 08 июля 2010

попробуйте это, и я сделал ваши коды более простыми ..

<script type="text/javascript" charset="utf-8">
    var projID; // making it global
    $(document).ready(function(){

        $('a.nav').click(function() {
            page = $(this).attr('page');
            projID= $(this).attr('projID');

            if($("#mainRight").is(":visible")) { $('#mainRight').hide(200); }                

            switch(page) {

            case 'projMetrics': projID = '5000227'; break;
            case 'projShare': projID: '5000227'; break;

            }

            $('#mainRight').load("content.php?load=" + page, { projID: projID}, function(){
                   $(this).show();
            });

        });
     })
</script>
0 голосов
/ 08 июля 2010

Я не проверял это, но следующая модификация должна сделать это:

<script type="text/javascript" charset="utf-8">
    var projID = null; // Better to have some default here

    $(document).ready(function(){

        $('a.nav').click(function() {
            var page = $(this).attr('page');
            projID= $(this).attr('projID') || projID;

            if($("#mainRight").is(":visible")) { $('#mainRight').hide(200); }

            switch(page) {

            case 'projSettings': $("#mainRight").load("content.php?load=" + page, { projID: projID}); break;
            case 'projMetrics': $("#mainRight").load("content.php?load=" + page, { projID: '5000227' }); break;
            case 'projTags': $("#mainRight").load("content.php?load=" + page, { projID: projID}); break;
            case 'projShare': $("#mainRight").load("content.php?load=" + page, { projID: '5000227' }); break;

            }
            $('#mainRight').show(300);

        });
0 голосов
/ 08 июля 2010

Если я вас правильно понимаю, у вас есть одна функция, которая применяется как обработчик .click() для различных элементов a.nav, и вы хотите, чтобы переменная projID задавалась только один раз и запоминалась для будущих вызовов та же функция.

Это похоже на идеальный вариант использования статических переменных. Статическая переменная будет сохранять свое значение между вызовами функций, но все еще находится в пределах этой функции. JavaScript не имеет явных статических переменных как таковых, но вы можете имитировать их , определив переменную как член этой функции ; конечный результат такой же. Вот код по этой ссылке:

function countMyself() {
    // Check to see if the counter has been initialized
    if ( typeof countMyself.counter == 'undefined' ) {
        // It has not... perform the initilization
        countMyself.counter = 0;
    }

    // Do something stupid to indicate the value
    alert(++countMyself.counter);
}
0 голосов
/ 08 июля 2010

Да Сделать это глобальной переменной.Добавьте var projID;при запуске скрипта.Договорились с Садатом.

0 голосов
/ 08 июля 2010

Просто определите переменную вне функции, и она станет глобальной.

0 голосов
/ 08 июля 2010

Просто введите следующую строку в начале вашего скрипта js-

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