基本上我遇到的问题是,我正在为一个网站开发一个简单的小型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库使用自己的neat函数重载了document.createElement,在脚本标签的情况下,它给出了一个"靠近"传统脚本标记的副本,虽然它为src属性定义了setter / getter。 setter所做的不是设置src,而是将它放入data-rocketsrc中,然后由火箭优化器处理,然后将火箭优化器传递给页面服务器,然后对服务器进行所有调用,然后传回结果。
由于各种非主题原因,这导致我跟踪和做的事情完全消失。
现在我一直试图找到将原始createElement重新放回图片的方法,问题是因为rocket.js首先被加载,而且目前它似乎无法获取我的脚本要优先考虑,我有点难以理解这一点。可能重做我自己的createElement方法的想法是一个想法,但我宁愿避免,因为它增加了我发送的东西,它似乎是我不应该发送的东西。
非常感谢任何想法和帮助。
答案 0 :(得分:0)
如果某个函数的指针丢失(函数替换为null
或包含函数的变量在私有作用域内,则有些函数无法重用,因此无法访问它)。如果rocket.js
将document.createElement
函数保存到私有作用域,则无法重复使用。您需要检查rocket.js
代码。如果您发现类似的内容
document.createElement = (function(a){
// Some other code....
return function(b){
return a(b);
};
})(document.createElement);
然后你无法恢复原生功能。虽然,您可以尝试document.__proto__.createElement
,但可能无法覆盖。
答案 1 :(得分:0)
您可以使用Document
对象的原型来查找原始函数,并将其指定给对象上的其他名称。
document.$createElement = Document.prototype.createElement;
document.$createElement('div'); //The original function
document.createElement('div'); //The library's overridden function
注意Document
和document
是不同的对象。