open example ejemplo javascript cross-browser xmlhttprequest

javascript - example - ¿Cómo convertir Msxml2.XMLHTTP en un sitio web solo para IE, así que también funciona con Firefox?



xmlhttprequest response (2)

Este es un sitio web solo para IE, que quiero usar con otros navegadores, por ejemplo Firefox:

https://golestan.sbu.ac.ir/Forms/AuthenticateUser/login.htm

Estoy obligado a usar este sitio web para mi universidad. Utiliza Msxml2.XMLHTTP , que es una característica solo de IE. Traté de convertirlo a XMLHttpRequest para que funcione solo en Firefox. Este es el script de Greasemonkey que he creado. Ahora no da error, pero no funciona. Todas las funciones provienen del script original del sitio web, pero se modifican para que funcionen con XMLHttpRequest . Si aparece el script de inicio de sesión, estoy de acuerdo. ¿Cómo puedo depurar este javascript?

// ==UserScript== // @name Golestan Login // @namespace sbu.ac.ir // @include https://golestan.sbu.ac.ir/Forms/AuthenticateUser/login.htm // @version 1 // @grant none // ==/UserScript== var isInternetExplorer = 0; function check(){ var x; if (window.XMLHttpRequest) { x = new XMLHttpRequest(); } else { try { x = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { x = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { x = false; } } } x.open("HEAD",document.location,true); x.send(); var sd=new Date(x.getResponseHeader(''Last-Modified'')); var cd=new Date(document.lastModified); if(sd-cd>3660000){ document.cookie = "reloading=1"; window.location.reload(true); return false; } return true; } function a(){ for (k = 0; k < nall; k++) { td = document.createElement(''TD''); td.className = ''e''; Pr.appendChild(td); } if (!check()) { //window.open("/_Templates/howtoclearcache.htm","_blank"); //top.close(); return; } var aCookie = document.cookie.split("; "); var cook=0; for (var i=0; i < aCookie.length; i++) { var aCrumb = aCookie[i].split("="); if ("reloading" == aCrumb[0]) { cook=unescape(aCrumb[1]); break; } } var ind=0; for( i=0;i<all.length;i=i+2){ if(all[i+1]==1) for(j=0;j<4;j++){ var r; if (window.XMLHttpRequest) { r = new XMLHttpRequest(); } else { try { r = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { r = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { r = false; } } } r.open("GET", all[i]+imstat[j]+".gif", true); if(cook==1) r.setRequestHeader(''If-Modified-Since'',''Sat,01 Jan 2000 00:00:00 GMT''); getobj(r,ind++); } else{ var r; if (window.XMLHttpRequest) { r = new XMLHttpRequest(); } else { try { r = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { r = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { r = false; } } } r.open("GET", all[i], true); if(cook==1) r.setRequestHeader(''If-Modified-Since'',''Sat,01 Jan 2000 00:00:00 GMT''); getobj(r,ind++); } } document.cookie = "reloading=0; expires=Fri, 31 Dec 1999 23:59:59 GMT;"; } function main_DoFSCommand(command, args) { var mainObj = document.all.main; // // Place your code here. // document.getElementById("rdir").style.visibility = "hidden"; if(command != "showmenu") if(command == "Animation_Complete") { var x = 0; var y = 0; x = main.clientHeight/2 - 300; y = main.clientWidth/2 - 400; document.getElementById("iframeNews").style.top = x + 120; document.getElementById("iframeNews").style.left = y + 264; modifySrc(); document.getElementById("iframeNews").style.visibility = "visible"; } else { if(command == "Enter") { bal(''main''); } else if(command == "Education") { bal(''test''); } else document.getElementById("iframeNews").style.visibility = "hidden"; } } // http://stackoverflow.com/questions/21271997 addJS_Node (check); addJS_Node (a); addJS_Node (main_DoFSCommand); isInternetExplorer=true; function addJS_Node (text, s_URL, funcToRun, runOnLoad) { var D = document; var scriptNode = D.createElement (''script''); if (runOnLoad) { scriptNode.addEventListener ("load", runOnLoad, false); } scriptNode.type = "text/javascript"; if (text) scriptNode.textContent = text; if (s_URL) scriptNode.src = s_URL; if (funcToRun) scriptNode.textContent = ''('' + funcToRun.toString() + '')()''; var targ = D.getElementsByTagName (''head'')[0] || D.body || D.documentElement; targ.appendChild (scriptNode); }

