【问题标题】:Programmatically Changing the Contents of a Webview in Electron在 Electron 中以编程方式更改 Web 视图的内容
【发布时间】:2016-07-25 07:11:39
【问题描述】:

所以在我的电子应用程序中,我有一个带有侧边栏(包含一些链接)的主页,然后是一个占据大部分页面的 web 视图。我有一些单独的 .html 文件中的页面,我希望能够以编程方式将它们加载到 webview 中。使用 iFrame,只需设置 iframe 的名称属性(例如“content_frame”),然后将我的链接设置为:

<a id="page1_link" href="pages/page1.html" target="content_frame">page 1</a>

这是我的网页视图:

<webview nodeintegration="on" src="pages/landing_page.html" name="content_frame" height="100%" width="100%"></webview>

第一页 (landing_page.html) 显示得很好,但是如果我尝试以同样的方式使用 web 视图,它将在弹出窗口中打开该页面,而不是在这个嵌入的 web 视图中。到目前为止,我一直在使用 iframe,但我需要使用来自电子的节点内容(来自 iframe 的要求会破坏一切)。

【问题讨论】:

    标签: javascript html webview electron


    【解决方案1】:

    看起来没有一种干净的方法可以使用锚标记的目标属性来执行此操作。使用一些 JavaScript,您可以捕获锚点的点击事件并使用 webview 上的 loadURL 来更改页面。肯定有更优雅的方法可以做到这一点,但这很有效:

    var webview = document.getElementsByName('content_frame')[0];
    var bound = false;
    webview.addEventListener("dom-ready", function() {
        if (bound) return;
        bound = true;               
        var anchors = document.getElementsByTagName("a");
        for (var a = 0; a < anchors.length; a++) {
            var anchor = anchors[a];
            if (anchor.getAttribute('target') == 'content_frame') {
                anchor.addEventListener('click', function (e) {
                    e.preventDefault();
                    webview.loadURL(e.srcElement.href);                
                });
            }
        }                                
    });
    

    但是,您必须根据此处的文档提供协议:http://electron.atom.io/docs/v0.37.4/api/web-view-tag/#webviewloadurlurl-options

    在 webview 中加载 url,url 必须包含协议前缀,例如http:// 或 file://。

    【讨论】:

    • 感谢您的回复,我最终只是使用函数调用手动更改了 src 值,但我会保留您的回复,结果 webviews 有自己的问题,所以我我会切换回 iframe 一段时间。如果您对此有任何意见,我将提出一个关于在 iframe 中使用 require() 的新问题。
    猜你喜欢
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多