通过浏览器插件设置值以在 iframe 中形成

Posted

技术标签:

【中文标题】通过浏览器插件设置值以在 iframe 中形成【英文标题】:Set values to form in iframe through browser plugin 【发布时间】:2015-03-17 06:02:00 【问题描述】:

对于我的公司,我想将值从存储在数据库中的表单映射到第三方公司的表单(我们日常工作的一部分)。

我们的表格在site1.com,第三方公司的表格在site2.com,并显示在site1.com 的iframe 中。

我对 site1.com 有完全控制权,但对 site2.com 没有任何控制权

显然,使用 jQuery,由于同源策略,映射将不起作用。

我想,因为我可以使用“检查元素”手动操作 DOM 树,所以浏览器插件可能会起作用。但是直到现在我也无法让它工作,因为我又遇到了同源策略。

还有其他方法可以让它工作吗?我是否需要更进一步并为我的 Mac 创建一个可可应用程序?

【问题讨论】:

“将值从一个表单映射到另一个表单”是什么意思?您是否要手动填写第一个表单,然后将值复制到第二个表单? 没错,只是site1.com上的表格是用户填写的,不是我填写的。当我在提交后查看表单时,需要将这些详细信息复制到 site2.com 上的另一个表单 【参考方案1】:

您可以使用用户脚本来实现您的目标。我做了一个示例 siteone.com - 一个包含输入、按钮、iframe 的页面(查看 sitetwo.com)。在按钮上单击来自 siteone.com 的输入值会显示在来自 sitetwo.com 的输入中。要安装用户脚本,您可以使用 Chrome 和 Safari 的浏览器扩展 Tampermonkey,或 Firefox 的 Greasemonkey。对于页面和 iframe 之间的通信,我使用了 Window.postMessage 看起来 documentation。如果需要 javascript 库,可以使用 @require 元块 link。

siteone.com index.html

<html>
<head>
</head>
<body>
    <input id="parent-input" type="text"/>
    <button id="send-data-to-iframe">Send data to iframe</button>
    <br /><br />
    <iframe id="my-iframe" style="border:1px solid red; height:50px; width:200px;" src="http://sitetwo.com:8080">
    </iframe>
    <script>
        var win = document.getElementById("my-iframe").contentWindow;

        document.getElementById("send-data-to-iframe").onclick = function()
            win.postMessage(
                document.getElementById("parent-input").value,
                "http://sitetwo.com:8080" // target domain
            );
            return false;
        
    </script>
</body>

sitetwo.com index.html

<html>
<head>
</head>
<body>
    <input id="iframe-input" type="text"/>
</body>

myUserJS.user.js

// ==UserScript==
// @name myUserJS
// @license MIT
// @version 1.0
// @include http://sitetwo.com*
// ==/UserScript==
(function (window, undefined) 
    var w;
    if (typeof unsafeWindow != undefined) 
        w = unsafeWindow
     else 
        w = window;
    
    // extended check, sometimes @include section is ignored
    if (/http:\/\/sitetwo.com/.test(w.location.href)) 
        function listener(event)
            document.getElementById("iframe-input").value = event.origin + " send: " + event.data;
        
        if (w.addEventListener)
            w.addEventListener("message", listener,false);
         else 
            w.attachEvent("onmessage", listener);
        
    
)(window);

【讨论】:

是的!而已!多谢!我必须做出的一项更改是将 undefined 更改为 "undefined"。对于那些想要包含 jquery 的人,请添加:// @require code.jquery.com/jquery-latest.js。我不确定浏览器扩展是否也可以工作。【参考方案2】:

你有没有试过“window.postmessage”和“window.onmessage”功能。它适用于 chrome、firefox 和 IE8+。

【讨论】:

这不需要控制site2.com吗?

以上是关于通过浏览器插件设置值以在 iframe 中形成的主要内容,如果未能解决你的问题,请参考以下文章

Azure 数据工厂 - 查找值以在 ForEach 复制任务中选择语句

状态流程图和 C 动作语言。设置数组值以在单个步骤中输出一个向量

在Iframe中使用jquery ui dialog 怎么使弹出窗口居于浏览器中间

怎么让iframe自适应浏览器的高度和宽度

将 IFrame 设置为“about:blank”的跨浏览器方式?

如何设置我的 Vue.js 站点以在每次热重载事件时清除浏览器的 Javascript 控制台?