extjs调用iframe父级函数

JavaScript021

extjs调用iframe父级函数,第1张

1、以下解决方案基于extjs4.2.1 架构采用extjs MVC。

页面结构为左侧菜单树,右侧TabPanel,点击菜单树,动态在tabpanel内新建利用树的id生成的tabpanel页,当然了,iframe的内容就是树的节点herf,文中加粗部分就是这个过程的实现。

2、例程:

Ext.define('Sys.controller.MenuController', {

    extend: 'Ext.app.Controller',

    refs: [{

        ref: 'menuTreeView',

        selector: 'menutreeview'

    },

    {

        ref: 'contentCardView',

        selector: 'contentcardview'

    }

    ],

    stores: ['SysTree'],

   

    init: function() {

      this.control({

        'menutreeview': {

                beforeitemexpand: this.onItemExpand,

                beforeitemclick: this.onBeforeItemClick,

                itemclick : this.onClickTree

            }

       })

    },

   

    onItemExpand:  function(node,optd){

   var store = this.getSysTreeStore()         

   var mProxy=store.getProxy()

      mProxy.setExtraParam("id",node.get("id"))

       

 } ,

 onBeforeItemClick: function(viewtree, record, item, index, e, eOpts ){

 

   e.stopEvent()

 },

window.parent与window.opener的区别 javascript调用主窗口方法

1: window.parent

是iframe页面调用父页面对象

举例:

a.html

Html代码 <html>

<head><title>父页面</title></head>

<body>

<form name="form1" id="form1">

<input

type="text" name="username" id="username"/>

</form>

<iframe src="b.html" width=100%></iframe>

</body>

</html>

如果我们需要在b.htm中要对a.htm中的username文本框赋值,就如很多上传功能,上传功能页在Ifrmae中,上传成功后把上传后的路径放入父页面的文本框中

我们应该在b.html中写

Html代码

<script type="text/javascript">

var _parentWin =

window.parent

_parentWin.form1.username.value = "xxxx"

</script>

实例地址: 实例/a.html

源码:

1.a.html

Html代码

<html>

<head>

<title>主页面</title>

<script>

/** 为测试IFrame子窗口调用父窗口的全局变量而添加的测试变量 */

var parentVairous = "为测试IFrame子窗口调用父窗口的全局变量而添加的测试变量"

function parentInvokeIFrame()

{

var

iframeTest = document.frames["iframeTest"]

//使用document.getElementById("iframeTest")同样可以

alert(iframeTest.document.body.innerHTML)

alert(iframeTest.iFrameVair)

}

</script>

</head>

<body>

<form name="form1"

id="form1">

<input type="text" name="username"

id="username"/>

<input type = "button" value =

"父窗口调用IFrame子窗口中的内容" onclick = 'parentInvokeIFrame()'/>

</form>

<iframe src="b.html" width = '100%' id =

'iframeTest'></iframe>

</body>

</html>

1.b.html

Html代码

<html>

<head>

<title></title>

<script

type="text/javascript">

/**

为测试父窗体调用IFrame子窗体的全局函数而添加的子窗口全局函数 */

var iFrameVair =

"测试父窗体调用IFrame子窗体的全局函数"

function

UpdateParent()

{

var _parentWin =

window.parent

_parentWin.form1.username.value = "xxxx"

}

function

childInvokeParent()

{

var parentVairous =

window.parent.window.parentVairous

alert(parentVairous)

}

</script>

</head>

<body>

<form name="form1"

id="form1">

<p> </p>

<p

align="center">

<input type = "button"

name = "button"

id =

"button"

value = "更新主页面的UserName内容"

onclick = "UpdateParent()">

<input type = "button"

name = "button2"

id = "button2"

value

= "测试IFrame子窗口调用父窗口的全局变量"

onclick =

"childInvokeParent()"/>

</p>

<p>

</p>

</form>

</body>

</html>

ps:不能跨域获取,例如iframe的src是'http://www.xxx.ccc/'就不可以

2: window.opener

是window.open 打开的子页面调用父页面对象

实例地址: 实例/a.html

源码:

2.a.html

Html代码

<html>

<head>

<title>主页面</title>

<script type="text/javascript">

/**

为测试IFrame子窗口调用父窗口的全局变量而添加的测试变量 */

var parentVairous =

"为测试IFrame子窗口调用父窗口的全局变量而添加的测试变量"

/**

*

因为不同于IFrame(IFrame有id,window.open()与IFrame的父子窗口的模式不同),

*

所以当是通过window.open()方法打开一个新窗口使, 必须有一个新窗口的对象

* 当然必须先让子窗口弹出来,

才能调用子窗口中的变量, 否则抛出异常

*/

var OpenWindow

function openSubWin()

{

OpenWindow =

window.open('b.html', 'newwindow', 'height=1024, width=1300, top=0, left=0,

toolbar=no, menubar=yes, scrollbars=yes,resizable=yes,location=no,

status=no')

}

function parentInvokeChild()

{

if(OpenWindow)//当然必须先让子窗口弹出来, 才能调用子窗口中的变量,

否则抛出异常

{

alert(OpenWindow.iFrameVair)

}

}

</script>

</head>

<body>

<form

name="form1" id="form1">

<input type="text" name="username"

id="username"/>

<input type="button" value="弹出子页面" onclick =

"openSubWin()">

<input type="button" value="测试调用弹出窗口中的全局变量"

onclick = "parentInvokeChild()">

</form>

</body>

</html>

2.b.html

Html代码

<html>

<head>

<title>子页面</title>

<script

type="text/javascript">

/** 为测试父窗体调用IFrame子窗体的全局函数而添加的子窗口全局函数

*/

var iFrameVair = "测试父窗体调用IFrame子窗体的全局函数"

function UpdateParent()

{

var _parentWin =

window.opener

_parentWin.form1.username.value = "xxxx"

}

function childInvokeParent()

{

var parentVairous =

window.opener.window.parentVairous

alert(parentVairous)

}

</script>

</head>

<body>

<form name="form1"

id="form1">

<p> </p>

<p align="center">

<input type="button"

onclick =

"UpdateParent()"

name="button"

id="button"

value="更新主页面的UserName内容">

<input type = "button"

name = "button2"

id = "button2"

value =

"测试IFrame子窗口调用父窗口的全局变量"

onclick =

"childInvokeParent()"/>

</p>

<p> </p>

</form>

</body>

经过hanjs的提醒,确实需要注意的是,模态窗口的子窗口是没有办法修改父窗口页面中的任何内容的。

例如修改:OpenWindow =

window.open('b.html', 'newwindow', 'height=1024, width=1300, top=0, left=0,

toolbar=no, menubar=yes, scrollbars=yes,resizable=yes,location=no,

status=no')

为:OpenWindow =

window.showModalDialog("b.html",'newwindow',"dialogHeight:100px,center:yes,resizable:no,status:no")

在子窗口中当希望修改父窗口中的内容时,会弹出“某某”为空或不是对象的错误,而这里的“某某”就是你想修改的父窗口中的内容

1、打开编辑工具editplus,点击editplus菜单栏上的【File】-->New -->HTML page。

2、新建好html页面后,editplus自动帮助我们生成了框架,先把title修改下,然后保存。

3、在body区域里添加了子,父,祖父三级div,代码如下。

4、演示代码写好后,打开浏览器,在浏览器上运行看看效果。

5、下面在head区域里添加实现js获取最高父级的代码,代码具体如下,这样利用了while循环来判断的。

6、实现好后,保存代码,此时再到浏览器上刷新访问,看下,此时弹出对话框告诉最后父级是zufu。