Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript webview中的Polyfill window.showModalDialog_Javascript_Webview_Modal Dialog_Google Chrome App_Legacy Code - Fatal编程技术网

Javascript webview中的Polyfill window.showModalDialog

Javascript webview中的Polyfill window.showModalDialog,javascript,webview,modal-dialog,google-chrome-app,legacy-code,Javascript,Webview,Modal Dialog,Google Chrome App,Legacy Code,因此,我正在创建一个带有嵌入式元素的Chrome应用程序。嵌入式webapp包含许多遗留代码,如window.showModalDialog调用(Chrome不再支持这些调用) 我现在要做的就是多打电话。我创建了一个简单的测试示例: <webview src="http://legacyCodeIsAwesome.com/" style="width:100%; height:100%"></webview> 上面的代码运行(添加一个debugconsole.logwo

因此,我正在创建一个带有嵌入式
元素的Chrome应用程序。嵌入式webapp包含许多遗留代码,如
window.showModalDialog
调用(Chrome不再支持这些调用)

我现在要做的就是多打电话。我创建了一个简单的测试示例:

<webview src="http://legacyCodeIsAwesome.com/" style="width:100%; height:100%"></webview>
上面的代码运行(添加一个debug
console.log
works),只是它没有做它应该做的事情,这就是覆盖
showModalDialog
函数


在WebView中覆盖
窗口
对象上的函数是否有某种限制?有办法解决吗?

当您调用
webview.executeScript
时,您实际上创建了一个

内容脚本的核心原则之一是:内容脚本可以看到
窗口
对象的单独副本

内容脚本在称为隔离世界的特殊环境中执行。它们可以访问所注入页面的DOM,但不能访问页面创建的任何JavaScript变量或函数。对于每个内容脚本,它看起来就像在其运行的页面上没有其他JavaScript执行一样。反过来也是如此:页面上运行的JavaScript不能调用任何函数或访问内容脚本定义的任何变量

因此,覆盖可以工作,但只能在内容脚本上下文中工作

要在页面上下文本身中执行覆盖,我们需要更深入。

内容脚本可以在页面上创建
元素;所述元素中的代码将在页面的上下文中执行。您可以阅读此技术,称为页面级脚本或注入脚本


也就是说,注入代码太晚了。在
contentload
上,有问题的JS可能已经执行,添加
的“document\u start”
不会倒带时间

幸运的是,您可以:


非常感谢你的广泛回答,我想给你+2作为初始参考,只是一个小的更正,但是
匹配
需要是一个数组
webview.addEventListener('contentload', function() {
    webview.executeScript(
      {
        code: 'window.showModalDialog = function() { console.log ("Hello, world");}',
        runAt: 'document_start'
      }
    );
  });
// Content script
var script = document.createElement('script');
script.textContent = `
  window.showModalDialog = function() {
    console.log("Hello, world");
  }
`;
(document.head||document.documentElement).appendChild(script);
script.remove();
webview.addContentScripts([
  {
    name: "showModalDialogPolyfill",
    matches: ["https://webapp.example.com/*"],
    js: { files: ['content.js'] },
    run_at: 'document_start'
  }
]);
webview.src = "https://webapp.example.com/";