手动输入网址以移动到下一页时,Chrome加载脚本两次

时间:2015-07-04 01:08:05

标签: javascript html asp.net visual-studio google-chrome

我有一个奇怪的问题,我认为可能是Chrome错误或可能是Visual Studio的错误。我的脚本加载了两次。为了验证这个问题,我创建了一个测试脚本,该脚本设置一个带有时间戳的cookie,以显示代码被附加两次。如果我通过超链接导航到页面,它工作正常。此外,如果我点击来回按钮它也可以正常工作 - 但如果我在浏览器中手动输入第二页的网址,则会调用脚本两次

这只发生在Chrome中,只有在使用Asp.Net Web应用程序时才会发生。 如果我使用的是Asp.Net网站,则不会发生。这些是新的空Web应用程序,没有更改文件或设置。

我的示例html页面如下所示:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Page 1</title>
    <script src="chromebug.js"></script>
</head>
<body>
    <h1>Page 1</h1>
    <a href="page1.html">Page 1</a>
    <a href="page2.html">Page 2</a>
    <a href="page3.html">Page 3</a>
</body>
</html>

并且chromebug.js看起来像这样:

function getCookieTest(name) {
    var cookie, cookies = document.cookie.split(';');
    name = name + '=';
    while ((cookie = cookies.pop())) {
        cookie = cookie.replace(/^\s+/, '');
        if (cookie.indexOf(name) === 0) {
            return cookie.substring(name.length, cookie.length);
        }
    }

    return null;
}

function setCookieTest(name, value, secs) {
    var c;
    if (secs > 0) {
        c = new Date();
        c.setSeconds(c.getSeconds() + secs);
        c = name + '=' + value + '; expires=' + c.toGMTString() + '; path=/';
    } else {
        c = name + '=' + value + '; path=/';
    }
    document.cookie = c;
    return
}

console.log('chromebug loaded');
var getdata = getCookieTest('loaded') || '';
setCookieTest('loaded', getdata.toString() + document.title + ':' + new Date().getTime().toString() + '|', 10000);
getdata = getCookieTest('loaded');
console.log(getdata); // show what has been saved in the cookie

我错过了什么吗?有办法解决这个问题吗?

我甚至创建了一个展示问题的视频: http://screencast.com/t/MpXfbDMBvfY

2 个答案:

答案 0 :(得分:2)

当用户在地址栏中手动输入网址时,Chrome看起来有非显而易见的行为。您可以使用Chrome live http标头之类的工具来捕捉此行为。

答案 1 :(得分:1)

非常感谢stdob指向我的Live HTTP Headers扩展。如果您遇到类似问题我会推荐它。 https://chrome.google.com/webstore/detail/live-http-headers/iaiioopjkcekapmldfgbebdclcnpgnlo?hl=en

我的问题是Google Chrome预取优化问题。当您在地址栏中输入内容时,Google会预测您要加载的页面并开始下拉脚本。如果您的脚本在加载时执行某些加载或cookie操作,则会出现问题。取消选中此选项后,您应该会看到重复的加载消失。

但是,这是一种在不更改设置的情况下控制此操作的简便方法。这一点尤其重要,因为您无法控制最终用户的设置。

if (document.webkitVisibilityState && document.webkitVisibilityState == 'prerender') {
// avoid performing load logic
}