JS全局变量不更新

时间:2020-03-12 作者:Slingy

如何更新全局变量URL?我已经试了三天了,还是没有运气

var output = \'\';
var pageNum = \'\';
url = \'\';
function post_ajax_get(pagination) {
    $("#loading-animation").show();
    var query = \'nazwa=\';
    var time = \'gr=\';
    var output = \'\';
    $("[data-category-menu] a.current").each(function(){
        if($(this).data(\'time\')) {
            if(time != \'gr=\') {
                time+= \',\'; 
            };
            time+= $(this).data(\'time\');
        }
        if($(this).data(\'slug\')) {
            if(query != \'nazwa=\') {
                query+= \',\'; 
            };
            query+= $(this).data(\'slug\');
        }
        if (query != \'nazwa=\' && time == \'gr=\'){
            output = query;
        }
        else if (query == \'nazwa=\' && time != \'gr=\'){
            output = time;
        }
        else if (query != \'nazwa=\' && time != \'gr=\'){
            output = time + \'&\' + query;
        }
    });
    if(pagination) {
        $("[data-pagination] a.current").each(function(){
            if(output != \'\') output+= \'&\';
            output+= $(this).data(\'slug\');
        });
    }
    url = window.location.protocol + \'//\' + window.location.host + \'/\' + window.location.pathname + \'?\' + output;
    //window.location.href = url;
    if ($(\'body.category\').length > 0 && output == \'\') {
        var adres = window.location.pathname;
        var cat = adres.split(\'/\')[3];
        url = window.location.protocol + \'//\' + window.location.host + \'/\' + window.location.pathname + \'?\' + \'nazwa=\' + cat;
        $(\'[data-category-menu] li a\').each(function() {
            if($(this).attr(\'id\') == cat) {
                $(this).addClass(\'current\');
            }

            $(\'[data-category-menu] li a.current\').click(function() {
                $(this).removeClass(\'current\');
            }) 
        })
    }

    $(\'[data-category-menu] li a.current\').click(function() {
        updateURL(); 
    })

    function updateURL() {
        console.log(\'fire\');
        url = window.location.protocol + \'//\' + window.location.host + \'/\' + window.location.pathname + \'?\' + \'nazwa=pusty\';
    }
    console.log(url);
    var pageNum = url.substr(url.indexOf("md_page=") + 8);
    //var pagNum = pageNum.toString();
    $(\'#md-products\').load(url + \' #md-products > *\', function() {
        $("#loading-animation").hide();
        $(\'#md-products [data-pagination] a\').on(\'click\', function() {
            $(this).addClass(\'current\');
            post_ajax_get(true);
        })
    });
}

console.log(url);

2 个回复
SO网友:Mikhail

如果您想故意创建全局变量,您需要这样做。

window[\'your_variable_name\']= \'Some variable value\';

然后你就可以像window.your_variable_name - 这种创建和访问全局变量的方式保证了您将使用相同的变量,无论您使用什么构建工具(如webpack)或从何处访问它。例如,您可能需要从定义了相同命名变量的其他函数访问它,因此无需通过window.variable_name 表示您将访问父作用域的变量,而不是全局变量。

此外,如果您需要一个全局变量,它的名称应该是唯一的,最好像您的插件名称或其他不会被其他代码覆盖的名称一样调用它,避免使用通用名称,如url.

所以你可以这样做window[\'YourUniquePluginGlobal\'] = {url: \'your_url\'};

然后您可以访问变量,如window.YourUniquePluginGlobal.url

不要依赖省略var 关键字。

更重要的是,千万不要忽略var (或let, const 在ES6)中,当您声明一个变量时,因为它会使您的代码不可靠和不可维护。

始终使用var, let \\ const 当您在JS中声明一个变量时,可能会有好的代码:)

SO网友:Mikhail

我不知道您用来生成标记的全部代码,但一般来说,在基于代码进行思考后,我看到了甚至看不到其余的代码。我希望重写的代码可以让您深入了解如何在没有全局变量的情况下实现所需的操作。

//lets init UI
$(\'#md-products [data-pagination] a\').on(\'click\', function () {
    $(this).addClass(\'current\');
    var pageToLoad = $(this).attr(\'data-page\'); // set to attribute which contains page to load.
    var url2Load = getUpdatedUrl(pageToLoad);
    post_ajax_get(url2Load);
});

$(\'[data-category-menu] li a\').each(function () {
    var cat = getCurrentCategoryFromPathName();
    if ($(this).attr(\'id\') === cat) {
        $(this).addClass(\'current\');
    }
});

$(\'[data-category-menu] li a.current\').on(\'click\', function () {
    $(this).removeClass(\'current\');
    updateURL();
});


/**
 * Function where you perform something - for example loading of new category\'s items. see above.
 */
function updateURL() {
    console.log(\'fire\');
    // url = window.location.protocol + \'//\' + window.location.host + \'/\' + window.location.pathname + \'?\' + \'nazwa=pusty\';
    var updatedUrl = getUpdatedUrl(0); // i guess by default you want to display first page when changing a category.
    // do something with this ulr.
    console.log(updatedUrl);
    // so really you can do to load new items.
    post_ajax_get(updatedUrl);
}


/**
 *  Really simplified just loads whetever you pass in.
 * @param  URL url_to_load
 */
function post_ajax_get(url_to_load) {

    $("#loading-animation").show();

    $(\'#md-products\').load(url_to_load, function () {
        $("#loading-animation").hide();
    });
}


/**
 * It returns a URL bases on current category and UI states as well as receives pageNumber to load if it\'s paginated
 * 
 * @param pageNumber
 * @returns {string}  Url which you can load or work with.
 */
function getUpdatedUrl(pageNumber){
    var newUrl =  window.location.protocol + \'//\' + window.location.host + \'/\' + window.location.pathname;
    var query = \'nazwa=\';
    var time = \'gr=\';
    var output = \'\';

    $("[data-category-menu] a.current").each(function () {
        if ($(this).data(\'time\')) {
            if (time != \'gr=\') {
                time += \',\';
            };
            time += $(this).data(\'time\');
        }
        if ($(this).data(\'slug\')) {
            if (query != \'nazwa=\') {
                query += \',\';
            };
            query += $(this).data(\'slug\');
        }
        if (query != \'nazwa=\' && time == \'gr=\') {
            output = query;
        } else if (query == \'nazwa=\' && time != \'gr=\') {
            output = time;
        } else if (query != \'nazwa=\' && time != \'gr=\') {
            output = time + \'&\' + query;
        }
    });

    newUrl = newUrl + \'?\' + output;

    if ($(\'body.category\').length > 0 && output === \'\') {
        var cat = getCurrentCategoryFromPathName();
        newUrl = window.location.protocol + \'//\' + window.location.host + \'/\' + window.location.pathname + \'?\' + \'nazwa=\' + cat;
    }

    if(pageNumber){
        newUrl = newUrl + \'&md_page=\' + pageNumber;
    }

    return newUrl;
}

/**
 * Just extracted logic of getting category from path.
 * @returns string
 */
function getCurrentCategoryFromPathName(){
    return  window.location.pathname.split(\'/\')[3];
}
同样,这只是基于理解代码想要实现什么而对代码的盲目假设。所以这不是复制粘贴解决方案,但我希望它能帮助您找到好的解决方案。

相关推荐

使用AJAX向WooCommerce产品循环添加参数

我正在尝试为我的WooCommerce商店页面制作一个AJAX产品过滤器。之前,我自己创建了查询,没有使用商店页面。然而,我想让我的代码现在更兼容WC。目前,我可以从查询字符串中设置变量来过滤WooCommerce产品循环。我使用以下代码执行此操作: add_action(\'pre_get_posts\', \'filter_pre_get_posts\' ); function filter_pre_get_posts( $wp_query ) { if(