Heim > Web-Frontend > js-Tutorial > Hauptteil

Js fängt globale Ajax-Anfragen ab

小云云
Freigeben: 2017-12-09 16:52:43
Original
1756 Leute haben es durchsucht

Hatten Sie jemals die folgenden Anforderungen: Sie müssen allen Ajax-Anfragen eine einheitliche Signatur hinzufügen, müssen zählen, wie oft eine bestimmte Schnittstelle angefordert wird, müssen die Methode zum Abrufen oder Posten von http-Anfragen einschränken , müssen die Netzwerkprotokolle anderer Leute analysieren. Warten Sie, also wie? Denken Sie darüber nach: Wenn Sie alle Ajax-Anfragen abfangen können, wird das Problem sehr einfach!


Verwendung

1. Stellen Sie das Skript direkt vor

  1. Ajaxhook.js vorstellen

    <script src="wendu.ajaxhook.js"></script>
    Nach dem Login kopieren
  2. Den erforderlichen Ajax-Rückruf oder die erforderliche Funktion abfangen.

    hookAjax({
        //拦截回调
        onreadystatechange:function(xhr){
            console.log("onreadystatechange called: %O",xhr)
        },
        onload:function(xhr){
            console.log("onload called: %O",xhr)
        },
        //拦截函数
        open:function(arg){
         console.log("open called: method:%s,url:%s,async:%s",arg[0],arg[1],arg[2])
        }
    })
    Nach dem Login kopieren

ok, wir verwenden die get-Methode von jQuery (v3.1) zum Testen:

// get current page source code 
$.get().done(function(d){
    console.log(d.substr(0,30)+"...")
})
Nach dem Login kopieren

Ergebnis:

> open called: method:GET,url:http://localhost:63342/Ajax-hook/demo.html,async:true
> onload called: XMLHttpRequest
> <!DOCTYPE html>
  <html>
  <head l...
Nach dem Login kopieren

Abfangen erfolgreich! Wir können auch sehen, dass jQuery3.1 onreadystatechange aufgegeben und stattdessen onload verwendet hat.

2. In der Modul-Building-Tool-Umgebung unter CommonJs

Vorausgesetzt, es befindet sich unter Webpack, besteht der erste Schritt darin, das Ajax-Hook-NPM-Plug-In zu installieren

npm install ajax-hook --save-dev
Nach dem Login kopieren

Der zweite Schritt besteht darin, das Modul vorzustellen und die API aufzurufen:

const ah=require("ajax-hook")
ah.hookAjax({ 
  onreadystatechange:function(xhr){ ... },
  onload:function(xhr){ ... }, 
  ...
})
...
ah.unHookAjax()
Nach dem Login kopieren

API

hookAjax(ob)

  • ob, der Typ ist ein Objekt und der Schlüssel ist der Rückruf oder die Funktion, die Sie abfangen möchten. Der Wert ist unsere Abfangfunktion.

  • Rückgabewert: Original XMLHttpRequest. Wenn Sie eine Schreibanforderung haben und nicht abgefangen werden möchten, können Sie new this verwenden.

unHookAjax()

  • Deinstallieren Sie das Abfangen. Nach der Deinstallation ist das Abfangen ungültig.

Ajax-Verhalten ändern

Alle Ajax-Anfragen abfangen, die Anfragemethode erkennen, wenn sie „GET“ ist, die Anfrage unterbrechen und eine Eingabeaufforderung geben

hookAjax({
  open:function(arg){
    if(arg[0]=="GET"){
      console.log("Request was aborted! method must be post! ")
      return true;
    }
  } 
 })
Nach dem Login kopieren

Alle Ajax-Anfragen abfangen und Zeitstempel zu den Anfragen hinzufügen

hookAjax({
  open:function(arg){
    arg[1]+="?timestamp="+Date.now();
  } 
 })
Nach dem Login kopieren

Ändern Sie die von der Anfrage zurückgegebenen Daten „responseText“

hookAjax({
   onload:function(xhr){
    //请求到的数据首部添加"hook!" 
    xhr.responseText="hook!"+xhr.responseText;
   }
 })
Nach dem Login kopieren

Ergebnis:

hook!<!DOCTYPE html>
<html>
<h...
Nach dem Login kopieren

Ja, mit diesen Beispielen glaube ich, dass sich die eingangs genannten Anforderungen leicht umsetzen lassen. Testen Sie abschließend unHook

   hookAjax({
        onreadystatechange:function(xhr){
            console.log("onreadystatechange called: %O",xhr)
            //return true

        },
        onload:function(xhr){
            console.log("onload called")
            xhr.responseText="hook"+xhr.responseText;
            //return true;
        },
        open:function(arg){
          console.log("open called: method:%s,url:%s,async:%s",arg[0],arg[1],arg[2])
          arg[1]+="?hook_tag=1";

        },
        send:function(arg){
         console.log("send called: %O",arg[0])
        }
    })

    $.get().done(function(d){
        console.log(d.substr(0,30)+"...")
        //use original XMLHttpRequest
        console.log("unhook")
        unHookAjax()
        $.get().done(function(d){
            console.log(d.substr(0,10))
        })

    })
Nach dem Login kopieren

Ausgabe:

open called: method:GET,url:http://localhost:63342/Ajax-hook/demo.html,async:true
send called: null
onload called
hook<!DOCTYPE html>
<html>
<he...
unhook
<!DOCTYPE
Nach dem Login kopieren

Hinweis

  1. Der Rückgabewert der Abfangfunktion ist ein boolescher Wert, falls vorhanden wahr ist, werden Ajax-Anfragen blockiert, der Standardwert ist falsch, die Anfrage wird nicht blockiert.

  2. Die Parameter aller Rückruf-Abfangfunktionen sind die aktuelle XMLHttpRequest-Instanz, z. B. onreadystatechange, onload; alle Abfangfunktionen der Ajax-Originalmethode übergeben die ursprünglichen Parameter an die Abfangfunktion in Form eines Arrays. Sie können dies in der Interceptor-Funktion ändern.

Verwandte Empfehlungen:

Lösung für das Abfangen von window.open() beim Öffnen eines neuen Fensters nach erfolgreicher Ajax-Anfrage

Ajax-Rückruf zum Öffnen eines neuen Formulars, um das Abfangen des Browsers zu verhindern, ist eine wirksame Methode

Über die Implementierung der Submit-Methode mithilfe von JavaScript zum Abfangen von Formularen

Das obige ist der detaillierte Inhalt vonJs fängt globale Ajax-Anfragen ab. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage