在html中普通的父容器调用子容器中的方法十分简单

因为这两个容器的所有方法和属性都在同一个dom模型中

可以直接控制和使用

但是如果子容器中是一个iframe标签又是怎样的情况?

iframe请求另外一个页面并显示

这时候父子容器的方法和属性等都不在一个dom模型中了

有些情况又要求父子容器能够互相调用方法来实现某一功能

这时候要怎么实现这个要求呢

其实一个html页面内的所有方法等最后都会被加载到该页面dom模型的window内

例如经常使用的

window.onload()//在页面加载完成后执行的事件/方法

如果在一个页面内定义了一个js方法

function DoSomething(){...}

那么这个方法最后会被加载到window下面

可以通过这个window点出来并使用这个方法

那么,现在只要能够拿到子容器iframe内部页面的window就可以在父容器中调用子容器的方法了

例子:

HtmlPage1.html页面中

<input type="button" id="btnShowChild" value="点击弹出子容器"/>
<div id="divChild">
<iframe id="ifmChild" src="javascript:void(0)"></iframe>
</div>

页面如下:

很简单就一个按钮的页面

点击这按钮,弹出id为divChild的div

在这个div中包含一个iframe

在点击按钮弹出div的同时设置iframe的src属性为HtmlPage2.html

为了方便操作使用到了jquery easyui的插件

在该页面中输入以下js代码:

