当 window.location=self.location 不起作用时,通过 AJAX 重新加载页面

Reloading a page via AJAX when window.location=self.location doesn't work

本文关键字:location 加载 新加载 通过 self window 不起作用 AJAX      更新时间:2023-09-26

在我的主页上,我得到了:

<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="#"我的脚本将不再工作?

它与窗户有什么关系吗?

当我单击链接时,即使事件的传播停止,它是否更改了其属性?

window.location = self.location;

此 JavaScript 正在执行

当它执行时,浏览器被告知将window.location的值替换为新值。 并非所有浏览器都会在这里做出相同的反应。有些可能会按您的预期工作,但其他人会对此很聪明并比较这两个值。 浏览器知道它在哪个页面上,并且知道您只是要求它转到同一页面。

浏览器缓存

浏览器甚至在缓存中具有当前页面的副本。 它可以与服务器通信,并询问缓存中的页面是否仍然有效。 如果缓存有效,它可能会决定不强制重新加载页面。 在幕后,这发生在 HTTP 标头上。 浏览器和服务器可以通过多种方式通过 HTTP 进行通信。 在这种情况下,您的浏览器会向服务器发送一个快速请求,内容如下:

GET /stackoverflow.com/posts/196643/index.html
HTTP/1.1
Host: www.stackoverflow.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"是一个可选参数,用于强制重新加载。 浏览器甚至不会查看缓存。它会按照你说的做。

转到页面上的锚点 - 这就是#表示的 - 不需要重新加载。

如果他们在工作中把这个特殊的任务交给我,我会把它踢回设计中。 除非我们谈论的是安全页面或OpenID登录,否则您不应弹出登录或登录表单。 用户需要学会在页面顶部查找https:,如果看不到它,则永远不要登录。