Javascript 在JS中重载本机方法时调用它们

Javascript 在JS中重载本机方法时调用它们,javascript,cloudflare,Javascript,Cloudflare,所以基本上我遇到的问题是,我正在为一个网站开发一个简单的小JS库,并且遇到了一些问题。 该网站托管在使用火箭优化器的cloudflare上。现在,我的代码创建了一个脚本元素,然后它加载的脚本应该调用服务器进行持续ping,在这个过程中,服务器会记录各种信息。这个库正在其他环境中工作,但是火箭优化器正在杀死它 var dd = document, ll = dd.createElement('script'), ss = dd.getElementsByTagName('script')[0];

所以基本上我遇到的问题是,我正在为一个网站开发一个简单的小JS库,并且遇到了一些问题。 该网站托管在使用火箭优化器的cloudflare上。现在,我的代码创建了一个脚本元素,然后它加载的脚本应该调用服务器进行持续ping,在这个过程中,服务器会记录各种信息。这个库正在其他环境中工作,但是火箭优化器正在杀死它

var dd = document, ll = dd.createElement('script'), ss = dd.getElementsByTagName('script')[0];
ll.type = 'text/javascript'; ll.async = true;               
ll.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + serverDomain + "/alive?" + params;
ss.parentNode.insertBefore(ll, ss);
现在我遇到的问题其实很简单,据我所知,rocket.js库重载了document.createElement,它有自己的整洁函数,在出现脚本标记的情况下,它提供了常规脚本标记的“关闭”副本,尽管它为src属性定义了setter/getter。setter所做的不是设置src,而是将其放入数据rocketsrc中,然后由rocket优化器处理,该优化器将其传递回pages服务器,然后pages服务器对我的服务器执行所有调用,并传递回结果

这导致我正在跟踪和做的事情由于各种离题的原因完全被抛到了窗外

现在我一直在试图找到方法让原始的createElement回到图片中,问题是因为rocket.js是先加载的,目前看来我没有办法让我的脚本具有优先级,我有点困惑于如何纠正这个问题。可能重做我自己的createElement方法的想法是一种想法,但我宁愿避免这种想法,因为它增加了我正在发送的内容,而且它似乎是我不应该发送的东西


任何想法和帮助都将不胜感激。

有些函数在指针丢失时无法重用(函数替换为
null
或包含函数的变量在私有范围内,因此您无法访问它)。如果
rocket.js
document.createElement
函数保存到私有范围,那么它就不能被重用。您需要检查
rocket.js
code。如果你找到这样的东西

document.createElement = (function(a){
    // Some other code....
    return function(b){
        return a(b);
    };
})(document.createElement);

那么您就无法恢复本机函数。尽管如此,您可以尝试使用
document.\uuuuu proto\uuuuuu.createElement
,它可能不会被覆盖。

如果某些函数的指针丢失,则无法重用(函数替换为
null
,或者包含函数的变量在私有范围内,因此您无法访问它)。如果
rocket.js
document.createElement
函数保存到私有范围,那么它就不能被重用。您需要检查
rocket.js
code。如果你找到这样的东西

document.createElement = (function(a){
    // Some other code....
    return function(b){
        return a(b);
    };
})(document.createElement);

那么您就无法恢复本机函数。尽管如此,您可以尝试使用
document.\uuuu proto\uuuuu.createElement
,这可能不会被覆盖。

您可以使用
文档
对象的原型来查找原始函数,并将其分配给对象上的其他名称

document.$createElement = Document.prototype.createElement;

document.$createElement('div'); //The original function
document.createElement('div'); //The library's overridden function

注意
文档
文档
是不同的对象。

您可以使用
文档
对象的原型来查找原始函数,并将其分配给对象上的不同名称

document.$createElement = Document.prototype.createElement;

document.$createElement('div'); //The original function
document.createElement('div'); //The library's overridden function

注意
Document
Document
是不同的对象。

你可以覆盖
Document.createElement
在chrome内部,我怀疑你也可以在大多数浏览器上实现。我同意Ben的观点,这是可以实现的,因为当我在chrome上使用开发者工具,并尝试进入createElement功能时,它直接跳到rocket.js你可以在chrome中覆盖
document.createElement
,我怀疑你也可以在大多数浏览器上这样做。我同意Ben的观点,这是可以做到的,因为当我在chrome上使用开发者工具,尝试进入createElement函数时,它会直接跳到rocket.js,完全没有想到原型,应该与大多数浏览器兼容,所以应该解决大多数问题,谢谢:)回答得很好,完全没有想到原型,应该与大多数浏览器兼容,所以应该解决大多数问题,谢谢:)