第一题的问题看不到,不知为什么;
第二题:不是太理解你的意思,可能<body OnUnload="bye()">可以;
第三题:OnClick="check()",在check()函数里判断checkbox状态,勾选则alert("yes"),否则alert("no")
第四题:可以考虑用fso类在客户端机器上创建文本文件记录,用fso读取.

解决方案 »

  1.   

    1:
    在h.htm中,加入
      top.frames.frame_a_htm.input_name.value=your_value;
    在a.htm中,加入
    <input name=input_name type=text>2:
    cookie分别记录自己的文件名或自己的特有键值,如果cookie都空了,就是全部退出了。3:
    <input type=checkbox onclick="JavaScript:{if(this.checked) alert('yes'); else alert('no');}">4:
    在服务器段记录。
      

  2.   

    第一个问题,你是否表达有误?这个问题与跳转到的网页包含几个frame并没有直接关系。从一个网页跳转到另一个网页如何传递参数呢?从一般意义上是无法传递的。因为http协议是无状态协议。除非你的网页是frameset,所谓跳转只是某个frame的跳转,则可以用隐藏的frame甚至frameset页来保存javascript变量。另一个可行的办法是使用cookie,javascript可以操作cookie,用来在客户端记录状态。下面就是一个例子:function SetCookie(sName, sValue)
    {
      document.cookie = sName + "=" + escape(sValue);
    }但是cookie的使用受到浏览器安全设置和隐私保护的限制。另一个办法就是用asp之类的服务器端脚本,用session之类机制来保持状态(实际上仍旧是依靠cookie、url参数、hidden input等客户端机制来实现)。至于javascript变量如何跨frame,相信你看一下文档就很快会掌握。但是需要指出的是,跨frame的javascript也受到安全设置的限制,比如不同frame的网页如果不处于同一个domain之下,是不允许互相访问的。另外,用户甚至可以设定不允许任何跨frame的javascript!因此许多人编写的利用跨frame的新藏变量来实现状态保持的机制其实并不可靠!
      

  3.   

    第二个问题的实质,实际上与第一个问题并无二致,同样是状态保持的问题。
    正如我上面所表述的那样,有3种方法可以实现:
    第一种是利用隐藏frame或相关window。其实现原理是frameset或某个主控window保持不变,利用frame和其它window来切换网页。当frame变换、一般window打开关闭时,向frameset和主控window更新相关的状态变量。说穿了,就是必定有一个document是不变的,而其他window也好、frame也好,都是万变不离其宗。
    采用这种方法,有显而易见的几个缺点。一是由于要处理各个网页的关系,使得编程复杂度大大提高,出现bug的概率也成倍增高;二是主控frame和主控window一旦关闭,整个状态就失效了,尽管你可以用捕获关闭窗口事件之类的方法防止状态不正常的失效,但是从浏览器的机制来说,用户始终具有任意性的控制权;三是无法保证一个实例,用户大可以打开任意多个主控窗口,推而广之,用户独立打开的窗口之间是无法强行关联的,尽管打开的可能都是同一个网站的网页;四是在网页跳转到站点之外时,将有浏览器安全性的限制来制止继续进行跨frame或跨window的操作,因此必须编写额外的方法用来在跳转之前解除关联,而同样的关联一旦解除就无法恢复,即使你用back功能再次返回到前页。
    第二种是利用cookie,它可以解决上述的大部分问题,也是在无法使用服务器端脚本的时候最佳的选择。但是你必须小心的控制cookie,遵循w3c制订的隐私策略,否则即使用户打开了cookie功能,浏览器也可能强行屏蔽它。第三种是利用服务器端脚本的session机制。对于不同的服务器端脚本环境,请参考相关的技术资料。
      

  4.   

    第三个问题,可以使用onclick事件来捕捉,楼上已有范例。对于IE5+来说,也可以用onpropertychange事件。但是注意它与onclick的机制是不同的。
      

  5.   

    第四个问题可以用userData Behavior(MS在IE5后提供的一个新的客户端存储数据的方法),具体参见http://msdn.microsoft.com/workshop/author/behaviors/reference/behaviors/userdata.asp?frame=true
      

  6.   

    不好意思,连发三篇之后看来要等其他人发过之后,才能继续发。其实下面的内容昨天就写好了。
    第四个问题,不知道你舍弃了这些方法想干什么?
    http页面要保持状态无非在客户端和在服务器端,而服务器端仍旧要在客户端设置标记,最终仍旧要利用cookie、隐藏js变量、hidden input或者url参量中的一种,或者你认为写入某个元素或属性中,然后编一段js来析取它也算一种的话,又或者你喜欢用xml数据岛、数据绑定、soap之类乃至ActiveX或Applet的牛刀来做这件事情。
    fso是不可取的。因为它比cookie之类有严重得多的安全问题。附:楼上所说的userData提供了类似cookie的机制,其数据变成xml后被保存在Documents and Settings\用户名\Application Data\Microsoft\Internet Explorer\UserData(以Windows 2000为例,Win98的路径稍有不同)中。
      

  7.   

    针对问题4的说明
    因为现在记录用户帐号的时候出现以下主要的弊端:
    cookie﹕安全性不高﹐受用户控制影响
    session﹕受时间影响﹐静止一段时间后会消失(听说可以在消失时执行对应处理程序﹐但我现在还不会)﹐如果IE不是设定为每次访问页面时都检查新版本的话﹐它可能不会更新﹐而且浪费资源
    隐藏frame﹕这样就必须每一页都要保留这个frame﹐如果不用frameset就必须打开一个附加窗口﹐这就相当于去到那里都多带一个累赘一样﹐另外服务器端也不方便读取﹐总不可能老是submit吧。
    至于上面提到的用userdata的方法跟cookie其实是异曲同工﹐不过可能它不受user控制﹐但安全性方面不知如何﹐以及低版本ie4支不支持﹐而且我还不确定asp能否读出(因刚粗略看完微软的说明﹐还不完全了解)﹐最后说明的是本人用asp开发﹐而终端用户有ie4或更高版本﹐如果能不要求user升级的情况下实现则更好。
      

  8.   

    关于问题四:如果你够狠,你完全可以把所有功能作在一个页面上(用XML+XSL+非常精深的JavaScript完全可以实现不转移页面驱动服务器程序,如果你知道xmlhttp就不会说我是乱说了^_^),此时用隐藏frame应该没什末问题了。
      

  9.   

    前面发了一篇文章但因为网络故障没发出来,浪费了我许多感情。休息了一会儿去看了微软上海技术行的开幕式(在上海交通大学),现在回来继续讨论。自由人的方案还是只适应于特定平台,而且xmlhttp需要客户端安装额外的包,xml解析可能还要装msxml。userdata也只适用于IE 5+。因此综上所述,真正可用的方案其实就是两种:cookie和session。
    按照你的条件,采用session就行了。注意,session只是一种机制或者说框架或者说协议。根本上实现仍旧是用cookie、url重写(ASP和JSP都是这两种),早期的CGI有用hidden input的。但是细节都被封装了起来,使用session机制来编程,使得底层细节对你来说是透明的。一般情况下,没有第三种方案,这是由http协议的无状态的特点所决定的。我不用ASP,而是用JSP的,因此只能根据JSP的一点点经验就对session的实现谈谈看法(这已经跟JavaScript走远了……)。首先,广义的说,维护不同请求之间的状态都被称作为会话跟踪(session tracking)。会话跟踪并不是新鲜玩意儿。让我们回顾一下会话跟踪技术的历史:
    1. http信息:包括捕获http头,如电子邮件头和ip信息。但有代理服务器和保密性问题。
    2. 隐藏字段:<input type="hidden" name="MyKey" value="MyValue"> 这个方法至今很流行,但需要生成每一个页面以及页面流之间的一个复杂顺序映射机制。而且这个技术有安全问题,用户只要简单的view source,就可以看到所有的信息。
    3. 扩展路径信息和URL重写:页面中所有的要维持状态的连接都必须加上身份认证信息例如:<a href="mypage.jsp?login=hax&rand=153768468">Next</a>
    当点击这个连接,login和rand名值对就发送给服务器。这不但有与隐藏字段相同的缺点——身份认证信息对于客户是可见的,而且URL长度也有限制,一般为2Kb。但这种方法在所有浏览器下都能工作。
    4. Cookie:它已经是因特网标准了(RCF2109,HTTP状态管理机制)。通过Set-Cookie的HTTP头,客户就可以引入一个cookie。如 Set-Cookie:NAME=hax; path=/; expires=Friday, 15-March-2002 24:00:00 GMT 。不设expries的cookie存于浏览器的内存,关闭后消失。
    cookie主要有两个缺点,一是用户可以选择不接受它,二是浏览器可以不用cookie工作,虽然几乎现在所有的浏览器都支持cookie。无论如何,从目前来看,不愿意接受cookie的用户应视为特殊情况对待,而不是相反。对于记录用户的登录状态,使用无expries的cookie是不错的方案。毕竟大多数情况下,session的实现也是用cookie的。最后我们来看Session。上述技术的最重要的问题是,它们都用明文来存储状态——即使可以用js做一些简单加密,但js本身仍被局限在客户端,理论上无法做到真正安全(注意是理论上,实践中总有一些变态的方法,但因为变态,所以不要用它)。同时很难符合面向对象范例(更不用说那些变态方法),而且有这些约束,要建立一个面向对象的复杂事物应用程序模型也很困难。
    即使只是像你所要求的那样仅仅保存登录名这样简单的功能,session也是个很清晰和易用的机制。不同的服务器端环境,默认session时间有所不同,肯定可以用程序修改的。
    对于Servlet/JSP来说,内建的session对象有方法setMaxInactiveInterval(int interval)来按秒指定最大保留时间。当参数为负数,则session不会time out,直到你调用invalidate()方法显式的使之失效。JSP也有session消失的时候自动执行对应处理程序的能力,就是用侦听器。这样在session失效的时候(不管是用户通过你设计的退出按钮从浏览器发出退出的请求,还是没有按退出就关闭了浏览器,还是超时),程序就会自动调用相应的处理程序,比如记录用户这次的停留时间或者保存一些用户数据之类。我不清楚ASP用什么机制来实现相似的功能,但我想应该有的。session并不浪费多少资源,是的,它是在服务器端建立临时文件来存储session的信息,但是通常不会耗去你多少空间。如果真的有许多数据,在Java,你可以编写自己的session类,把数据保存到数据库而不是临时文件,只要你的类实现javax.servlet.http.HttpSession接口。