//在窗体加载完成后
$(function () {
//获得div
var divChild = $("#divChild");
//刚开始的时候设置div隐藏
divChild.css("display", "none"); //按钮点击事件
$("#btnShowChild").click(function () {
//设置iframe的src属性为HtmlPage2.html
$("#ifmChild").attr("src", "HtmlPage2.html");
//显示div
divChild.css("display", "block");
//将div以对话框的形式弹出(easyui)
divChild.dialog({
title: "我是父容器",
buttons: [{
//确认按钮
text: '提交子容器中的表单',
iconCls: "icon-ok",
handler: function () {
//点击该按钮之后执行的方法 }
}, {
//关闭按钮
text: '关闭',
handler: function () {
$("#divChild").dialog('close');
}
}]
});
});
});

HtmlPage2.html页面:

 <form id="fmSubmit">
<table>
<tr>
<td colspan="2">
我其实是一个Iframe标签,是一个子容器
</td>
</tr>
<tr>
<td>
用户名:
</td>
<td>
<input type="text" id="txtUid" name="txtUid"/>
</td>
</tr>
<tr>
<td>
密码:
</td>
<td>
<input type="password" id="txtPwd" name="txtPwd"/>
</td>
</tr>
</table>
</form>

一个表单包含一个table的简单布局

现在回到HtmlPage1.html页面

点击页面上的按钮:

这时候已经将HtmlPage2.html页面通过一个iframe标签以子容器的形式显示在HtmlPage1.html页面中

这时我们需要的效果是

点击“提交子容器中的表单”按钮

使HtmlPage2.html中的表单异步提交

成功提交之后再HtmlPage1.html中关闭这个子容器,并将HtmlPage1.html页面上的按钮值显示为“完成”

首先要通过点击父容器中的一个按钮来执行子容器中的一个方法使表单提交

可以通过获得子容器的window来得到并执行这个方法

所以在HtmlPage2.html中定义这样一个js方法:

//提交表单方法
function SubmitForm() {
//获得页面文本框的值
var txtUid = $("#txtUid").val();
var txtPwd = $("#txtPwd").val();
//通过jquery异步提交表单
$.ajax({
url: "Handler1.ashx",
data: "Uid=" + txtUid + "&&Pwd=" + txtPwd,
type: "Get",
success: function(res) {
if (res == "ok") {
//提交成功之后执行的方法 } else {
alert("子容器iframe异步提交出错!");
}
}
});
}

通过一个一般处理程序来接收数据并简单的判断然后返回数据

context.Response.ContentType = "text/plain";
if (context.Request.QueryString["Uid"] == "111" && context.Request.QueryString["Pwd"] == "111")
{
context.Response.Write("ok");
}
else
{
context.Response.Write("error");
}

此时在HtmlPage1.html并不知道怎么来获得子容器的window

但是可以知道ifram标签肯定是重要的目标,因为是它在承载显示另外一个页面

所以可以在页面1中的“提交子容器中的表单”按钮事件先获得这个iframe标签,然后观察它的属性

divChild.dialog({
title: "我是父容器",
buttons: [{
//确认按钮
text: '提交子容器中的表单',
iconCls: "icon-ok",
handler: function () {
//点击该按钮之后执行的方法
//获得子容器的iframe标签
var ifmChild = $("#ifmChild");
}
}, {
//关闭按钮
text: '关闭',
handler: function () {
$("#divChild").dialog('close');
}
}]
});

在浏览器中打开页面1,并进行调试

点击“弹出子容器”按钮

并点击对话框中的“提交子容器中的表单”按钮,命中断点,将ifmChild添加监视查看

可以看到,这个ifame标签似乎是一个数组,而且只有一个元素

那么打开这唯一一个元素看看里面有没有window属性

但是找了全部找了一遍好像没有发现window这个属性

但是却找到了一个contentWindow,它在这里

可以看到这个contentWindow后面还跟着一个[object Window]

先不管这是啥意思

反正跟window有关先拿来用看看

还是修改对话框中按钮的事件

divChild.dialog({
title: "我是父容器",
buttons: [{
//确认按钮
text: '提交子容器中的表单',
iconCls: "icon-ok",
handler: function () {
//点击该按钮之后执行的方法 //获得子容器的iframe标签
//var ifmChild = $("#ifmChild"); var childWindow = $("#ifmChild")[0].contentWindow;
childWindow.SubmitForm();
}
}, {
//关闭按钮
text: '关闭',
handler: function () {
$("#divChild").dialog('close');
}
}]
});

其实到这里很明了了,如果有装R#插件的同学可以甚至直接在childWindow点出子容器中的SubmitForm方法

然后转到页面2

在表单提交成功后的事件中

获得当前window的parent属性

这个属性就是页面1的window,因为页面1就是页面2的父容器

如此一来,就可以再页面2中直接使用父容器页面1中的方法了

//通过jquery异步提交表单
$.ajax({
url: "Handler1.ashx",
data: "Uid=" + txtUid + "&&Pwd=" + txtPwd,
type: "Get",
success: function(res) {
if (res == "ok") {
//提交成功之后执行的方法
window.parent.AfterChildSubmit();
} else {
alert("子容器iframe异步提交出错!");
}
}
});

所以要在页面1中准备一个AfterChildSubmit方法

function AfterChildSubmit() {
//关闭对话框
$("#divChild").dialog('close');
//消息提示
alert("子容器成功调用父容器的AfterChildSubmit方法");
//修改按钮的值
$("#btnShowChild").val("完成");
}

最后测试如下:

dom元素父子容器互相调用控制的更多相关文章

  1. 通过class和id获取DOM元素的区别

    1.通过id获取DOM元素的方法:document.getElementById("id名") 2.通过class获取DOM元素的方法:document.getElementsBy ...

  2. Angular获取dom元素,以及父子组建之间相互传值

    1.使用原生js代码获取dom元素 在ts文件中有一个ngOnInit()的方法,这个方式是指在模块加载完毕之后并不是dom加载完毕,也就是说如果你的dom元素中使用的angular的指令,然后想在这 ...

  3. 使用jQuery匹配文档中所有的li元素,返回一个jQuery对象,然后通过数组下标的方式读取jQuery集合中第1个DOM元素,此时返回的是DOM对象,然后调用DOM属性innerHTML,读取该元素 包含的文本信息

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 笔记:javascript操作iframe内的DOM元素,及调用iframe内的方法

    iframe相当于一个嵌入在网页内的浏览器,它与当前网页是隔离的. 但有时我们也需要在当前网页操作iframe内的元素或操作iframe内的javascript方法. 在网页内操作DOM元素,是使用d ...

  5. 防止用iframe调用网页dom元素

    <system.webServer> <httpProtocol> <customHeaders> <add name="X-Frame-Optio ...

  6. JS-DOM ~ 03. 子节点的操作、style.样式和属性、dom元素的创建方法及操作、14个例题、主要是利用js直接控制html属性

    带有Element和不带的区别 a)  带Element的获取的是元素节点 b)  不带可能获取文本节点和属性节点 获取所以子节点 a)   . childNodes b)   . children ...

  7. JavaScript-dom3 json_str dom元素控制 模拟百度搜索

    访问关系-封装代码 html <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  8. web进阶之jQuery操作DOM元素&&MySQL记录操作&&PHP面向对象学习笔记

    hi 保持学习数量和质量 1.jQuery操作DOM元素 ----使用attr()方法控制元素的属性 attr()方法的作用是设置或者返回元素的属性,其中attr(属性名)格式是获取元素属性名的值,a ...

  9. JavaScript获取DOM元素位置和尺寸大小

      在一些复杂的页面中经常会用JavaScript处理一些DOM元素的动态效果,这种时候我们经常会用到一些元素位置和尺寸的计算,浏览器兼容性问题也是不可忽略的一部分,要想写出预想效果的JavaScri ...

