JavaScript And Ajax(框架)
框架能够在同一个浏览器窗口中显示多个 HTML 文档,可用于那些在页面上保持可见的导航控件(如带链接的菜单),还能让你能够独立的滚动内容框架,同时保持导航控件的位置固定不变。
在现代网站设计里,框架被认为已经过时了。它有一系列的缺点:
- 缺乏对各种屏幕尺寸和设备(如手机)的良好支持。
- 浏览的 URL 反映了框架页面,但不能提供每个框架加载的文件的任何信息。书签和浏览器历史可能不能捕获当前页面的状态。
- 框架在 XHTML1.1 中被废弃了!
在 ASP.NET 的开发里,使用母版页创建多栏页面要比使用框架的情况普遍的多。不过框架仍然有一些特殊的用途,比如把不同网站的现有文档放到同一个窗口里。框架和 JavaScript 相似,完全独立于 ASP.NET。它们只是 HTML 标准的一部分。
框架导航
框架不容易和 ASP.NET 页面整合。创建独立的框架很简单,只要创建一个引用要显示的 ASP.NET 页面并定义好位置的 HTML 框架页面即可。
但开发人员通常期望一个框架的动作会在其他框架中显示结果,但这种交互并不简单。问题在于每个框架加载不同页面,在 Web 服务器的角度看来,它们是完全独立的。它们之间的交互只能通过浏览器的客户端脚本。
考虑下面的 HTML 页面,它定义了一个有两个框架的框架集:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Frame Test</title>
</head>
<frameset framespacing="1" cols="200,*">
<frame name="menu" src="Frame1.aspx" scrolling="no" />
<frame name="content" src="" scrolling="auto" />
<noframes>
<body>
<p>This page uses frames, but your browser doesn't support them.</p>
</body>
</noframes>
</frameset>
</html>
左边框架显示 Frame1.aspx 页面。在这个页面里,你可以添加控件,用它们设置另一个框架内容。使用静态 HTML 很容易做到这一点,比如锚标签。例如,如果用户单击了下面的超链接,它会自动在右边的框架 content 里加载目标 NewPage.aspx:
<a href="NewPage.aspx" target="content">Click Here</a>
你也可以在某个 JavaScript 事件发生时设置 parent.[FrameName].location 属性来实现相同的效果:
<img src="ImgFile" onclick="parent.content.location='NewPage.aspx'">
但是,如果要为响应服务器端事件,执行可编程的框架导航,这就变得更加复杂了。你可能要记录用户动作、检查安全凭证再执行框架导航。从服务器端执行这样的框架导航的唯一方式是写一段 JavaScript,当页面在客户端第一次加载时,由它告诉浏览器修改其他框架的位置。
例如,假设向左边的框架添加了按钮,单击时执行下面的服务器端代码。它定义 <script> 块并在页面中注册它,当页面回传时,脚本执行并把页面重定向到请求的页面:
protected void Button1_Click(object sender, EventArgs e)
{
string url = "http://www.baidu.com";
string frameScript = "<script type='text/javascript'>" +
"window.parent.content.location='" + url + "';</script>";
Page.ClientScript.RegisterStartupScript(this.GetType(), "FrameScript", frameScript);
}
内联框架
合并服务器端编程和类框架功能的一个办法是使用 <iframe> 标签(HTML 4.0 标准的一部分)。这是一个内联的或者说嵌入式的框架,可以位于 HTML 文档的任何位置。主文档和嵌入页面被看作完全独立的文档。
<ifrmae src="page.aspx" width="40%" height="80"></iframe>
<iframe> 标签的一个问题是不被所有浏览器支持。不过,你可以为那些不支持识别该标签的浏览器定义要显示的静态文本:
<ifrmae src="page.aspx" width="40%" height="80">
<p>See the content at <a href="page.aspx">page.aspx</a></p>
</iframe>
给页面添加 <iframe> 标签后,就可以在代码隐藏类中定义它以便通过添加 runat=”server” 特性和 ID 特性来访问它。ASP.NET 没有与之对应的控件类,所以 <iframe> 被表示为一个 HtmlGenericControl 控件。
现在你可以随时设置 src 特性来重定向框架:
IFrame1.Attributes["src"] = "page.aspx";
当然,你不能够真正和嵌入页面的页面对象交互。实际上,这个页面甚至在这时还没有生成!相反,浏览器将单独请求被 src 特性引用的页面,然后在框架里显示它。不过,你可以使用各种技术在页面间传递信息,包括会话状态和查询字符串。