javascript-如何检测 iframe 中的滚动事件?

Posted

技术标签:

【中文标题】javascript-如何检测 iframe 中的滚动事件?【英文标题】:javascript-How to detect scroll event in iframe? 【发布时间】:2017-09-02 00:13:26 【问题描述】:

当我尝试使用 iframe 标记添加事件滚动时遇到问题。通常,我使用带有 div 标签的滚动事件它运行良好。但是当我在 iframe 标签中添加滚动事件以检测用户滚动 pdf 页面时,它不起作用。为什么我不能访问 iframe 中的 html 元素?,我在下面有代码检查:

我尝试使用 iframe 添加 javascript 滚动事件:

HTML 代码:

<iframe id="myframe" src="doc.pdf"></iframe>

JavaScript 代码:

document.getElementById('myframe').onscroll = function()
	 	alert('scrolling page');
;

【问题讨论】:

【参考方案1】:

iframe 没有滚动方法,iframedocument 有 - 您需要引用内部 document 而不是 <iframe> 标记。

你可以用iframe.contentDocument引用它:

var iframe = document.getElementById('frame');

iframe.contentDocument.body.innerHTML = 'a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>a<br>';

iframe.contentDocument.addEventListener('scroll', function(event) 
  console.log(event);
, false);
&lt;iframe id="frame"&gt;&lt;/iframe&gt;

请参阅:https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement 了解更多信息

【讨论】:

那么,如果我想与 pdf 一起使用,我应该与任何一个(对象、嵌入、iframe)一起使用吗? 无法获取 iframe.contentDocument,它为空【参考方案2】:

javascript 为我们提供了 onscroll 作为传递参数的属性(可以是函数)。但是我们这里有 iframe,试试下面的代码 sn-p (jQuery)。

$("#yourFrameId").load(function () 
     var iframe = $("#yourFrameId").contents();

    $(iframe).scroll(function ()  
        //your code here
    );
);

【讨论】:

contentDocument 与 contents() 有什么不同? 当然。 contentDocument 属性仅返回由 frame 或 iframe 元素生成的 Document 对象。而 contents() 方法允许我们在 DOM 树中搜索这些元素的直接子元素,并从匹配的元素构造一个新的 jQuery 对象。【参考方案3】:

我遇到了这个问题,这是我的实现之一。

var currAgreementTab = this.get('parentController').get('currAgreement');
var contractContainer = Ember.$('div#marginContractContainer');
var iframe = contractContainer.children(currAgreementTab.element)[0].contentWindow;

if (iframe) 
  iframe.onscroll = function() 
    var scrolledHeight = Ember.$(iframe).height() === Ember.$(iframe.document).innerHeight() ? Ember.$(iframe).height() : Ember.$(iframe.document).innerHeight() - Ember.$(iframe).height();

    if (Ember.$(iframe).scrollTop()  === scrolledHeight) 
      var currAgreementTab = that.get('parentController').get('currAgreement');
      Ember.set(currAgreementTab, 'checkDisabled', false);
    
  

【讨论】:

点评来源: 您好,请不要只回答源代码。尝试对您的解决方案如何工作提供一个很好的描述。请参阅:How do I write a good answer?。谢谢

以上是关于javascript-如何检测 iframe 中的滚动事件?的主要内容,如果未能解决你的问题,请参考以下文章

检测 iframe、服务器端(无 javascript)?

如何从外部窗口检测用户在 iframe 中导航到的 URL?

如何使用 javascript 从 iframe 内部获取 iframe 的高度?具有多个 iframe 的页面呢?

在javascript或jQuery中检测iframe的负载(不是同一个域,动态添加)?

如何检测 iframe 视频何时结束?没有 API

在javascript中读取iFrame(不在同一个域-YouTube)中的div状态[重复]