javascript html5历史,变量初始化和popState

时间:2012-01-18 11:14:28

标签: javascript jquery ajax html5 browser-history

主要问题

是否有一种javascript方式可以识别我们是否第一次访问某个网页,或者这是一个原因?

我的问题

我正在我的ajax驱动的网页中实现html5导航。

在主脚本上,我使用一些值初始化变量。

<script>
    var awnsers=[];
    process(awnsers);
<script>

进程(awnsers)将使用ajax根据给定的awnsers更新视图。

在调用ajax并替换视图的函数中,我存储了历史记录

history.pushState(state, "", "");

我也定义了popstate,我根据后面恢复了视图。此外,我修改了旧值的全局变量awnsers。

function popState(event) {
if (event.state) { 
    state = event.state;
    awnsers=state.awnsers;
    updateView(state.view);
}
}

导航(来回)除了当我转到外部页面,然后按下(再次转到我的页面)之外。 当我们访问页面时,首先调用主脚本,更新可用的awnsers,然后启动ajax。 Meanwile,调用pop状态事件,并更新视图。之后,主要的ajax结束,并根据空值更新视图。

所以我需要代码:

<script>
    var awnsers=[];
    process(awnsers);
<script>

仅在用户进入页面时调用,而不是在用户进入页面时调用。有什么办法吗?

谢谢!

可能的解决方案 在第一个芒果之后,我想到了一个可能的解决方案。经过测试和工作,无论谁,我都不知道是否有更清洁的解决方案。我添加了我已经完成的更改。

首先我添加:

$(function() {
justLoaded=true;
});

然后我修改了popState函数,因此负责初始化变量

function popState(event) {
if (event.state) { 
    state = event.state;
    awnsers=state.awnsers;
    updateView(state.view);
} else if(justLoaded){
       awnsers=[];
       process(awnsers);
    }
    justLoaded=false;
}

多数人。

3 个答案:

答案 0 :(得分:1)

使用全局变量怎么样?

var hasLoaded = false;

// this function can be called by dom ready or window load 
function onPageLoad() {
   hasLoaded = true;
}

// this function is called when you user presses browser back button and they are still on your page
function onBack() {
   if (hasLoaded) {
      // came by back button and page was loaded
   }
   else {
      // page wasn't loaded. this is first visit of the page
   }
}

答案 1 :(得分:1)

使用cookie存储当前状态。

答案 2 :(得分:1)

是啊!这就是我所拥有的:

var popped = (($.browser.msie && parseInt($.browser.version, 10) < 9) ? 'state' in window.history : window.history.hasOwnProperty('state')), initialURL = location.href;
$(window).on('popstate', function (event) {
    var initialPop = !popped && location.href === initialURL, state;
    popped = true;
    if (initialPop) { return; }

    state = event.originalEvent.state;          
    if (state && state.reset) {
        if (history.state === state) {
            $.ajax({url: state.loc,
                success: function (response) {
                    $(".fragment").fadeOut(100, function () {
                        $(".fragment").html($(".fragment", response).html()).fadeIn(100);
                    );
                    document.title = response.match(/<title>(.*)<\/title>/)[1];
                }
            });
        } else { history.go(0); }
     else {window.location = window.location.href; }
});

$.ajax({url:link,
    success: function (response) {
        var replace = args.replace.split(",");
        $.each(replace, function (i) {
            replace[i] += ($(replace[i]).find("#video-content").length > 0) ? " #video-content" : "";
            var selector = ".fragment "+replace[i];
            $(selector).fadeOut(100, function () {
                $(selector).html($(selector,response).html()).fadeIn(100, function () {
                    if (base.children("span[data-video]")[0]) {
                        if ($.browser.msie && parseInt($.browser.version, 10) === 7) {
                            $("#theVideo").html("");
                            _.videoPlayer();
                        } else {
                            _.player.cueVideoById(base.children("span[data-video]").attr("data-video"));
                        }
                    }
                });
            });
        });
        document.title = response.match(/<title>(.*)<\/title>/)[1];
        window.history.ready = true;
        if (history && history.pushState) { history.pushState({reset:true, loc:link}, null, link); }
    }
});