为Live.com Build一个Gadget的例子(二)

为Live.com Build一个Gadget的例子

Live.com Build一个gadget的例子

一篇概览关于如何创建一个gadget例子,使用DTHTMLJavaScriptCSS,使之运行在Live.com平台上。使用这些必需的组件来创建和发布你自己的gadget

 

是什么让你的gadget运行?

Live.com平台 – Live.com beta是一个能够自定义的homepage,在这里,你能够决定内容和布局。这个页面有很多轻量级的名为gadget的部分组成。基于DHTMLJavaScriptLive.com平台提供了一种扩展页面功能的方法,就像Atlas framework来扩展Javascript的功能一样。

 

Manifest – 创建你自己的gadget的第一步是创建基于XMLmanifest文件,它能用作linkgadgetURLManifest包括你gadgetmetadata,比如titledescription,担当了运行你gadget所需扩展文件的指示器。

 

JavaScript – JavaScript,通过manifestlink,使主要功能的存在形式。为了让你的gadget能够在Live.com页面上工作,你必须调用特定的方法来在Atlas框架中注册和执行你的类。解释这个框架不是本文的内容,但下面有一些简单的代码会被演示。

 

CSS – 虽然Live.com提供了主题,你可能想要提供你自己的样式。要实现这功能,可以通过在你的manifest中简单的link到一个CSS文件和前面你注册的JavaScript类名的每一个classelement,覆盖周期性的分隔符”.”和下划线”_”。举例:如果你的JavaScript类名是Xbox.GamerTag,那么标记h1的风格,你需要在你的css文件中使用标记Xbox_GamerTag h1。这么做能够保证gadget间没有CSS的名称冲突。

 

manifest的例子

 

正如前面说到的,基于XMLmanifest定义你的gadget。让我们看一个gadget例子中的manifest,我已经创建一个gadget的例子来返回基于输入名字的Xbox GameCard

 

<?xml version="1.0" ?>
<rss version="2.0" xmlns:binding="http://live.com">
   <channel>
       <title>Xbox GameCard</title>
      <link>http://xbox.com</link>
      <description>This gadget returns an xbox game card based upon the entered Xbox Live Gamertag.</description>
      <language>en-us</language>
      <pubDate>Mon, 7 Nov 2005 01:00:00 GMT</pubDate>
      <binding:type>Xbox.GamerTag</binding:type>
      <lastBuildDate>Mon, 7 Nov 2005 01:00:00 GMT</lastBuildDate>
      <item>
         <description>The Xbox GameCard script</description>
         <link>http://adamkinney.com/gadgets/xbox/xboxtag.js</link>
      </item>
      <item>
         <description>The Xbox GameCard CSS</description>
         <link binding:type="css">http://adamkinney.com/gadgets/xbox/xboxtag.css</link>
      </item>
   </channel>
</rss>

 

乍一看,你可能注意到这个manifest的框架与RSS feed的一样。不但存在一个标准的杠杆作用,其实本质上,manifest提供了permalink来订阅gadget。虽然与RSS对立,item元素列出了gadget文件和拥有一块持久的空间。许多其它的元素是基于他们名称的自解释,绑定的例外是:type。注意,binding的命名空间声明在root元素中,binding:typeAtlas框架用来定义JavaScript的入口点来调用。

 

不同元素的值被用在不同的地方。Title的值用作你gadget的在Live.com中的名字。如果link的值被使用,title变成一个能够点击的链接,能够打开应用的URL。当用户安装你的gadget的时候,Description的值被用作显示额外的信息。Icons也在Live.com页面中用到,但是不能被你的manifest定义,但是宁愿链接的favicon.ico值域被使用。

 

Gadget script

 

现在,我们已经安装了manifest,让我们继续关注Xbox GameCard gadgetJavaScript。第一件事就是创建类Xbox.GamerTag的引用。

registerNamespace("Xbox");

Xbox.GamerTag = function(p_elSource, p_args, p_namespace)
{
   Xbox.GamerTag.initializeBase(this, arguments);
   ...
}
Xbox.GamerTag.registerClass("Xbox.GamerTag", "Web.Bindings.Base");

 

第一行代码注册”Xbox”的命名空间,它给出了我们客户代码的范围。命名空间提供了避免多个gadget中对象名称的冲突。然后这个类被定义作为一个方法,同时被framework传入默认的参数……。后面,我们注册这个类,通过” Web.Bindings.Base”指示我们的基本类。

 

下面是基类方法initializedispose的实现:

this.initialize = function(p_objScope)
{
   Xbox.GamerTag.getBaseMethod(this, "initialize", "Web.Bindings.Base").call(this, p_objScope);


   var elDiv = document.createElement("div");
   var elSpan = document.createElement("span");
   elSpan.innerText = "Search for: ";
   elSearch = document.createElement("input");
   elSearch.attachEvent("onchange",DoSearch);
   elSearch.attachEvent("onkeypress",DoReturn);

   var savedName = GetCookie();
   if(savedName != null)
   {
       elSearch.value = savedName;
   }

   elDiv.appendChild(elSpan);
   elDiv.appendChild(elSearch);
   p_elSource.appendChild(elDiv);

   elResults = document.createElement("div");
   elResults.className = "x23b";
   p_elSource.appendChild(elResults);

   if(savedName != null)
   {
      DoSearch();
   }
}
Xbox.GamerTag.registerBaseMethod(this, "initialize");

