AJax技术

AJAX技巧:如何处理书签和后退按钮(3)

字号+ 作者:H5之家 来源:H5之家 2015-11-11 08:22 我要评论( )

window.onload = initialize; function initialize() { // initialize the DHTML History // framework dhtmlHistory.initialize(); // subscribe to DHTML history change // events dhtmlHistory.addListener(his

window.onload = initialize;

function initialize() {
 // initialize the DHTML History
 // framework
 dhtmlHistory.initialize();

 // subscribe to DHTML history change
 // events
 dhtmlHistory.addListener(historyChange);

 // if this is the first time we have
 // loaded the page...
 if (dhtmlHistory.isFirstLoad()) {
  debug("Adding values to browser " + "history", false);
  // start adding history
  dhtmlHistory.add("helloworld", "Hello World Data");
  dhtmlHistory.add("foobar", 33);
  dhtmlHistory.add("boobah", true);

  var complexObject = new Object();
  complexObject.value1 = "This is the first value";
  complexObject.value2 = "This is the second data";
  complexObject.value3 = new Array();
  complexObject.value3[0] = "array 1";
  complexObject.value3[1] = "array 2";

  dhtmlHistory.add("complexObject", complexObject);

  // cache some values in the history
  // storage
  debug("Storing key 'fakeXML' into " + "history storage", false);
  var fakeXML = '<?xml version="1.0" ' + 'encoding="ISO-8859-1"?>'
   + '<foobar>' + '<foo-entry/>' + '</foobar>';
  historyStorage.put("fakeXML", fakeXML);
 }

 // retrieve our values from the history
 // storage
 var savedXML = historyStorage.get("fakeXML");
 savedXML = prettyPrintXml(savedXML);
 var hasKey = historyStorage.hasKey("fakeXML");
 var message = "historyStorage.hasKey('fakeXML')="
   + hasKey + "<br>"
   + "historyStorage.get('fakeXML')=<br>"
   + savedXML;
 debug(message, false);
}


  prettyPrintXml()是一个定义在完整示例源代码中的实用方法;此函数准备在web页面中显示以便用于调试的简单XML。

  请注意,相关数据只在该页面的历史记录中进行持久化;如果浏览器被关闭,或者用户打开一个新窗口并再次键入AJAX应用程序的地址,则该历史记录数据对于新的Web页面不可用。历史记录数据只有在用到后退或前进按钮时才被持久化,当用户关闭浏览器或清空缓存的时候就会消失。如果想真正长期持久化,请参阅Ajax MAssive Storage System (AMASS)。
示例2:O'Reilly Mail

  我们的第二个例子是一个简单的AJAX电子邮件模拟应用程序的示例,即O'Reilly Mail,它类似于Gmail。O'Reilly Mail描述了如何使用dhtmlHistory类来控制浏览器的历史记录,以及如何使用historyStorage对象来缓存历史记录数据。

  O'Reilly Mail用户界面由两部分组成。在页面的左边是一个带有不同电子邮件文件夹和选项的菜单,例如收件箱、草稿箱等。当用户选择了一个菜单项(如收件箱),就用这个菜单项的内容更新右边的页面。在一个现实应用程序中,我们会远程获取并显示选择的信箱内容,不过在O'Reilly Mail中,我们只显示已选择的选项。

  O'Reilly Mail使用RSH框架向浏览器历史记录中添加菜单变化并更新地址栏,允许用户利用浏览器的后退和前进按钮为应用程序做收藏书签和跳到上次变化的菜单。

  我们添加一个特殊的菜单项――地址簿,以说明如何来使用historyStorage。地址簿是一个由联系人名称和邮件地址组成的JavaScript数组,在一个现实应用程序中,我们会从一台远程服务器取得这个数组。不过,在O'Reilly Mail中,我们在本地创建这个数组,添加几个名称和电子邮件地址,然后将其保存在historyStorage对象中。如果用户离开Web页面后又返回该页面,那么O'Reilly Mail应用程序将重新从缓存检索地址簿,而不是再次联系远程服务器。

  我们用initialize()方法保存和检索地址簿:

/** Our function that initializes when the page
is finished loading. */
function initialize() {
// initialize the DHTML History Framework
dhtmlHistory.initialize();

// add ourselves as a DHTML History listener
dhtmlHistory.addListener(handleHistoryChange);

// if we haven't retrieved the address book
// yet, grab it and then cache it into our
// history storage
if (window.addressBook == undefined) {
 // Store the address book as a global
 // object.
 // In a real application we would remotely
 // fetch this from a server in the
 // background.
 window.addressBook =
  ["Brad Neuberg 'bkn3@columbia.edu'",
  "John Doe 'johndoe@example.com'",
  "Deanna Neuberg 'mom@mom.com'"];

 // cache the address book so it exists
 // even if the user leaves the page and
 // then returns with the back button
 historyStorage.put("addressBook", addressBook);
}
else {
 // fetch the cached address book from
 // the history storage
 window.addressBook = historyStorage.get("addressBook");
}


  处理历史记录变化的代码也很简单。在下面的源代码中,无论用户按后退还是前进按钮,都将调用handleHistoryChange。使用O'Reilly Mail定义的displayLocation实用方法,我们可得到newLocation并使用它将我们的用户界面更新到正确的状态。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评