(转) js操作frameset frame 对象

2009年7月7日 没有评论

框架编程概述
一个HTML页面可以有一个或多个子框架,这些子框架以<iframe>来标记,用来显示一个独立的HTML页面。这里所讲的框架编程包括框架的自我控制以及框架之间的互相访问,例如从一个框架中引用另一个框架中的JavaScript变量、调用其他框架内的函数、控制另一个框架中表单的行为等。
框架间的互相引用
一个页面中的所有框架以集合的形式作为window对象的属性提供,例如:window.frames就表示该页面内所有框架的集合,这和表单对象、链接对象、图片对象等是类似的,不同的是,这些集合是document的属性。因此,要引用一个子框架,可以使用如下语法:
window.frames["frameName"];
window.frames.frameName
window.frames[index]
其中,window字样也可以用self代替或省略,假设frameName为页面中第一个框架,则以下的写法是等价的:
self.frames["frameName"]
self.frames[0]
frames[0]
frameName
每个框架都对应一个HTML页面,所以这个框架也是一个独立的浏览器窗口,它具有窗口的所有性质,所谓对框架的引用也就是对window对象的引用。有了这个window对象,就可以很方便地对其中的页面进行操作,例如使用window.document对象向页面写入数据、使用 window.location属性来改变框架内的页面等。
下面分别介绍不同层次框架间的互相引用:
1.父框架到子框架的引用
知道了上述原理,从父框架引用子框架变的非常容易,即:
window.frames["frameName"];
这样就引用了页面内名为frameName的子框架。如果要引用子框架内的子框架,根据引用的框架实际就是window对象的性质,可以这样实现:
window.frames["frameName"].frames["frameName2"];
这样就引用到了二级子框架,以此类推,可以实现多层框架的引用。
2.子框架到父框架的引用
每个window对象都有一个parent属性,表示它的父框架。如果该框架已经是顶层框架,则window.parent还表示该框架本身。
3.兄弟框架间的引用
如果两个框架同为一个框架的子框架,它们称为兄弟框架,可以通过父框架来实现互相引用,例如一个页面包括2个子框架:
<frameset rows=”50%,50%”>
     <frame src=”1.html” name=”frame1″ />
     <frame src=”2.html” name=”frame2″ />
</frameset>
在frame1中可以使用如下语句来引用frame2:
self.parent.frames["frame2"];
4.不同层次框架间的互相引用
框架的层次是针对顶层框架而言的。当层次不同时,只要知道自己所在的层次以及另一个框架所在的层次和名字,利用框架引用的window对象性质,可以很容易地实现互相访问,例如:
self.parent.frames["childName"].frames["targetFrameName"];
5.对顶层框架的引用
和parent属性类似,window对象还有一个top属性。它表示对顶层框架的引用,这可以用来判断一个框架自身是否为顶层框架,例如:
//判断本框架是否为顶层框架
if(self==top){
       //dosomething
}
改变框架的载入页面
对框架的引用就是对window对象的引用,利用window对象的location属性,可以改变框架的导航,例如:
window.frames[0].location=”1.html”;
这就将页面中第一个框架的页面重定向到1.html,利用这个性质,甚至可以使用一条链接来更新多个框架。
<frameset rows=”50%,50%”>
     <frame src=”1.html” name=”frame1″ />
     <frame src=”2.html” name=”frame2″ />
</frameset>
<!–somecode–>
<a href=”frame1.location=’3.html;frame2.location=’4.html’” onclick=”">link</a>
<!–somecode–>
引用其他框架内的JavaScript变量和函数
在介绍引用其他框架内JavaScript变量和函数的技术之前,先来看以下代码:
<script language=”JavaScript” type=”text/javascript”>
<!–
function hello(){
      alert(“hello,ajax!”);
}
window.hello();
//–>
</script>
如果运行了这段代码,会弹出“hello,ajax!”的窗口,这正是执行hello()函数的结果。那为什么hello()变成了window对象的方法呢?因为在一个页面内定义的所有全局变量和全局函数都是作为window对象的成员。例如:
var a=1;
alert(window.a);
就会弹出对话框显示为1。同样的原理,在不同框架之间共享变量和函数,就是要通过window对象来调用。
例如:一个商品浏览页面由两个子框架组成,左侧表示商品分类的链接;当用户单击分类链接时,右侧显示相应的商品列表;用户可以单击商品旁的【购买】链接将商品加入购物车。
在这个例子中,可以利用左侧导航页面来存储用户希望购买的商品,因为当用户单击导航链接时,变化的是另外一个页面,即商品展示页面,而导航页面本身是不变的,因此其中的JavaScript变量不会丢失,可以用来存储全局数据。其实现原理如下:
假设左侧页面为link.html,右侧页面为show.html,页面结构如下:
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
<html>
<head>
<title> New Document </title>
</head>
<frameset cols=”20%,80%”>
      <frame src=”link.html” name=”link” />
      <frame src=”show.html” name=”show” />