this.dispose = function(p_objScope)
{
   Xbox.GamerTag.getBaseMethod(this, "dispose", "Web.Bindings.Base").call(this, p_objScope);

   elSearch.detachEvent("onchange",DoSearch);
   elSearch.detachEvent("onkeypress",DoReturn);
   lastSearch = url = xmlhttp = elSearch = elResults = null;
}
Xbox.GamerTag.registerBaseMethod(this, "dispose");

 

gadget被装载时,initialize是第一个被调用的方法。这里,我们看到的使用JavaScript创建texttextbox元素添加到页面上。注意,这些元素被添加到p_elSource变两种,当类构造的时候被传送。P_elSource变量表现gadget最外的div元素。注意:attaching事件的方法使用attachEvent语法要强于直接分配函数给事件。IE事件模型的平衡,经过Atlas框架扩展了FireFox(任何一个函数被指派成事件的句柄在被引用前必须被声明,确认能看到下面链接提供的完整源代码)。在初始化后,我们担当起优秀gadget城市的设计师,然后通过使用detachEvent和设置变量为null来清除事件句柄处理你的事件属性。

 

现在让我讨论获取需要的数据。用户在Xbox GameCardsearch textbox中输入一个名字,点击一下enter或者让这个textbox失去焦点,然后开始查询所需的数据。看看下面的DoSearch函数。

 

var lastSearch = "";
var url;
var elSearch;
var elResults;

function DoSearch()
{
   if (lastSearch != elSearch.value)
   {
      lastSearch = elSearch.value;
      SetCookie(lastSearch);
      url = "http://gamercard.xbox.com/" + lastSearch + ".card";

      var objRequest = Web.Network.createRequest(
         Web.Network.Type.XMLGet,
         url,
         null,
         ReceiveResponse,
         Web.Utility.Prioritizer.Priorities.High);

      objRequest.execute();
   }
}

function ReceiveResponse(response)
{
      var htmlSource = response.responseText;
      var re = new RegExp("<body>(.*)</body>");

      htmlSource = htmlSource.replace(///xweb/gi, "http://gamercard.xbox.com/xweb")
      re.exec(htmlSource);
      elResults.innerHTML = RegExp.$1;
}

 

首先,我们检查lastSearch的值是否与testbox elSearch的值相等。注意,elSearch是在initialize方法中定义,动态生成的textbox的引用。如果搜索内容是新的,我们被这个值存进cookie,生成GamerTag URL并且创建Atlas框架定义的Network Request对象。我们传送NetworkType,用到的URLnull给对象上下文(用来传送需要的状态),我们的回调函数和优先级。Network函数使用Live.com作为代理去获得定义的URL,一旦接收到回调函数ReceiveResponse传过来的数据。在这个案例中,GamerTag html是被解析和添加到elResults divinnerHTML中。

很不幸,返回的GamerCard HTML不是合法的XML,当XML被解析的时候会抛出一个错误。因此,我们接收这个错误信息作为我们request的结果。很不幸,Atlas框架中不支持Network.Type.Raw or Network.Type.HTML。围绕这个问题,我们使用XMLHttpRequestrequest这个数据。

 

var lastSearch = "";
var url;
var elSearch;
var elResults;
var xmlhttp = new XMLHttpRequest();

function DoSearch()
{
   if (lastSearch != elSearch.value)
   {
      lastSearch = elSearch.value;
      SetCookie(lastSearch);
      url = "http://gamercard.xbox.com/" + lastSearch + ".card";

      xmlhttp.open("GET", url, true);
      xmlhttp.send(null);
   }
}

xmlhttp.onreadystatechange = function()
{
   if (xmlhttp.readyState==4)
   {
      var htmlSource = xmlhttp.responseText;
      var re = new RegExp("<body>(.*)</body>");

      htmlSource = htmlSource.replace(///xweb/gi, "http://gamercard.xbox.com/xweb")
      re.exec(htmlSource);
      elResults.innerHTML = RegExp.$1;
   }
}

 

这里成功检索到的数据,但会有一个警告。但是不使用Network Request对象,我们不再拥有访问Live.com提供的代理的能力。这意味着,除非Live.com被添加作一个Trusted Site,否则一个"Access is Denied"错误将会在数据request的时候发生。这已经被Live.com team所知晓,并致力于解决这个问题。目前来说,一个合法的xml作为数据源是没有问题的。

 

发布gadget

 

这个gadget已经完成了,并准备去使用它。最后一步就是上传gadget文件到一个web服务器。一旦你有了一个manifest文件的URL,那么访问Live.com。选择Add Content然后Advanced options。把gadget URL复制到Add a gadget by URLtextbox中。点击Add按钮。如果成功的话,你会在Live.com站点看到你的gadget

 

更多的资源获取

这里有更多的创建gadget的信息,访问MicrosoftGagdets.com 特别是 Live.com Gadgets Forum Gadget Gallery, 在那儿你能看到更多gadget的例子。

下载Xbox GamerCard gadget的源代码

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值