主页面调用iframe里面匿名Javascript函数的问题

来源:互联网 发布:店铺宝贝优化 编辑:程序博客网 时间:2024/05/22 02:27

       这个问题出现已经几天了,今天终于解决了,特此记录下来。

       问题的出现始于我在HTML5下采用Reveal.js来播放PPT和使用canvas来制作透明画板,二者结合以后,画板在顶层,PPT放在iframe里,在底层。

       这样子,实现播放PPT的同时能够随意写划,但是首先出现的问题就是PPT无法控制,键盘事件被画板层捕捉,此问题出现时我就尝试使用Javascript把画板捕捉的键盘事件传送至iframe层,但是没有成功,后来用一个很简单的办法解决了这个问题。随后需要在平板上控制PPT的播放,此时没有键盘事件了,只能在屏幕上添加按钮,又出现了需要调用iframe层Javascript函数的问题,我先是走了许多弯路,以为问题出现在调用的函数不对,后来发现Reveal.js为了避免重复的变量或者函数声明引起错误把整个js文件用匿名函数实现了封装。借此机会我学习了Javascript的匿名函数,及其使用的好处,尝试了一些方法还是未能解决问题。

         在整个过程中,我首先是寻找主页面调用iframe层Javascript函数的方法,但是当时我并不知道Reveal.js是被封装了的匿名函数,所以调用失败了。等我知道Reveal.js是匿名函数后我又去寻找调用匿名函数的方法,最后发现原来我要使用的方法Reveal.js早已封装成了API供我调用,但是仍旧不能成功。最后又回到主页面调用iframe子页面js函数这条老路,最终解决了问题。下面上方法:

        首先是匿名函数:

(function() { // 匿名函数function right() {    turnRight();}// 其他代码}()); // 立即执行

匿名函数内部声明的函数、通过var声明的变量等等都是内部的,不能被任何匿名函数以外的代码访问到。

调用匿名函数内部js函数的方法:

var Reveal = (function(global) {function right() { turnRight();}right1 = right; // 法一:利用没有var的变量声明的默认行为,在right成为全局变量(不推荐)global.right2= right; // 法二:直接在全局对象上添加right属性,赋值为right函数(推荐)return { // 法三:通过匿名函数返回值得到一系列接口函数集合对象,赋值给全局变量Reveal(推荐) right : right};}(window));

此处建议通过第三种方法提供API。


主页面访问iframe子页面js函数的方法:
var test= document.getElementById("mainiframe");test.contentWindow.right();
主页面访问iframe子页面匿名js函数的方法(假设匿名函数就是上面的Reveal):
var test= document.getElementById("mainiframe");test.contentWindow.Reveal.right();
上面都是没有跨域的情况。


0 0
原创粉丝点击