</frameset>
</html>
在show.html中展示的商品旁边可以加入这样一条语句:
<a href=”void(0)” onclick=”self.parent.link.addToOrders(32068)”>加入购物车</a>
其中link表示导航框架,在link.html页面中定义了arrOrders数组来存储商品的id,函数addToOrders()用来响应商品旁边【购买】链接的单击事件,它接收的参数id表示商品的id,例子中是一个id为32068的商品:
<script language=”JavaScript” type=”text/javascript”>
<!–
var arrOrders=new Array();
function addToOrders(id){
      arrOrders.push(id);
}
//–>
</script>
这样,在结帐页面或是购物车浏览页面就可以用arrOrders来获取所有准备购买的商品。
框架可以使一个页面划分为功能独立的多个模块,每个模块之间彼此独立,但又可以通过window对象的引用来建立联系,是Web开发中的一个重要机制。

页面内引用此页面中Iframe页面内的控件的值可直接写:
function test() {
   var num = window.iframename.inputtextname.value;
    alert( num );
}
此页面中的Iframe要调用页面中的js代码时可直接写:
<input value=”点击” type=”button” onclick=”window.parent.test()” />

分类: HTML, javasrcipt 标签: ,

div水平居中

2009年7月1日 1 条评论

今天在考试项目中使用margin:0 auto;属性使页面的一个DIV水平居中,但是在IE下没有效果,后来上网找了一下才知道原来是漏了DTD声明.在页面加入如下代码解决:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

原来还有第二种方法:

margin-left:50%;
left: -width/2;

记录一下,方便自己以后在开发时又忘了。

分类: javasrcipt 标签: ,

fckeditor ajax提交表单为空解决方案(摘自FCK官网)

2009年6月23日 5 条评论

The editor’s content is empty when submitting the editor’s surrounding form by ajax. What is wrong?

This problem is caused by a missing call of the function FCK.UpdateLinkedField(). By submitting the editor’s surrounding form with an ajax function the values of all form elements are collected in a javascript object (some kind of an array). At this time the value of the hidden field that usually contains the editor’s html output is empty, because the editor’s surrounding form wasn’t submitted for real, you can call it a simulated submit. The workaround is to call the FCK.UpdateLinkedField() function before submitting the form. Either you call it directly before the ajax collect function or in the onClick attribute of the submit button. For general use, even if you have more than one FCKeditor instance, I wrote the following hack to solve the problem.

// Some Class
function MyClass()
{
this.UpdateEditorFormValue = function()
{
for ( i = 0; i < parent.frames.length; ++i )
if ( parent.frames[i].FCK )
parent.frames[i].FCK.UpdateLinkedField();
}
}
// instantiate the class
var MyObject = new MyClass();

Now can call this method in the onSubmit attribute of the editor’s surrounding form before calling the ajax collecting function:

<form ... onSubmit="MyObject.UpdateEditorFormValue(); Ajax.Collect(); return false;">

NOTE: the previous syntax won’t work if using VisualStudio 2005 and Atlas and IE. It will be ok to use:

<form ... onSubmit="MyObject.UpdateEditorFormValue(); return true;">

Or you’ll do it in the onClick attribute of the submit button, which is also called before the onSubmit event: <input type=”submit” … onClick=”MyObject.UpdateEditorFormValue();” /> Edited by heiligkind ( hollo@heiligkind.de ) 17 August 2006

A german version can be found at: http://blog.heiligkind.de/category/nutzliches/

分类: javasrcipt 标签: , ,

apache 虚拟服务器配置

2009年4月26日 1 条评论

经常要在本机配虚拟服务器,每一次都不记得,记录一下,

在apache 的 httpd.conf后面加:

NameVirtualHost *:80
#
# NOTE: NameVirtualHost cannot be used without a port specifier
# (e.g. :80) if mod_ssl is being used, due to the nature of the
# SSL protocol.
#

#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for requests without a known
# server name.
#
#<VirtualHost *:80>
#    ServerAdmin webmaster@dummy-host.example.com
#    DocumentRoot /www/docs/dummy-host.example.com
#    ServerName dummy-host.example.com
#    ErrorLog logs/dummy-host.example.com-error_log
#    CustomLog logs/dummy-host.example.com-access_log common
#/VirtualHost>
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /var/www/html
    ServerName dummy-host.example.com
    ErrorLog logs/dummy-host.example.com-error_log
    CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>

分类: 其他 标签:

清明返河源摘记

