为 iframe 生成的源仍然会阻止以角度访问 iframe

Posted

技术标签:

【中文标题】为 iframe 生成的源仍然会阻止以角度访问 iframe【英文标题】:Generated source for iframe still blocks access to iframe in angular 【发布时间】:2017-07-20 18:21:09 【问题描述】:

当我想访问动态生成的 iframe 源中的 DOM 元素时,我的浏览器会阻止我访问它,就像从不同位置加载 iframe 的情况一样。有没有办法告诉 iframe 元素它的“src”属性是自制的?在代码中:

html中:

<div ng-app="myApp" ng-controller="MyController as ctrl">
    <iframe id="my-iframe" ng-src="ctrl.renderIframe()"></iframe>
</div>

角度:

var myApp = angular.module('myApp', []);

myApp.controller('MyController', ['$sce', function($sce) 

  var self = this;
  var iframeContent = 'data:text/html;charset=utf-8,' + encodeURI(
    '<div id="target">Shoot the target</div>'
  );
  var iframePointer = angular.element('#my-iframe');
  var targetPointer;

  self.renderIframe = function() 
    return $sce.trustAsResourceUrl(iframeContent);
  ;

  /* Edit: needed a [0] selector */
  iframePointer[0].onload = function() 
    targetPointer = iframePointer.contents().find('#target');
    targetPointer.text('I shot it');
  ;

]);

【问题讨论】:

您是否尝试过使用外部源,只是为了看看它是否有效? 你的意思是仅仅引用像 ng-src="some.other-address.co.uk" 这样的东西?当然可以获取不同的位置,但问题是一样的:禁止尝试使用 javascript 读取/写入 iframe 中的单个元素,因为它的来源不同。 我的意思是不要在 Angular 中动态生成源代码,而是创建一个包含 &lt;div id="target"&gt;Shoot the target&lt;/div&gt; 的新 HTML 文件,并将其用作同一来源的源代码,然后查看您要执行的操作是否有效。 啊这样。是的,这确实有效,尽管我必须承认我忘记在 onload 事件处理函数之前放置一个 [0] 选择器。再次从生成的 src 中获取它仍然会抛出“来自 'HTMLIFrameElement' 的属性:阻止具有源“localhost”的框架访问跨域框架。”错误。 您是否有需要 iframe 的理由?为什么不直接将 html 附加到主文档? 【参考方案1】:

在深入挖掘之后,I came across a solution:将 iframe 的来源设置为 'about:blank',然后将 html 加载到 iframe 的文档正文中。然后你得到:

html:

<div ng-app="myApp" ng-controller="MyController as ctrl" id="myApp">
  <iframe id='my-iframe'></iframe>
</div>

javascript:

var myApp = angular.module('myApp', []);

myApp.controller('MyController', [function() 

  var self = this;
  var htmlString = '<div id="target">Shoot the target</div>';
  var iframePointer = document.getElementById('my-iframe');
  var targetPointer;

  iframePointer.src = 'about:blank';

  iframePointer.onload = function() 

    /* Apply the html */
    iframePointer.contentWindow.document.open('text/html', 'replace');
    iframePointer.contentWindow.document.write(htmlString);
    iframePointer.contentWindow.document.close();

    /* Manipulate html */
    targetPointer = iframePointer.contentWindow.document.getElementById('target');
    targetPointer.innerHTML = 'I shot it';

  ;

]);

我确实不得不求助于香草的东西,所以角度不再与此相关。事实上,它有点违背角度伦理,因为它直接操纵 DOM 元素。但是,它有效。

【讨论】:

您应该考虑使用Creating a Custom Directive 来完成 DOM 工作。并使用Angular's jQLite。

以上是关于为 iframe 生成的源仍然会阻止以角度访问 iframe的主要内容,如果未能解决你的问题,请参考以下文章

如何打开放置在iframe html中直接访问阻止目录中的pdf文件

根据是不是通过 iframe 查看网站来阻止访问网站 [重复]

使用 JWT 令牌使用 AdonisJS 注销

我可以为 Angular CLI 生成的源创建自定义模板吗

混合内容:Iframe 将 https 调用转换为 http 并且请求被阻止

为啥自关闭 iframe 标记会阻止显示更多 DOM 元素?