【问题标题】:Can a button click cause an event in iframe?按钮单击会导致 iframe 中的事件吗?
【发布时间】:2014-07-11 00:12:00
【问题描述】:

假设我在 Iframe 旁边有一个按钮,而该 Iframe 中是一个下载链接。是否有可能当我点击外部按钮时,会点击 iframe 上的下载链接?

http://jsfiddle.net/idude/9RQ3N/

<button type="button">Click Me!</button>

<iframe src="http://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_a_download" height="400" width="800">

例如,在上面的jsfiddle链接中,我怎样才能做到只需点击按钮就可以下载w3图片?

提前致谢!

【问题讨论】:

  • 出于安全原因不可能。看看CSRF

标签: javascript jquery iframe


【解决方案1】:

试试(这个模式)

$(function () {

    var url = ["http://example.org"]; // `url`, e.g., `http://example.org`
    var iframe = $("<iframe>", {
            "id": "frame",
            "width": "400px",
            "height": "300px"
    });
    $.when($("body").append(iframe))
        .then(function (b) {

        var img = $("<img>", {
                 "id" : "frameimg",
                "width": "400px",
                "height": "300px",
        }).css("background", "blue");
             var a = $("<a>", {
                "href" : url[0],
                "html" : img
            }).css("textDecoration", "none");
        var button = $("<button>", {
            "html": "click"
        }).css("fontSize", "48px")
            .one("click", function (e) {
            $(b).find("#frame").contents()
                .find("body a")
                .get(0).click()
        });
        $(button).appendTo(b);
        $(b).find("#frame").contents()
            .find("body").html(a);
    });

});

jsfiddle http://jsfiddle.net/guest271314/2x4xz/

【讨论】:

    【解决方案2】:

    要访问 iFrame DOM,您只需:

      var x = document.getElementById("myframe");
      var y = x.contentWindow.document; 
    

    或者您可以使用

    获取该 iFrame
      window.frames[0] 
    

    或者类似的东西,如果你不想为 iFrame 使用 ID。

    然后您可以在该文档中搜索某些内容并在该元素上触发点击事件。

      y.getElementById("somButton").click();
    

    【讨论】:

    • 您可以使用contentDocument 代替contentWindow.document。但当然不是跨域。
    • yebo,在跨域中它会抛出诸如“访问属性的权限被拒绝”之类的错误或我认为的错误。
    【解决方案3】:

    Mozilla 的JSChannel 设计用于使用 POST 与 iframe 进行通信。你应该考虑检查一下。

    公报示例

    父 HTML 可能是

    <script src="jschannel.js"></script>
    <iframe id="childId" src="child.html"></iframe>
    <script>
        var myChildChannel = Channel.build(document.getElementById("childId").contentWindow, "*", "testScope");
        myChildChannel.query({
            method: "myMethodName",
            params: "I'm Bob!",
            success: function(v) {
                alert(v);
            }
        });
    </script>
    

    现在给孩子:

    <script src="jschannel.js"></script>
    ...
    <script>
        var myParentChannel = Channel.build(window.parent, "*", "testScope");
        myParentChannel.bind("myMethodName", function(t, param) {
            return 'you said "'+param+'"';
        });
    </script>
    

    这在运行时会产生并提醒说你说“我是 Bob!”

    显然,您可以用它做很多事情。玩得开心:)

    【讨论】:

    • 除非我弄错了,这仅在您控制 iframe 的内容时才有效。 OP 在他的示例中链接到 w3schools,我认为他不拥有。
    【解决方案4】:

    正如@ssergei 正确的pointed,出于安全原因,这是不可能的。这是我用来捕捉错误的 jsFiddle:http://jsfiddle.net/9RQ3N/5/

    这是谷歌浏览器抛出的SecurityError 消息:

    Uncaught SecurityError: Failed to read the 'contentDocument' property from
    'HTMLIFrameElement': Blocked a frame with origin "http://fiddle.jshell.net"
    from accessing a frame with origin "http://www.w3schools.com".
    Protocols, domains, and ports must match.
    

    来自火狐:

    Error: Permission denied to access property 'document'
    

    来自 Safari:

    Blocked a frame with origin "http://fiddle.jshell.net" from accessing a frame
    with origin "http://www.w3schools.com". Protocols, domains, and ports must match.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2018-08-23
      • 1970-01-01
      相关资源
      最近更新 更多