2014-09-23 165 views
3

我想监听iframe中的keydown事件以停止执行退格。 只要iframe中的页面来自同一个域,但是当它来自另一个域时,它会在内容()方法被调用时失败。在跨域的iframe中监听keydown事件

的错误是:

IE: “0X80070005 - JavaScript的运行时错误:访问被拒绝。”

铬:“未捕获的SecurityError:未能读取从‘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(); 
     }); 
    } 

回答

1

号你不能做到这一点,它无关AngularJS。这是一项安全违规行为,特别是阻止您在美国银行的IFRAME中进入您自己的站点并从该框架窃取用户的凭证。

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

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

基本上你陷在IFRAME的按键,然后将消息发送回与细节父。浏览器允许这样做,因为它是自愿的和合作的 - 你必须控制发送者和接收者,所以它不能用来在用户不知道的情况下窃取用户的东西。