Creo que vale la pena hacer este trabajo, porque cientos de miles de usuarios, que son estudiantes universitarios, se ven afectados.

Actualización: Podríamos avanzar un nivel más y llegar a main.htm . Entonces, escribí otro script para esta página. Pero, al final me sale ReferenceError: element is not defined[Learn More] .

// ==UserScript== // @name Golestan Main // @namespace sbu.ac.ir // @include https://golestan.sbu.ac.ir/Forms/AuthenticateUser/main.htm // @version 1 // @grant none // ==/UserScript== // Microsoft WebService Behavior (Predecessor of modern AJAX) // Information: https://web.archive.org/web/20060101200359/https://msdn.microsoft.com/workshop/author/webservice/webservice.asp // JavaScript version: https://raw.githubusercontent.com/nzakas/professional-javascript/master/edition1/ch17/webservice.htc // NOTE: You should paste the Javascript code from the above URL here // end Microsoft WebService Behavior function l(){ useService("../f0241_process_authexit/authexit.asmx?WSDL", "get"); // useService("authuser.asmx?WSDL", "get"); mt = new MainTit(document,titH); mt.Maxi(); t = new Tab(document,titH,0,document.body.clientWidth,document.body.clientHeight-titH); t.maintitle=mt; OpenFaci(''صفحه اصلي'',''nav.htm?fid=0;1&tck=''+''&''+location.search.replace(''?'','''')); mt.HideGTit(); KeysValues = location.search.split(/[/?&]+/); for (i = 0; i < KeysValues.length; i++) { KeyValue = KeysValues[i].split("="); if (KeyValue[0] == "CSURL") { CSURL = KeyValue[1]; break; } } } function ex(ltck,tck,u,si,ft,fid,sess){ var co = createCallOptions(); co.funcName = "ex"; co.async = false; // callService(function(result){if(result.error){/*alert(result.errorDetail.string);*/}},"ex",ltck,tck,u,si,ft,fid,sess); callService(co,ltck,tck,u,si,ft,fid,sess); } addJS_Node (l); addJS_Node (ex); addJS_Node(ErrDetail); addJS_Node(postError); addJS_Node(returnError); addJS_Node(createCallOptions); addJS_Node(createUseOptions); addJS_Node(cloneObject); addJS_Node(ensureVBArray); addJS_Node(encb64hlp); addJS_Node(decb64hlp); addJS_Node(encb64); addJS_Node(decb64); addJS_Node(ensureWsdlUrl); addJS_Node(allocCall); addJS_Node(fnShowProgress); addJS_Node(isSimpleType); addJS_Node(isPrimitive); addJS_Node(getSdl); addJS_Node(processService); addJS_Node(onImportLoaded); addJS_Node(loadImports); addJS_Node(invokeNext); addJS_Node(callNext); addJS_Node(getAttrib); addJS_Node(getBaseName); addJS_Node(getQualifier); addJS_Node(getNextNsq); addJS_Node(getUniqueNsq); addJS_Node(parseSimpleType); addJS_Node(parseType); addJS_Node(parseArrayType); addJS_Node(parseComplexType); addJS_Node(parseAttrib); addJS_Node(parseElem); addJS_Node(parseSoapHeader); addJS_Node(expBase); addJS_Node(parseSchemas); addJS_Node(parseSdl); addJS_Node(ensureXmlHttp); addJS_Node(encodeHeader); addJS_Node(_invoke); addJS_Node(callService); addJS_Node(useService); addJS_Node(getMsg); addJS_Node(fixupDT); addJS_Node(encTZ); addJS_Node(encodePrimitive); addJS_Node(bldJsAry); addJS_Node(getNextIndexAry); addJS_Node(vbArrayToJs); addJS_Node(encodeArray); addJS_Node(encodeVar); addJS_Node(getArySize); addJS_Node(get1stAryItem); addJS_Node(getAryItemFromIndex); addJS_Node(getSchema); addJS_Node(getArySizeInfo); addJS_Node(encodeAttrib); addJS_Node(serPart); addJS_Node(getWrap); addJS_Node(encodeArgs); addJS_Node(returnResult); addJS_Node(decTZ); addJS_Node(applyTZ); addJS_Node(decDate); addJS_Node(decTime); addJS_Node(decodePrimitive); addJS_Node(getAryInfo); addJS_Node(decodeArray); addJS_Node(decodeAryItem); addJS_Node(getAryElem); addJS_Node(decodeElem); addJS_Node(decodeType); addJS_Node(processResult); addJS_Node(hideProgress); addJS_Node(getResult); function addJS_Node (text, s_URL, funcToRun, runOnLoad) { var D = document; var scriptNode = D.createElement (''script''); if (runOnLoad) { scriptNode.addEventListener ("load", runOnLoad, false); } scriptNode.type = "text/javascript"; if (text) scriptNode.textContent = text; if (s_URL) scriptNode.src = s_URL; if (funcToRun) scriptNode.textContent = ''('' + funcToRun.toString() + '')()''; var targ = D.getElementsByTagName (''head'')[0] || D.body || D.documentElement; targ.appendChild (scriptNode); }


