如何启用回传超链接的中间点击?

时间:2016-06-27 05:25:48

标签: javascript html asp.net userscripts

好的,所以我正在处理使用ASP.NET Web Forms的网站。它包含许多超链接,其中包含javascript:__doPostBack(...形式的href,这非常令人讨厌,因为您不能像在普通超链接中那样在新窗口中单击超链接以打开页面。我想找到一个能解决这个问题的用户脚本。到目前为止,我已经想出了这个,这似乎在很大程度上起作用。我遇到的一个警告是,如果我中间点击链接打开一个新窗口,然后尝试单击原始页面上的另一个回发链接,有时会将我带到错误的页面。

有谁知道更好的方法来解决这个问题?

let form = document.querySelector('form');
let links = document.querySelectorAll('a');

for (let link of links) {
    if (link.href.startsWith('javascript:')) {
        link.addEventListener('click', function(e) {
            if (e.button === 1) {
                form.setAttribute('target', '_blank');
                eval(this.href.slice(11));
                form.removeAttribute('target');
                e.preventDefault();
            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

评论过于笨拙,所以这里有部分答案......

的问题:

  1. 这个问题确实需要一个MCVE,在这种情况下,问题的代码会链接到违规网站。
    对于你的大问题(链接到错误的地方),这是特别需要的。

    请注意,该网站也可能作为状态机运行(通常是一种不良做法),因此您唯一的追索权可能是自动重新加载原始页面(在真实,隐藏或弹出行为方式)然后解雇行为不端的链接。 Asp.net和银行网站对这种设计特别不好。

  2. 代码假设只有一个表单。即使在某一点检查页面时它是正确的,这也不是一个好的假设。

  3. 摆脱document.querySelector('form');和:
    A)使用let links = document.querySelectorAll("form a[href*='doPostBack']");
    B)从单击回调中查找父表单。请参阅this answer处的逻辑 C)循环中的匿名函数是性能问题。使用在循环外定义的命名函数 D)使用eval()将允许恶意JS做无法形容的邪恶。将1或2个参数解析为__doPostBack()。它们总是弦乐。然后直接致电window.__doPostBack()unsafeWindow.__doPostBack()
  4. 该方法不适用于通过AJAX技术创建的控件。但在您的情况下似乎并不需要这样做。