自動的にブロックするAJAX JavaScriptを書き、データをダウンロードします

<!DOCTYPE HTML> 
<HTML LANG = "ZH"> 
<HEAD> 
	<METAのcharset = "UTF-8"> 
	<META NAME = "ビューポート"コンテンツ= "幅=デバイス幅、初期スケール= 1.0"> 
	<メタHTTP-当量= "X - UA互換"コンテンツ= "IE =エッジ"> 
	<タイトル> </ TITLE> 
</ HEAD> 
<BODY> 
</ BODY> 
<スクリプトタイプ= "テキスト/ JavaScriptを" SRC = " JS / jQueryの-3.3.1.min.js "> </ SCRIPT> 
<スクリプトタイプ="テキスト/ JavaScriptを「> 
//自動的にAJAXのスクリプトをダウンロードし
、フラグに(関数($、ホスト){ 
	)旗で(IF! { 
		//あなたがダウンロードデータを閉じた場合は、何もしない、それ以外の場合は、AJAXリクエストがデータダウンロード返さインターセプトし
		、リターンを; 
	} 
	VARアヤックス= $アヤックス。//キャッシュ元アヤックス
	$アヤックス=機能(OPT){ 
		opt.success =機能(RES){ 
		VAR =成功opt.success ||機能(){};
		VaRのURL = opt.url || ""; 
			{しようと
				するvar名= url.splitを( "?")[0]; 
				IF(ホスト){ 
					名前= name.replace(ホスト、 ""); 
				} 
				名前= name.replace(/ \ // gを、 "_")。
				downData(RES、 `$ {名前} .json`)。
			}キャッチ(E){ 
				console.warn(E); 
			} 
			成功(RES)。
		} 
		AJAX(OPT)を返します。
	} 
	関数downData(データ名){ 
		IF(typeof演算データ== "オブジェクト"){ 
			データ= JSON.stringify(データ)。
		} 
		VARブロブ=新たなBLOB([データ]、{ 
		  タイプ: 'text / htmlの、文字セット= UTF-8'    
		})。
		window.URL = window.URL || window.webkitURL; 
		するvar A =ドキュメント。
		a.setAttribute( "ダウンロード"、名前|| "data.json"); 
		a.href = URL.createObjectURL(BLOB)。
		a.click(); 
	} 
})($、真、 "https://www.easy-mock.com"); 
 
//自动下载数据
$アヤックス({ 
	URL: "https://www.easy-mock.com/mock/5bb02bc0a0afc503f502a292/example/demo/secret"、
	成功(RES){ 
		はconsole.log(RES); 
	} 
} )
</スクリプト> 
</ HTML>

  

XHRを使用し、ネイティブの傍受をフェッチ

 

//自动下载AJAX的脚本
	//命名空间
	window.ajax_interceptor_manny = { 
		設定:{ 
			switchOn:偽、
			switchQuery:偽
		}、
		originalXHR:window.XMLHttpRequest、
		myXHR:関数(){ 
			にconsole.log(」--- AJAX拦截---「)
			pageScriptEventDispatched = falseをしましょう。
			CONST modifyResponse =()=> { 
				//this.responseText = overrideTxt。
				//this.response = overrideTxt。
				(pageScriptEventDispatched){もし
					返します。
				} 
				pageScriptEventDispatched = TRUE。
				ajax_interceptor_manny.download(this.responseText、this.responseURL)。
			}

			属性が外部に露出し、これにコピーされ、XHRする新しいパラメータネイティブを必要としません// XMLHttpRequestを
			、constのajax_interceptor_manny.originalXHRのXHR =()新しい

			ため(LETのXHR attrの中){ 
				IF(ATTR ===「onreadystatechangeに「){ 
					xhr.onreadystatechange =(引数...)=> { 
						(this.readyState == == 200 this.status &&あれば4){ 
							//要求が成功した
							(ajax_interceptor_manny.settings.switchOn IF){ 
								//オープン傍受
								ModifyResponse(); 
							} 
						} 
						this.onreadystatechange && this.onreadystatechange.apply(この、引数); 
					} 
					続行; 
				}そうでなければ(ATTR === 'のonload'){IF 
					xhr.onload =(引数...)=> { 
						//リクエストが成功しました
						IF(ajax_interceptor_manny.settings.switchOn){ 
							//开启拦截
							modifyResponse()。
						} 
						this.onload && this.onload.apply(この、引数)。
					} 
					続けます。
				} 

				IF(typeof演算のXHR [ATTR] === '関数'){ 
					この[ATTR] = XHR [ATTR] .bind(XHR)。
				}他{ 
					(ATTR === 'responseText' || ATTR === '応答'){もし
						VARのK = "_" + ATTR。
						Object.defineProperty(この、ATTR、{ 
							得る:()=>この[K] ==未定義XHR [ATTR]:この[k]は、?
							セット:(ヴァル)=>この[K] =ヴァル、
						})。
					}他{ 
						Object.definePropertyは(これは、ATTR、{ 
							取得します:
							セット:(ヴァル)=> XHR [ATTR] =ヴァル、
						})。
					} 
				} 
			} 
		}、
		originalFetch:window.fetch.bind(ウィンドウ)、
		myFetch:関数(...引数){ 
			にconsole.log( "--- ---拦截フェッチ")
			ajax_interceptor_manny.originalFetch(...引数を返します).then((応答)=> { 
				IF(response.ok){ 
					response.clone()テキスト()を((RES)=> {。。
						ajax_interceptor_manny.download(RES、response.url); 
					})。キャッチ((E)=> { 
						console.warn(E)
					}); 
				} 
				戻り応答; 
			}); 
		}、 データ、URL)をダウンロード{ 
			{みてください
				IF(ajax_interceptor_manny.settings.switchOn){ 
					IF(typeof演算データ== "オブジェクト"){ 
						データ= JSON.stringify(データ)。
					} 
					VARブロブ=新たなBLOB([データ]、{ 
						タイプ: 'text / htmlの、文字セット= UTF-8' 
					})。
					window.URL = window.URL || window.webkitURL; 

					VAR名= URL; 
					(もし!:> = 0 || url.indexOf( "https://で")(url.indexOf( "// HTTP")> = 0)){ 
						//不存在域名
						URL = window.origin + URL。//手动添加一个、避免URL解析出错
					} 
					{しようと
						するvar uは=新しいURL(URL); 
						名前= u.pathname。
						もし(ajax_interceptor_manny.settings.switchQuery){  
							//パラメータを取る必要があります
							名=名+ "$" + u.search.replace(」
					}キャッチ(E){} 
					名前= name.replace(新しい正規表現( "//"、 "G")、 "/")。
					名前= name.replace(新しい正規表現( "/"、 "G")、 "_")。
					名前=名前+「.json」。
					するvar A =のdocument.createElement( "A"); 
					a.setAttribute( "ダウンロード"、名前|| "data.json"); 
					a.href = URL.createObjectURL(BLOB)。
					a.click(); 
				} 
			}キャッチ(E){ 
				console.error( "下载数据失败"、E)。
			} 

		}、

		setSetting(データ){ 
			IF(typeof演算データ== "オブジェクト"!){ 
				リターン。
			} 
			} 
		} 
		のinit(){ 
			窓。XMLHttpRequestを= ajax_interceptor_manny.myXHR。
			window.fetch = ajax_interceptor_manny.myFetch。 
		} 
	} 
ajax_interceptor_manny.init()。
ajax_interceptor_manny.setSetting({ 
	switchOn:真
})。

  

 

これは、ブラウザのプラグインとして書かれ、傍受することができます。

 

プラグインコード住所:  https://gitee.com/muand/ajaxDown/tree/master/ajaxDown

 

おすすめ

転載: www.cnblogs.com/muamaker/p/11462905.html