Cosas que cuidar

El sitio que usa xhr(async:false) en la solicitud HEAD. Que está en desuso

Puedes leer más sobre esto aquí https://xhr.spec.whatwg.org/

La declaración principal es

La solicitud XMLHttpRequest sincrónica fuera de los trabajadores está siendo eliminada de la plataforma web ya que tiene efectos perjudiciales para la experiencia del usuario final. (Este es un proceso largo que lleva muchos años). Los desarrolladores no deben pasar falso para el argumento asincrónico cuando el objeto global actual es un objeto Ventana. Se recomienda encarecidamente a los agentes de usuario que adviertan sobre dicho uso en las herramientas de desarrollo y que experimenten lanzando una excepción InvalidAccessError cuando ocurra.

Entonces, cámbialo a true .

Luego use el @run-at document-end .

Creé un script que hace el trabajo por ti.

El enfoque que utilicé,

Copió código de script completo del sitio e hizo los cambios necesarios.

En la secuencia de comandos del usuario, elimine el elemento de script e inserte la secuencia de comandos modificada en la página web.

Alterará la página como se ve a continuación. Pero parece que todos los elementos de td están vacíos y provienen del servidor.

Puedes ver la transferencia de red aquí

Esta es la secuencia de comandos del usuario

// ==UserScript== // @name golestan // @namespace Sagar V // @author Sagar V // @include https://golestan.sbu.ac.ir/Forms/AuthenticateUser/login.htm // @version 1 // @grant none // @run-at document-end // ==/UserScript== (function(){ var script=document.createElement(''script''); script.innerHTML=`c=0; Ip="/_Images/";ip="/_images/";tp="/_Templates/";scp="/_Scripts/";stp="/_styles/";Stp="/_Styles/";ap="/Forms/AuthenticateUser/"; all =new Array( ''/blank.htm'',0, scp+''printTemplate.htm?tck=r'',0, stp+''comm_butt2.htc'',0, stp+''select.htc'',0, stp+''simplegrid.htc'',0, stp+''validation.htc'',0, stp+''webservice.htc'',0, Stp+''helpStyle.css'',0, Stp+''winlessmovable.htc'',0, stp+''main.css'',0, stp+''MenuStyle.css'',0, stp+''Toolb.htc'',0, stp+''npui.css'',0, ap+''Message.XSLT'',0, ap+''Golestan.htm'',0, ap+''NewsPage.htm'',0, ap+''LoginPage.htm'',0, ap+''TopPage.htm'',0, ap+''main.htm'',0, tp+''Commander.htm'',0, tp+''Message_Page.htm'',0, tp+''help.htm'',0, scp+''Commander.js'',0, scp + ''npobj.js'', 0, scp + ''faci.js'', 0, scp+''Forms1_5.js'',0, scp+''help.js'',0, scp + ''Message.js'', 0, scp + ''npnfwin.js'', 0, ''/_scripts/jqnpsrv.js'', 0, ''/_scripts/npgrd.js'', 0, scp + ''Forms1_5_npgrid.js'', 0, Ip+''Status_OK.gif'',0, ip+''tabs.png'',0, ip+''ftabs.png'',0, ip+''corner.png'',0, ip+''c1.png'',0, ip+''jqnpgridicons.png'',0, ''/Forms/F0202_PROCESS_REP_FILTER/command.htm'',0); nall=0; for(k=0;k<all.length;k=k+2){ if(all[k+1]==1)nall=nall+4; else nall++; } imstat=new Array('''',''_clicked'',''_focus'',''_disable''); function check(){ var x=new XMLHttpRequest() || new ActiveXObject("MSXML2.XMLHTTP"); x.open("HEAD",document.location,true); x.send(); var sd=new Date(x.getResponseHeader(''Last-Modified'')); var cd=new Date(document.lastModified); if(sd-cd>3660000){ //alert(''با توجه به تغييرات جديد سيستم ، جهت مشاهده کامل صفحات لطفا فايل هاي ذخيره شده در مرورگر خودرا حذف کنيد''); document.cookie = "reloading=1"; window.location.reload(true); return false; } return true; } function a(){ for (k = 0; k < nall; k++) { td = document.createElement(''TD''); td.className = ''e''; Pr.appendChild(td); } if (!check()) { //window.open("/_Templates/howtoclearcache.htm","_blank"); //top.close(); return; } var aCookie = document.cookie.split("; "); var cook=0; for (var i=0; i < aCookie.length; i++) { var aCrumb = aCookie[i].split("="); if ("reloading" == aCrumb[0]) { cook=unescape(aCrumb[1]); break; } } var ind=0; for( i=0;i<all.length;i=i+2){ if(all[i+1]==1) for(j=0;j<4;j++){ var r=new XMLHttpRequest() || new ActiveXObject("MSXML2.XMLHTTP"); r.open("GET", all[i]+imstat[j]+".gif", true); if(cook==1) r.setRequestHeader(''If-Modified-Since'',''Sat,01 Jan 2000 00:00:00 GMT''); getobj(r,ind++); } else{ var r=new XMLHttpRequest() || new ActiveXObject("MSXML2.XMLHTTP"); r.open("GET", all[i], true); if(cook==1) r.setRequestHeader(''If-Modified-Since'',''Sat,01 Jan 2000 00:00:00 GMT''); getobj(r,ind++); } } document.cookie = "reloading=0; expires=Fri, 31 Dec 1999 23:59:59 GMT;"; } function getobj(o,ind){ o.onreadystatechange=function(){ if(o.readystate==4){ Pr.cells(c).className="f"; c++; if(c==nall){ if (location.search){ top.location = "main.htm" + location.search ; } else top.location="main.htm"; } } } o.send(); }`; //alert(script); document.getElementsByTagName(''script'')[0].parentNode.removeChild(document.getElementsByTagName(''script'')[0]); document.head.appendChild(script); })();

