Вы можете переопределить ActiveXObject()
.
Это означает, что вы можете попытаться построить прозрачный прокси-объект вокруг фактического объекта и подключить вызовы метода. Это будет означать, что вам придется создавать прокси вокруг каждого метода и свойства, имеющегося у вашего объекта ActiveX, если только вы не уверены, что нет кода, вызывающего конкретный метод или свойство.
Я создал небольшую оболочку для объекта "MSXML2.XMLHTTP"
. Вероятно, есть все виды проблем, с которыми вы можете столкнуться, поэтому возьмите это с крошкой соли:
var ActualActiveXObject = ActiveXObject;
var ActiveXObject = function(progid) {
var ax = new ActualActiveXObject(progid);
if (progid.toLowerCase() == "msxml2.xmlhttp") {
var o = {
_ax: ax,
_status: "fake",
responseText: "",
responseXml: null,
readyState: 0,
status: 0,
statusText: 0,
onReadyStateChange: null
// add the other properties...
};
o._onReadyStateChange = function() {
var self = o;
return function() {
self.readyState = self._ax.readyState;
self.responseText = self._ax.responseText;
self.responseXml = self._ax.responseXml;
self.status = self._ax.status;
self.statusText = self._ax.statusText;
if (self.onReadyStateChange) self.onReadyStateChange();
}
}();
o.open = function(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword) {
varAsync = (varAsync !== false);
this._ax.onReadyStateChange = this._onReadyStateChange
return this._ax.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword);
};
o.send = function(varBody) {
return this._ax.send(varBody);
};
// add the other methods...
}
else {
var o = ax;
}
return o;
}
function Test() {
var r = new ActiveXObject('Msxml2.XMLHTTP');
alert(r._status); // "fake"
r.onReadyStateChange = function() { alert(this.readyState); };
r.open("GET", "z.xml");
r.send();
alert(r.responseText);
}
Отказ от ответственности: особенно обработка async / onReadyStateChange, вероятно, не является правильной, и у кода могут быть и другие проблемы. Как я уже сказал, это просто идея. Обращаться с осторожностью.
P.S .: COM-объект нечувствителен к регистру, когда дело доходит до имен методов и свойств. Эта оболочка (как и весь JavaScript) чувствительна к регистру. Например, если ваш код вызывает как "Send()"
, так и "send()"
, вам также потребуется скелетный метод "Send ()" в оболочке:
o.Send = function() { return this.send.apply(this, arguments); };