随机推荐

  1. Cow Dance Show

    题目大意: 经过几个月的排练,奶牛们基本准备好展出她们的年度舞蹈表演.今年她们要表演的是著名的奶牛芭蕾——“cowpelia”. 表演唯一有待决定的是舞台的尺寸.一个大小为K的舞台可以支持K头牛同时在 ...

  2. 杭电oj2047-2049、2051-2053、2056、2058

    2047  阿牛的EOF牛肉串 #include<stdio.h> int main(){ int n,i; _int64 s[]; while(~scanf("%d" ...

  3. eclipse 调试(debug) burpsuite 插件(Extender)

    demo: https://github.com/src-kun/transparent-cap/tree/master/burpsuite 1.打开demo项目: 2.右键项目点击Configure ...

  4. hadoop使用supervisord

    #安装 wget https://pypi.python.org/packages/80/37/964c0d53cbd328796b1aeb7abea4c0f7b0e8c7197ea9b0b9967b ...

  5. java如何增加数组长度

    遇到一个面试题:在不使用list的add方法的情况下,动态的添加元素(大概是这个样子): ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,需学习arraylist的相关知识(ht ...

  6. ZOJ 3820:Building Fire Stations(树的直径 Grade C)

    题意: n个点的树,边长全为1,求找出两个点,使得树上离这两个点距离最远的那个点,到这两个点(中某个点就行)的距离最小. 思路: 求树直径,找中点,删除中间那条边(如果直径上点数为奇数,则删任何一侧都 ...

  7. JAVA快速功能

    1.日期格式化 Date date=new Date(); //转换成时间格式12小时制 SimpleDateFormat df_12=new SimpleDateFormat("yyyy- ...

  8. Wannafly挑战赛4 A解方程【二分/set/hash求解方程】

    https://www.nowcoder.com/acm/contest/35/A 题目描述 给出n个整数和x,请问这n个整数中是否存在三个数a,b,c使得ax2+bx+c=0,数字可以重复使用. 输 ...

  9. [BZOJ 1266] 上学路线Route

    Link: BZOJ 1266 传送门 Solution: 好不容易自己写出来一道水题,练链式前向星的模板调了一小时o(╯□╰)o 思路非常好想,既然要想让最短路不成立,使最短路部分不连通即可 又要求 ...

  10. [POI2014]Criminals

    题目大意: 给你一个长度为$n(n\le10^6)$的颜色序列,其中每个颜色互不相同.两个人$A$和$B$分别从某个点出发从左往右.从右往左任意地选择颜色,然后在中间的某一点相遇.分别给出两人所选择的 ...