当用户滚动到 iframe 或 iframe 在视口中时,从 iframe 调用 js 函数

Posted

技术标签:

【中文标题】当用户滚动到 iframe 或 iframe 在视口中时,从 iframe 调用 js 函数【英文标题】:Calling js function from an iframe when user scrolls to the iframe or when the iframe is in viewport 【发布时间】:2013-11-18 05:30:49 【问题描述】:

我的网站提供了 iframe 代码,这些代码放在其他一些网站中。

为简单起见,假设我的域,即 iframe 的来源是 www.abc.com,而使用我的 iframe 代码的客户拥有域 www.xyz.com。

在我的 iframe 网站中,我尝试使用 javascript 访问用户的地理位置。

当在移动设备上浏览 www.xyz.com 时,www.abc.com(在 iframe 中)会放置一个确认框以允许或拒绝访问 geoLocation。

现在我的问题是:-

我只想在 iframe 位于浏览器的可视区域时显示确认框。而且我想在不要求我的客户在他们的网站中添加更多 js 代码的情况下做到这一点。这一切都应该发生在我的 iframe 源中。

我尝试了以下方法,但 visibilityChanged() 仅在我们更改浏览器选项卡或最小化或最大化浏览器时才会被触发...

示例代码。一个.html

<!DOCTYPE html>
<html>
<head>
<script>
function onLoad() 
    console.log('onload:', (document.hidden));
    document.addEventListener("webkitvisibilitychange", visibilityChanged);


function visibilityChanged() 
    console.log('visibilityChanged: ',arguments);


</script>
</head>
<body onload="onLoad()">
test
</body>
</html>

b.html

<!DOCTYPE html>
<html>
<head>  
</head>
<body>
<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>
<iframe style="border:1px solid red; width:200px;height:200px;" src="a.html"/>
</body>
</html>

【问题讨论】:

【参考方案1】:

应该在移动设备上得到广泛支持的新 PageVisibility API 看起来更有希望:

广泛支持:http://caniuse.com/#feat=pagevisibility 规格:http://www.w3.org/TR/page-visibility/

规范中的代码 sn-p(上):

   var timer = 0;
   var PERIOD_VISIBLE = 1000;
   var PERIOD_NOT_VISIBLE = 60000;

   function onLoad() 
       timer = setInterval(checkEmail, (document.hidden) ? PERIOD_NOT_VISIBLE : PERIOD_VISIBLE);
       if(document.addEventListener) document.addEventListener("visibilitychange", visibilityChanged);
   

   function visibilityChanged() 
       clearTimeout(timer);
       timer = setInterval(checkEmail, (document.hidden) ? PERIOD_NOT_VISIBLE : PERIOD_VISIBLE);
   

   function checkEmail()  
       // Check server for new messages
   

【讨论】:

请注意,根据 caniuse.com 的注释,在 Chrome、Opera 和 android 浏览器(即将推出)上,它仍然是“document.webkitHidden”,而不仅仅是“document.hidden”。 我尝试了 visibilitychange 事件,但它似乎仅在浏览器选项卡更改或浏览器窗口最小化时触发......当我们滚动到 iframe 时它不会生效。 深入研究,不幸的是,这似乎是预期的行为:“当用户代理确定***浏览包含的文档的可见性时,用户代理必须在文档上触发 visibilitychange 事件上下文发生了变化。”因此,如果在 DOM 中仍然无法检查这一点,那么做 x-site 最不痛苦的方法是让主机页面使用'window.name':window.name = getPublicPositionInfo: function() .. 也就是说,如果window.name 传输仍然有效:请参阅:bit.ly/1b3PoI6。但我知道您可能无法让主机页面组织添加您的任何代码。

以上是关于当用户滚动到 iframe 或 iframe 在视口中时,从 iframe 调用 js 函数的主要内容,如果未能解决你的问题,请参考以下文章

Android iframe错误

当鼠标悬停在 Firefox 中的嵌入式 iframe 上时,防止父页面滚动

“触摸”嵌入式 iframe 时如何禁用滚动?

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

隐藏 iframe 中的滚动,当 IE 中的 iframe 为空时

如何使 iframe 滚动到特定项目