2016-06-27 17 views
0

OK, also habe ich es mit einer Website zu tun, die ASP.NET Web Forms verwendet. Es enthält viele Hyperlinks, die eine href der Form javascript:__doPostBack(... enthalten, die unglaublich nervig ist, weil Sie nicht auf den Hyperlink klicken können, um die Seite in einem neuen Fenster zu öffnen, wie Sie es mit einem gewöhnlichen Hyperlink tun würden. Ich versuche, ein Benutzer-Skript zu erstellen, das das beheben wird. Bisher bin ich auf dieses Problem gekommen, das größtenteils funktioniert. Der einzige Nachteil, auf den ich gestoßen bin, ist der, dass wenn ich einen Link klicke, um ein neues Fenster zu öffnen, und dann versuche, einen anderen Postback-Link auf der Originalseite zu klicken, bringt es mich manchmal auf die falsche Seite.Wie aktiviert man das mittlere Klicken von Postback-Hyperlinks?

Kennt jemand einen besseren Weg, damit umzugehen?

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(); 
      } 
     }); 
    } 
} 

Antwort

0

zu unhandlich für einen Kommentar hier ist also eine Teilantwort ...

Probleme:

  1. Die Frage ist wirklich eine MCVE was braucht, in diesem Fall wären die Der Code der Frage PLUS ein Link zu einer beleidigenden Website.
    Für Ihr großes Problem (Links zu falschen Ort) ist dies besonders erforderlich.

    Beachten Sie, dass die Website kann auch als eine Zustandsmaschine in Betrieb sein (in der Regel eine schlechte Praxis), so dass Ihr einzigen Möglichkeit könnte zu auto-reload, die ursprüngliche Seite (in einer echten, ausgeblendet oder Popup-Weise) vor feuern die missverstandenen Links. Asp.net und Banking-Websites sind besonders schlecht über diese Art von Design.

  2. Der Code geht davon aus, dass es nur ein Formular gibt. Dies ist keine gute Annahme, auch wenn es wahr ist, wenn Sie eine Seite an einem bestimmten Punkt überprüfen.

  3. Sie sich von document.querySelector('form'); befreien und:
    A) Verwenden let links = document.querySelectorAll("form a[href*='doPostBack']");
    B), um das übergeordnete Formular finden den Klick Rückruf von innen. Siehe dazu die Logik this answer.
    C) Die anonyme Funktion in einer Schleife ist ein Leistungsproblem. Verwenden Sie eine benannte Funktion, die außerhalb der Schleife definiert ist.
    D) Die Verwendung von eval() ermöglicht böswilligen JS unaussprechliche Übel zu tun. Analysieren Sie die 1 oder 2 Argumente zu __doPostBack(). Sie sind immer Saiten. Rufen Sie dann direkt window.__doPostBack() oder unsafeWindow.__doPostBack() an.
  4. Dieser Ansatz funktioniert nicht mit Steuerelementen, die mit AJAX-Techniken erstellt wurden. Aber das scheint in Ihrem Fall nicht erforderlich zu sein.
+0

1. Leider kann ich keinen Link zur Verfügung stellen, da die betreffende Seite nicht öffentlich ist. 2. Ich weiß nichts über ASP.NET Web Forms, aber ich denke eine Einschränkung ist, dass Sie auf ein Formular beschränkt sind (die gesamte Seite ist ein großes Formular). Außerdem gibt es (leider) keine AJAX. –

+0

Plain Vanilla asp.net hat ein Standard-One-Form-Schema. Aber die Leute haben das jahrelang [gearbeitet] (http://stackoverflow.com/questions/1663355/asp-net-more-than-1-form). Es ist eine schlechte Annahme, in irgendeinen Code einzubauen. –

+0

Danke für die Hilfe. Ich denke, es ist definitiv ein Problem mit dem Staat. Der Aufruf von 'window.location.reload()' auf der übergeordneten Seite "behebt" das Problem, dass einige Links nicht mehr auf die richtige Seite verweisen, sondern dass die Seite jedes Mal aktualisiert wird, wenn Sie auf einen Link klicken. Meine Abhilfe besteht darin, ein neues Fenster zu öffnen und das DOM vom Patent her zu klonen. Dann finde ich den Link, der in der Elternmitte geklickt wurde und simuliere einen Linksklick darauf. Sehr hackisch, aber das scheint zu funktionieren. –