在具有跨域的iframe中侦听keydown事件



我想在iframe中监听keydown事件,以阻止执行退格。只要iframe中的页面来自同一个域,它就可以工作,但当它来自另一个域时,当调用contents()方法时就会失败。

错误为:

IE:"0x80070005-JavaScript运行时错误:访问被拒绝。"

Chrome:"未捕获的安全性错误:无法从'HTMLIFrameElement'读取'contentDocument'属性:阻止了源自"domain_a"的帧访问源自"domain_b"的框架。协议、域和端口必须匹配。"

有没有办法从另一个域监听iframe上的keydown事件?

我使用这个angularJS代码来设置一个监听器:

KeyDownService.preFilterKeyDown($(this).contents());
...
angular.module('portal.services.keyHandlers.keyDownService', [])
.service('KeyDownService', function () {
    //Prevents shortcut keys (for instance backspace) in being executed in an iframe or document.
    this.preFilterKeyDown = function ($document) {
        $document.keydown(function (e) {
            var preventKeyPress;
            switch (e.keyCode) {
                case 8: //Backspace
                    preventKeyPress = preventBackspace(e);
                    break;
...
                default:
                    preventKeyPress = false;
            }
            if (preventKeyPress)
                e.preventDefault();
        });
    }

否。你不能这样做,它与AngularJS无关。这是一种安全违规行为,特别是为了防止您在美国银行的IFRAME进入您自己的网站,并从该框架中窃取用户的凭据。

但是,如果控制两个页面,则IFRAME可以自愿向您提供数据。postMessage是一种常见的技术:

http://caniuse.com/#search=postMessage

本质上,您将击键捕获在IFRAME中,然后向父级发送一条包含详细信息的消息。浏览器允许这样做是因为它是自愿和合作的-你必须控制发送者和接收者,所以它不能在用户不知情的情况下被用来窃取用户的东西

相关内容

  • 没有找到相关文章

最新更新