O

Instalarlo directamente desde Github


Lamentablemente, una aplicación web con JavaScript pesado creado para IE es probable que tenga más cosas específicas de IE dentro de ella que simplemente hacer XMLHttpRequests. Usar ActiveXObject para hacer XMLHttpRequests también significa que el JavaScript está escrito para una versión muy antigua de IE, porque el objeto estándar XmlHttpRequest ha estado presente desde IE7. Entonces, ¡espera lo peor!

Para el problema específico de hacer que todas las llamadas al new ActiveXObject("MSXML.HttpRequest") funcionen en Firefox. Puedes usar lo siguiente en tu script de Greasemonkey:

window.ActiveXObject = function(type) { switch(type.toUpperCase()) { case "MSXML2.XMLHTTP": case "MICROSOFT.XMLHTTP": return new XMLHttpRequest(); break; default: console.log("Unknown ActiveXObject type: ", type); } }

.readystate esto con su ejemplo dado, y noté que JavaScript prueba .readystate , not .readyState !

Además, el parche de Greasemonkey puede solucionar esto:

Object.defineProperty(XMLHttpRequest.prototype, "readystate", { get: function() { return this.readyState; } });

El siguiente problema fue que el JavaScript usaba la colección de celdas TableRow como si fuera una función ... Por lo tanto:

Object.defineProperty(HTMLTableRowElement.prototype, "cells", { get: function() { return function(index) { return this.querySelectorAll(''td'')[index]; }; } })

Si aún no hubiera sentido que las cosas se están saliendo de control, la página se completa y pasa a "main.html", donde las cosas se ponen más interesantes.

Porque contiene esta explosión muy problemática del pasado:

<div id="service" style="display:none" style="behavior:url(/_styles/webservice.htc)"></div>

Comportamientos CSS de Microsoft Estos fueron todos furor hace unos 15 años más o menos.

Si pensabas que llegar a este punto era malo, para ir más lejos, requeriría más paciencia de la que tengo tiempo, eché un vistazo dentro de webservice.htc, y hay una gran cantidad de ingeniería inversa para guiar eso , para una pregunta de Desbordamiento de pila.

¡Lo siento mucho porque no pude hacer que esto funcione para ti!

En lugar de invertir tiempo en eso, me resignaría personalmente a ejecutar IE en Linux a través de VirtualBox y usar una VM de IE