调用本机浏览器函数,即使它已被覆盖
Call native browser function, even after it has been overridden
如果我有类似的东西
alert = 0;
在另一个脚本中。
这是在另一个脚本中,我的代码无法在该脚本之前加载。
如何调用脚本中的原始alert
方法?
覆盖原始alert
之前,请保存它。
var origAlert = alert;
alert = 0;
origAlert("foo");
演示:http://jsfiddle.net/jfriend00/tnNE7/
如果不能保存原始值,我所知道的访问它的唯一其他方法就是在iframe中。这里有一个例子:
alert = 0;
var iframe = document.createElement("iframe");
iframe.height = 0;
iframe.width = 0;
document.body.appendChild(iframe);
iframe.contentWindow.alert.call(window, "foo");
工作示例:http://jsfiddle.net/jfriend00/waMEV/
我并没有在所有浏览器中都尝试过,但它在Chrome、IE和Firefox中都能工作,我认为它应该在其他浏览器中工作。
好吧,我是第一个承认这是一个丑陋的答案,但它似乎有效:
alert = 0;
var win = window.open(),
method = win.alert;
win.close();
method.call(window, "my message");
在这里打闹。本质上,您可以创建一个新的窗口实例并窃取其alert
方法。不利的一面是,你实际上必须打开一个新的浏览器窗口,尽管时间很短。我怀疑这是否真的是解决你问题的实用方案——这取决于你试图使用的其他网站,以及你有多关心最终用户对你的解决方案的看法。
编辑:这是上面的答案和jfriend00的答案的组合,解决了"打开新窗口"的问题。我认为这是一个更好的选择,因为a)当你需要调用方法时,它不依赖于iframe仍然在DOM中,b)它应该可以推广到任何window
方法,而jfriend00的答案可能不是。
alert = 0;
// make a new window instance in an iframe
var iframe = document.createElement("iframe");
iframe.height = iframe.width = 0;
document.body.appendChild(iframe);
// steal the method
var method = iframe.contentWindow.alert;
// remove the evidence
document.body.removeChild(iframe);
// now use the method for your own purposes
function myAlert(message) {
method.call(window, message);
}
myAlert("foo");
相关文章:
- '图片'没有用于本机道具的propType'RCTImageView.overlayColor&
- 在iOS和Android上使用React native时,我还能使用本机第三方lirbraries吗
- javascript函数访问ios本机功能
- 如何在从客户端接收数据时从本机方法触发javascript函数?
- 在浏览器中检测本机或第三方PDF插件
- 将事件发送到javascript文档的react本机模块是否正确
- 将对应用内购买的支持构建为react本机代码
- 如何在Windows上用javascript构建本机应用程序
- 在视图中渲染多个按钮以编程方式进行本机反应
- 在本机挂钩之前加载可安装挂钩
- 调用本机浏览器函数,即使它已被覆盖
- 是否可以覆盖本机 Es6 承诺解析方法
- 关于覆盖本机DOM方法时的IE 10问题
- 是否可以覆盖本机获取 API 以使用所需的承诺库而不是本机浏览器承诺
- 如何恢复覆盖的本机方法
- 如何覆盖javascript本机对象的内置方法
- 如何使用本机(未覆盖)方法
- 本机Javascript Alert风格的覆盖删除了新行功能
- 访问被字段名覆盖的本机表单属性
- sharepoint 2007-IE8/JavaScript:覆盖document.all.item的本机实现