如何在子窗口打开时停止刷新父页面?

当我点击链接打开子窗口时,父页面会自动刷新。 我怎么能阻止它?

打开子窗口时不应刷新父页面。 这该怎么做? 请帮我。

我的代码如下:

  login   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(); }    Sign In / Register   

您的页面刷新,因为不仅调用了您的函数,而且还执行了由a标记指示的超链接。 所以你有两件事同时发生:

  • 超链接本身导航到href属性中的任何内容,即使它是空的。 如果href为空,则表示:重新加载此页面。
  • onclick事件处理程序也可以执行某些操作(打开弹出窗口),但它当前不会取消第一个效果。

在第一个反应中,可能只是删除有问题的href属性。 这解决了这个问题,但又引入了另一个问题:你在显示的超链接文本上丢失了所有漂亮的样式(如下划线,颜色,更改光标,Tab键顺序……),这通常不是你想要的。

以下是一些更方便的解决方案:

onclick事件处理程序返回false

返回false将取消锚点的默认行为,并且将忽略href属性的内容:

 onclick="ShowPopup('popup_login.asp'); return false;" 

如果您关心没有javascript支持的浏览器(或禁用它),那么在href属性中放置一个有意义的回退url ,例如:

 href="https://stackoverflow.com/questions/33460296/how-to-stop-refreshing-parent-page-while-child-window-open/javascript_is_required.html" 

使用event.preventDefault

这是return false的替代方法。 它的优点是你可以将它作为第一条指令执行,这样如果在其他代码中发生运行时错误,它就已经完成了它的工作:

 onclick="event.preventDefault();ShowPopup('popup_login.asp');" 

请注意,此event对象由事件属性上下文中的所有浏览器定义,并且要与window.event对象区分开,而不是所有浏览器都支持该对象。

href使用哈希表示法

为锚点命名,然后在href属性中引用该名称。 通过这种方式,锚点将自己导航到视图中,当用户点击它时通常已经是这样:

 name="loginlink" href="#loginlink" 

您经常会看到较短的变化href="#" ,但这会在单击时将页面滚动到顶部,如果您确定页面未向下滚动,则可能没问题。 尽管如此,使用“#”会产生副作用:点击时, url发生变化,之前的url被放在浏览器的历史记录堆栈中。 因此,如果点击链接后按后退按钮,则会保留在页面上。 这可能是不希望的。

使用javascript:协议什么都不做

 href="javascript:" 

这将使超链接执行冒号后的任何javascript,并且因为没有,所以不会发生任何事情。 浏览器历史记录未修改。 这种方法有变化,比如javascript: return false; 或者javascript: void(0);

使用javascript:协议来处理click事件

使用此解决方案,您不再使用onclick属性。 而是将代码移动到href属性:

 href="javascript: ShowPopup('popup_login.asp');" 

布局和代码分离

原始代码和所有上述解决方案仍然存在许多开发人员不喜欢的问题: HTMLjavascript代码混合在一起。 最好将这两者分开。

这可以按如下方式完成:

  ...  ...  

一些人会说这也有一个缺点:识别点击执行的代码更难。 上面的代码将事件处理程序附加到mylink元素的click事件。 确保仅在文档加载后才执行它。 事件处理程序以两种方式取消默认单击行为。 选择您喜欢的,或两者都可以。 在取消时,永远不会执行到href属性值的导航。 第一行处理浏览器细节,因为较旧的IE浏览器不会将事件对象作为参数传递给事件处理程序,而是公开全局event对象。

如果您不必支持IE9以前的浏览器,可以使用addEventListener('click', myfunction);来提高addEventListener('click', myfunction); 而不是onclick = myfunction; 在上面的代码中。 这有许多优点:可以将更多事件处理程序附加到同一事件,您也可以逐个删除它们。 jQuery通过.on()为此提供了良好的跨浏览器支持。

上述解决方案有几种变体,都有其优点和缺点。 您甚至可以为此目的而不使用锚点,而是使用另一个元素而不是添加样式。

写返回false();window.open() JS方法之后。

如果上述代码段不起作用,请使用type="button"将默认的标记更改为普通的标记。 这将解决问题。

以下是代码段:

JavaScript的

  

只需在标签中添加type="button" 。 我知道这是多余的,但它有效!

由此:

  

对此: