- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在创建一个带有嵌入式 <webview>
的 Chrome 应用程序元素。嵌入式 webapp 包含许多遗留代码,例如 window.showModalDialog
调用(Chrome 不再支持)。
我现在要做的是填充这些调用。我创建了一个简单的测试示例:
<webview src="http://legacyCodeIsAwesome.com/" style="width:100%; height:100%"></webview>
操作webview元素的代码:
webview.addEventListener('contentload', function() {
webview.executeScript(
{
code: 'window.showModalDialog = function() { console.log ("Hello, world");}',
runAt: 'document_start'
}
);
});
上面的代码运行(添加调试 console.log
有效),只是它没有做它应该做的,即覆盖 showModalDialog
。功能。
在 window
上覆盖函数是否有某种限制?网页 View 中的对象?有解决办法吗?
最佳答案
当您调用 webview.executeScript
时,您实际上创建了一个 Content Script .
内容脚本的核心原则之一是 isolated world : 内容脚本会看到 window
的单独副本对象。
Content scripts execute in a special environment called an isolated world. They have access to the DOM of the page they are injected into, but not to any JavaScript variables or functions created by the page. It looks to each content script as if there is no other JavaScript executing on the page it is running on. The same is true in reverse: JavaScript running on the page cannot call any functions or access any variables defined by content scripts.
因此,您的覆盖有效,但仅在内容脚本上下文中有效。
内容脚本可以创建 <script>
页面上的元素;所述元素中的代码将在页面的上下文中执行。您可以阅读有关此技术的信息,称为页面级脚本或注入(inject)脚本,in this canonical question .
// Content script
var script = document.createElement('script');
script.textContent = `
window.showModalDialog = function() {
console.log("Hello, world");
}
`;
(document.head||document.documentElement).appendChild(script);
script.remove();
也就是说,您注入(inject)代码的时间太晚了。在 contentload
有问题的 JS 可能已经执行,并添加了 "document_start"
不会让时间倒带。
幸运的是,你可以declare in advance the content scripts you want to have :
webview.addContentScripts([
{
name: "showModalDialogPolyfill",
matches: ["https://webapp.example.com/*"],
js: { files: ['content.js'] },
run_at: 'document_start'
}
]);
webview.src = "https://webapp.example.com/";
关于javascript - webview 中的 Polyfill window.showModalDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38327257/
https://github.com/Yaffle/EventSource 我使用上面的是因为我想获得在 IE11 中工作的 promise ,我已经用 npm 安装了它但不确定我应该如何实现它。我在
有没有办法“摇树”babel-polyfill,这样只有我使用的功能是 polyfill? 也就是说,如果我从不在我的代码中使用 String.padStart,则不应包含它的 polyfill。 最
在我的入口点中使用 babel 转换将 babel-polyfill 导入到 Browserify 后,IE11 仍然提示 Object.assign。除了 Object.assign 之外,我的项目
这里是 Polyfill 新手。我对这个简单的例子完全感到困惑,在这个例子中我想初始化一个类型化数组: var x = new Uint8Array(3).fill(42); console.log(
我正在使用 ChildNode.remove()并且我由 Mozilla 描述我需要一个用于 IE 的 polyfill。我正在使用配置了 babel-polyfill 的 webpack: "ba
我正在使用 nuxt vuetify 模板构建一个静态站点,虽然它很棒并且提供了很多已经为我完成的配置和设置,但我发现很难让我的站点在 Internet Explorer (11) 上顺利运行。 由于
使用 core-js 填充的函数(例如,babel-polyfill)显示为原生。 Promise.race.toString() 产生: function race() { [native
我有以下实用程序: // Utility function to remove base64 URL prefix and store base64-encoded string in
我得到的错误 Error: Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has b
我正在学习基于 React 的 Udemy 类(class)(这是 Brad Schiff 为我们其他人准备的 React 类(class) here),我收到一个与 webpack 相关的错误,导致
我将 Ionic 3 项目升级为 Ionic 4 项目。使用“ionic serve”启动服务器时,我总是会收到上述错误。 我试过很多东西,例如: 在 polyfills.ts 文件中, (windo
我知道每个已知的浏览器都支持“decodeURIComponent”,但我试图通过 polyfill 来更好地理解它。 Atob、Btoa 有很多 polyfill……但出于某种原因,我没有找到任何用
我无法理解为什么检查对应于行 if (i in t) - 第 18 行放在 filter function polyfill 中: if (!Array.prototype.filter) { A
我正在尝试为传播运算符创建一个 polyfill。我的目标是创建类似于扩展运算符的东西,我可以使用三重 @@@ 符号代替三重点。 例如,在 ES6 中 function sum(x, y, z) {
This article启发我将我为 React 应用程序加载的 polyfill 外部化,并且只为需要它们的浏览器加载它们。一个简单的测试: function browserSupportsAllF
我创建了一个自托管 ServiceStack 服务,该服务基于其 showcase chat application 在 Windows 服务中运行。 。 但是,我没有进一步讨论的是尝试将客户端编写为
我正在开始一个新项目,目标是 MSVC、GCC(最新)、GCC 4.3 ARM 等等。我们构建的 waf 构建系统具有编译器的 C++11 功能检测。 我现在为 C++11 目标编译器中的所有功能提供
我正在寻找一种工具,它可以让我利用 native HTML5 拖放功能,并填充对过去浏览器的支持。 有这样的东西吗? Modernizr 的页面 (https://github.com/Moderni
是否有一个 polyfill 来处理 Safari 4 (iOS) 和 IE 中的 CSS 背景大小调整 最佳答案 可以试试这个。 http://nooshu.com/jquery-plug-in-s
我正在构建一个我的目标群体非常普遍的网站(13 岁到 oo,所以你好 IE9,你好古老的 android 浏览器),所以我需要 polyfills 来处理一些东西(viewport,calc 等)。在
我是一名优秀的程序员,十分优秀!