2016-11-21 140 views
0

我有以下的HTML标记为什么“在新选项卡中打开”发送GET请求?

<a href="#" id="navBar_navBarInput_3_subNavDropdownInput_0_subNavLinkInput_0" onclick="redirectPost(4,'EntryData.aspx');">My Link</a> 

JavaScript的“redirectPost”

function redirectPost(id, url) { 
      post(url, { id: id }); 
     } 

function post(path, params, method) { 
      method = method || "post"; 
      var form = document.createElement("form"); 
      form.setAttribute("method", method); 
      form.setAttribute("action", path); 

      for (var key in params) { 
       if (params.hasOwnProperty(key)) { 
        var hiddenField = document.createElement("input"); 
        hiddenField.setAttribute("type", "hidden"); 
        hiddenField.setAttribute("name", key); 
        hiddenField.setAttribute("value", params[key]); 

        form.appendChild(hiddenField); 
       } 
      } 

      document.body.appendChild(form); 
      form.submit(); 
     } 

这里的交易:当我只需点击链接时,页面将定期POST请求。但是每当我使用“在新选项卡中打开”选项时,它会发送一个GET请求,这对我来说是一个问题,因为我做了一些验证背景。

有没有人有任何想法为什么这样表现?

谢谢!

回答

1

因为点击链接会激活点击处理程序;右键单击它并选择“在新选项卡中打开”不会,它只会读取href并使用它打开一个新选项卡。

在某些浏览器上,您可以通过挂钩contextmenu事件并阻止其默认操作来覆盖上下文菜单。但是,这并不适用于所有浏览器。基本上,如果你的链接不是一个真正的链接,而是一个按钮,它应该是button(或input type="button"),而不是a。你可以设计这些风格,看看你希望他们看起来如何。使用正确的元素将有助于浏览器为该元素的用户提供正确的选项。

1
  1. 您无法在新选项卡中打开javascript。

  2. 你可以使用onclick="return redirectPost...."并添加return false给你的函数或event.preventdefault()到开始的结束,但仍然不会允许你使用鼠标右键在新标签页中打开

  3. ,但只是改变你的链接到一个提交按钮,然后像往常一样提交表单,提交隐藏字段的设置

+0

此外,'form.submit'将覆盖链接的以下内容,因此不需要返回'(尽管当然这是最好的)。 –

+0

如果在脚本 – mplungjan

+1

:-)中出现错误,在顶部的preventDefault将是最好的。一般来说,现代事件处理,真的...... –