当 window.location=self.location 不起作用时通过 AJAX 重新加载页面
Posted
技术标签:
【中文标题】当 window.location=self.location 不起作用时通过 AJAX 重新加载页面【英文标题】:Reloading a page via AJAX when window.location=self.location doesn't work 【发布时间】:2010-09-15 22:03:01 【问题描述】:在我的主页上我得到了:
<ul id="login">
<li> <a id="loginswitch" href="./login-page">log-in</a> | </li>
<li> <a id="signupswitch" href="./signup-page">sign-up</a> </li>
</ul>
通过 MooTools,我通过 id 获取这些锚元素,这样一旦单击它们,就会在它们下方弹出一个华丽的 div,其中包含登录或注册表单(当然还有阻止事件传播的方法) 并且在填写完字段后,AJAX 调用就会启动 - 这应该创建一个会话并重新加载页面,以便用户可以看到他现在已经登录并且出现用户级控件等。
ajax 调用由 MooTools AJAX 类发起,evalScripts
选项设置为 true。 AJAX页面返回脚本代码:
<script type="text/javascript">window.location = self.location;</script>
这个系统完美运行 - 现在我想知道为什么如果我将锚的 href
值更改为 href="#"
我的脚本将不再工作?
跟窗户有关系吗?
当我点击一个链接时,它是否改变了它的属性,或者即使事件的传播停止了??
【问题讨论】:
【参考方案1】:转到页面上的锚点(#
表示的意思)不需要重新加载。
【讨论】:
【参考方案2】:window.location = self.location;
此 JavaScript 正在执行。
当它执行时,浏览器被告知将window.location
的值替换为一个新值。 并非所有浏览器都会在此处做出相同的反应。有些可能会按您的预期工作,但其他人会变得聪明并比较这两个值。 浏览器知道它在哪个页面上,并且它知道您只是要求它转到同一页面。
浏览器缓存
浏览器甚至在缓存中保存了您当前页面的副本。它可以与服务器对话并询问它在缓存中的页面是否仍然有效。如果缓存有效,它可能决定不强制重新加载页面。在幕后,这发生在 HTTP 标头中。浏览器和服务器可以通过多种方式通过 HTTP 进行通信。在这种情况下,您的浏览器会向服务器发送一个快速请求,内容如下:
GET /***.com/posts/196643/index.html
HTTP/1.1
Host: www.***.com
User-Agent: Mozilla/5.0
If-Modified-Since: Sun, 12 Oct 2008 20:41:31 GMT
这称为条件 GET 请求。通过说 If-Modified-Since,您的浏览器会说:“给我那个文件,但前提是它自我上次看到它以来已经被修改过。”
长话短说,您没有明确告诉浏览器重新加载页面。
您可以这样做:
location.reload( true );
“true”是一个可选参数,用于强制重新加载。浏览器甚至不会查看缓存。它会照你说的做。
【讨论】:
【参考方案3】:如果他们在工作中交给我这个特别的任务,我会把它踢回设计。除非我们谈论的是安全页面或 OpenID 登录,否则您不应弹出登录或登录表单。用户需要学会在他们的页面顶部寻找那个 https:,如果他们没有看到它就永远不要登录。
【讨论】:
以上是关于当 window.location=self.location 不起作用时通过 AJAX 重新加载页面的主要内容,如果未能解决你的问题,请参考以下文章
window.location.host 和 window.location.hostname 有啥区别 [重复]
一个关于window.location.href=window.location.href的问题?
如何在 jquery 或 javascript 中使用 window.location.replace
window.location.replace和window.location.href的区别
window.location.reload(false);window.location.reload(true);history.Go区别