当我单击链接打开子窗口时,父页面会自动刷新。我怎样才能阻止它?
打开子窗口时,父页面不应刷新。这该怎么做?请帮我。
我的代码如下所示:
<html>
<head>
<title>login</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
var popup;
function ShowPopup(url) {
if(popup)
{
popup.close();
}
popup = window.open(url, "self", "toolbar=no,scrollbars=yes,location=no,statusbar=no,menubar=no,resizable=0,width=300,height=350,left = 0,top = 0");
popup.focus();
}
</script>
</head>
<body>
<a href="" onclick="ShowPopup('popup_login.asp')" style="color: #1686CC;">Sign In / Register</a>
</body>
</html>
最佳答案
您的页面刷新是因为不仅调用了您的函数,还调用了
执行a
标记指示的超链接。所以你发生了两件事
同时:
href
属性中的任何内容,即使它是空的。如果
href
为空,则表示:重新加载此页面。 onclick
事件处理程序也可以执行某些操作(打开弹出窗口),但是当前不会取消第一个效果。
在第一个反应中,可能只是删除有问题的
href
属性。这解决了问题,但又引入了另一个问题:您失去了所有的好处显示的超链接文本的样式(例如下划线,颜色,更改光标,跳位顺序等),
通常这不是您想要的。
这里有一些更方便的解决方案:
让
onclick
事件处理程序返回false
返回
false
将取消 anchor 的默认行为,并且href
属性的内容将被忽略:onclick="ShowPopup('popup_login.asp'); return false;"
如果您关心的是不支持javascript(或禁用了javascript)的浏览器,请放
url
属性中有意义的后备href
,例如:href="javascript_is_required.html"
使用
event.preventDefault
这是
return false
的替代方法。它的优点是您可以做到作为第一条指令执行,以便在其他代码中发生运行时错误时
它已经完成了它的工作:
onclick="event.preventDefault();ShowPopup('popup_login.asp');"
请注意,此
event
对象是所有浏览器在事件属性的上下文中定义的,并与
window.event
对象区分开来,后者不受支持所有浏览器。
在
href
中使用哈希符号给 anchor 一个名字
然后在
href
属性中引用该名称。这条路anchor 将自己导航到 View 中
它通常已经是用户单击它的时间:
name="loginlink" href="#loginlink"
您通常会看到较短的变体
href="#"
,但这会将页面滚动到顶部单击时,如果您确定该页面未向下滚动,则可能会确定。
尽管如此,使用“#”还是有副作用的:点击
url
会发生变化,以前的
url
放在浏览器的历史记录堆栈中。因此,如果在点击链接后按返回按钮,您留在页面上。这可能是不希望的。
使用
javascript:
协议(protocol)不执行任何操作href="javascript:"
这将使超链接在冒号之后执行任何JavaScript,并且从那里开始
没有那里,什么都不会发生。浏览器历史记录未修改。有变化
此方法,例如
javascript: return false;
或javascript: void(0);
使用
javascript:
协议(protocol)处理click
事件使用此解决方案,您不再使用
onclick
属性。相反,您移动代码到
href
属性:href="javascript: ShowPopup('popup_login.asp');"
布局和代码的分离
原始代码和所有上述解决方案仍然存在许多开发人员遇到的问题
不喜欢:
HTML
与javascript
代码混合在一起。最好将两者分开。可以按照以下步骤进行:
<a href="javascript_is_required.html" id="loginLink"
title="Click here to log on"> ... </a>
...
<script>
document.getElementById('mylink').onclick = function(e) {
e = e || event; // cross-browser way to get event object
e.preventDefault(); // cancel the default click behaviour
ShowPopup('popup_login.asp'); // your custom code comes here
return false; // cancel the default click behaviour
};
</script>
一些人也会这样说
有一个缺点:很难识别单击后执行的代码。
上面的代码会将事件处理程序附加到mylink的
click
事件元件。确保仅在文档加载后执行它。
事件处理程序取消默认点击
行为有两种方式。选择您喜欢的一个,或者根据需要选择两个。照原样
取消后,将永远不会执行对
href
属性值的导航。首先该行涉及浏览器的详细信息,因为较旧的IE浏览器未传递事件对象
作为事件处理程序的参数,但是公开一个全局
event
对象。如果您不必支持IE9之前的浏览器,则可以使用
用
addEventListener('click', myfunction);
代替onclick = myfunction;
以上代码。这具有许多优点:可以将更多事件处理程序附加到同一事件处理程序。事件,您也可以一一删除它们。
jQuery
提供良好的跨浏览器支持为此,使用.on()。
上述解决方案有几种变体,它们都有
好处和缺点。您甚至可以放弃使用 anchor 来实现此目的
并改用添加样式的其他元素。
关于javascript - 子窗口打开时如何停止刷新父页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33460296/