9

在我的主页上,我得到:

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

跟窗户有关系吗?

当我点击一个链接时,它是否改变了它的属性,或者即使事件的传播停止了?

4

3 回答 3

20
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”是一个可选参数,用于强制重新加载。浏览器甚至不会查看缓存。它会照你说的做。

于 2008-10-13T03:32:19.817 回答
1

转到页面上的锚点——这#意味着——不需要重新加载。

于 2008-10-08T02:25:40.513 回答
0

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

于 2008-10-19T22:48:06.283 回答