2009年4月9日 3 条评论
事件一:2009年4月5日,在惠州市淡水镇坐到回紫金古竹镇(我的老家,呵呵),古竹镇位于东江河边,郁闷的是因为东江大桥年久失修,要坐船过去(记得在四五岁时跟爸爸妈妈一起去惠州时是这样过东江的,没有想到20年后还…..有点怀念).
正在修的东江大桥
正在修的东江大桥
部分还算完好的桥

部分还算完好的桥

事件二: 买特产

2009年4月7日来到县城里办证件的,谁知办证的小姐说我的户口簿少打了资料,叫我到户口所在地的派出所重新打印出来,很郁闷,后来没有办成,就到街上去逛了一下,想买点河源的特产回去给以前的同事尝试一下.在一间商场看了一下价钱,呵呵,7.5元,以前在这里读书时有很多的特产专卖店,应该比较便宜吧!顺着车站的方向,问了几家,8,9,12…我心里想了一下,现在的经济环境…竟然也这样宰人.最后..什么也没有买.

事件三:车站厕所

很郁闷,没有买到特产,就坐摩托车去车站坐车,买好了车票,买了12点半的车票回广州.人有三急,我直奔厕所所在地,刚到厕所门,就看到一个黑口黑面的阿姨说,一次一块钱!我更郁闷,没有想到这种等级的公共场所上个厕所也要一块钱.我也没有说什么,给了她一块钱,她还给我一包纸巾,我说我小便.然后她还了我五毛钱.后来因为12点半的车的空调坏了,我改坐一点半的车.差不多上车的时候,考虑到坐4个多小时的车,再送五毛钱给那个厕所阿姨吧,谁知道,去到厕所时,竟没有人在那里收钱了.晕,这厕所的收费是不是也是分段收费的.忙时5毛,闲时免费.

 

 

分类: 其他 标签:

通过P3P协议,实现跨域set cookie

2009年4月2日 2 条评论

在之前的项目中,遇到这个一个问题,实现跨域跨服务器间进行通信.虽然在之前简老师有和我说过通行证的原理,因为没有进行过实际的操作,也没有太大的把握可以通过通行证的方式实现这个需求.上网找了一下资料,发现有P3P的这个协议,它的定义是:

P3P是万维网联盟(W3C)公布的一项隐私保护推荐标准,旨在为网上冲浪的Internet用户提供隐私保护。现在有越来越多的网站在消费者访问时,都会收集一些用户信息。制定P3P标准的出发点就是为了减轻消费者因网站收集个人信息所引发的对于隐私权可能受到侵犯的忧虑。P3P标准的构想是:Web 站点的隐私策略应该告之访问者该站点所收集的信息类型、信息将提供给哪些人、信息将被保留多少时间及其使用信息的方式,如站点应做诸如 “本网站将监测您所访问的页面以提高站点的使用率”或“本网站将尽可能为您提供更合适的广告”等申明。访问支持P3P网站的用户有权查看站点隐私报告,然后决定是否接受cookie或是否使用该网站。

最后我决定用跨域设置cookie实现这一需求.

首先我们假设有A站(www.aaa.com)和B站(www.bbb.com),两个站点在不同服务器且不同域下,我们在A站下新建一个setcookie.php文件,代码如下:

<?php

            header(‘P3P: CP=”CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR”‘);

             $cookie_name=$_GET['name'];

             $cookie_value=$_GET['value'];

             setcookie($cookie_name, $cookie_value,time()+3600);

?>

接下来我们在B站下新建一个文件叫b_setcookie.php的文件,代码如下:

<?php

             <script src=”http://www.aaa.com/setcookie.php?name=test&value=bbb.com”></script>

?>

好,现在我们在A站下再新建一个文件叫getcookie.php的文件,代码如下:

<?php

    echo ‘<pre>’;

    print_r($_COOKIE);

?>

现在我们先在浏览器访问B站的b_setcookie.php文件,然后再访问A站的getcookie.php文件,看是否会打印相应的cookie值出来.

完了,代码没有经过测试,只是凭我自己的记忆,希望不会怱悠到大家啦,呵呵!如果有错,欢迎指出,谢谢!

分类: PHP 标签: , ,

开始尝试写博客

2009年3月31日 1 条评论

很久前就想写一下博客,把自己过去的一些相关人,或事,或物都记下来,等自己不知道那一天记忆衰退时,可以重温一下.刚好这段时间忙完手头上的一些事情,也刚好即将失业,算是一个标记性的新开始,希望各位朋友常来坐坐,呵呵!

momo这个俗号是之前一间公司的同事给的,刚开始觉得这个称呼有点怪怪的,但是习惯了,也喜欢上了,不然大家也可以叫我kevin,这个呢,也是进来这间差不多要离职的公司要求要有一个英文名乱找出来的.momo,kevin,阿武,都行.

分类: 生活点滴 标签: