2014-09-23 88 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的按鍵,然後將消息發送回與細節父。瀏覽器允許這樣做,因爲它是自願的和合作的 - 你必須控制發送者和接收者,所以它不能用來在用戶不知道的情況下竊取用戶的東西。