Firefox Extension - 制作Sidebar

3. July 2009

这一段时间发现Firefox还是很强大的,因为随着越来越多的插件的使用,我发现越来越多的功能都是我必备的功能,也发现自己的web生活越来越离不开Firefox了,可怜的IE,因为COM和.NETb变得越来越复杂和难以开发,导致很多开发人员都不能很好的入手,当然,难也不难,主要是麻烦,过一段时间可能我会写一些关于IE插件的开发吧。不过话说回来,这种JavaScript方式的浏览器还是很具有扩展性的,在这里赞一下Firefox。

OK,现在我们来做一个Sidebar。我们看到很多扩展都用到了Sidebar,这个Sidebar很常用,而且也会有很多用户非常喜欢Sidebar,这个时候就需要用Sidebar做一些扩展,扩张我们的插件范围。OK,我们先写一个XUL,新建一个XUL名字叫sidebar然后我们编写以下XUL代码。

<?xml version="1.0"?>
<?xml-stylesheet href="chrome://{appname}/skin/overlay.css" type="text/css"?>
<!DOCTYPE overlay SYSTEM "chrome://{appname}/locale/overlay.dtd">

<page id="hotSidebar" title="hotSidebar"
         xmlns
="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" >
  
<vbox flex="1">
    
<label id="atestlabel" value="test" />
  
</vbox>
</page>

注意,Sidebar的XUL代码是以Page开头的,这个Page同样我们要给ID和TITLE两个属性,然后里面的代码就像所有其他的XUL一样编写了,这里我们随便写一个XUL,这个XUL里面就只有一个文本控件并且输出的是test,OK。制作完了之后,我们就要写overlay了,overlay可以看做是我们的插件里面最最主要的“首页”了。

首先,我们要在Sidebar那一栏中显示一个menuitem,让用户可以选择他,代码如下所示。 

<menupopup id="viewSidebarMenu">
 
<menuitem key="key_openEmptySidebar" observes="viewEmptySidebar"  />
</menupopup>

然后我们就可以在下面这View里面的Sidebar中看到我们的Sidebar了,OK,然后我们要添加一个快捷方式,就是用户按什么键呼出我们Sidebar,示例代码如下所示。

<keyset id="mainKeyset">
 
<key id="key_openEmptySidebar" command="viewEmptySidebar"
      key
="A"
      modifiers
="accel" />
</keyset>

这里key属性就是普通按键,而modifiers是特殊键,比如这里accel就是ctrl键,如果想要加上shift的话,可以加上shift,如果是shift+ctrl的话,直接用空格隔开就可以了,如shift accel。这里我们就用ctrl键和A健的组合就行了。

写完组合键之后,我们再写sidebar的框架了,这个框架和HTML里面的frame很像,代码编写如下。

<broadcasterset id="mainBroadcasterSet">
    
<broadcaster id="viewEmptySidebar"
                 label
="HotSidebar"
                 autoCheck
="false"
                 type
="checkbox"
                 group
="sidebar"
                 sidebarurl
="chrome://{appname}/content/sidebar.xul"
                 sidebartitle
="HotSidebar"
                 oncommand
="toggleSidebar('viewEmptySidebar');" />
</broadcasterset>

其中sidebarurl就是我们的sidebarurl了,这里不仅能够使用XUL,还可以使用外部地址,如http://www.shangducms.com,就像一个浏览器内嵌的frame。(注意,这里的broadcasterset的id是不能改的)

最后我们运行一下我们的插件,就会是以下效果,看看做一个Sidebar不是很难把。:)

一个简单的Sidebar就OK了,:),然后,你可以做任何你想做的事情了。

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

, , , , , ,

Firefox Extension - Darg和Drop

2. July 2009

不知道看到这篇文章的各位朋友们有没有用过遨游,遨游有一个很好的特性,并且这个特性是我特别喜欢的,就是鼠标手势,比如打开一个链接,直接把鼠标点到超链接上,然后按住拖动,就可以在一个新窗口中打开点的链接,这样就非常的快的打开链接,而不用按鼠标中键或者按ctrl然后点一下才打开链接,所以这是我特别喜欢的功能。

搜了一下,看了Firefox好像没有这样的功能,而有这样功能的几个插件都没有我想定制的特性(比如鼠标手势,从左到右移动鼠标就是返回),所以我决定自己写一个。

在Firefox中,浏览器可以添加事件,并添加属性,这些事件分别为draggesture,ondragover,ondragdrop,ondragexit,这四个事件分别对应的几个nsDragAndDrop对象(这是一个XPCOM对象)的几个事件,分别为startDrag,dragOver,drop和,dragExit四个事件,所以我们编写以下代码。

var DragUrLink =
{
    OnMainLoad: function(){
        
try
        {
            getBrowser().addEventListener(
'draggesture',
                         function(
event) {nsDragAndDrop.startDrag(event, DragObserver);} , true);
            getBrowser().setAttribute(
'ondragover',
                        
'nsDragAndDrop.dragOver(event, DragObserver)');
            getBrowser().setAttribute(
'ondragdrop',
                        
'nsDragAndDrop.drop(event, DragObserver)');
            getBrowser().setAttribute(
'ondragexit',
                         '
nsDragAndDrop.dragExit(event, DragObserver)');
        }
        
catch(e)
        {
          
//alert(e)
        }
    }
};

上面的代码可以添加事件,也可以添加属性,反正对象getBrowser(同gBrowser),所以起到的效果是一样的。在nsDragAndDrop对象的几个方法中,传递的参数都是event和一个类(如果javascript里面可以说成是类的话)或者对象,这些对象里面都要重写(如果可以叫重写的话)一些方法,而且这些方法是固定的,基本上玩不出什么花样,所以这里我就写了一个接口,提供给大家使用,如果你需要响应Drag和Drop方法的话,可以尝试用下面的代码。

//Copyright GuoJing http://www.shangducms.com
//
如果不会可以直接Copy
var DragObserver = {
    Cc : Components.classes,
    url:
"",
    isend:
1,
    times:
0,
    onDragStart:
function(e, aXferData, dragAction){
        
//拖动事件开始时
        this.isend = 0;
    },

    onDragOver:
function(e, aFlavour, aDragSession){
        
//拖动事件执行时
        var transData = DragObserver
                        .getTransferData(aFlavour.contentType, aDragSession);
        
if(transData.dataObj.value){
            
var DataObj = transData.dataObj.value
                        .QueryInterface(Components.interfaces.nsISupportsString);
            
var sourceUri = DataObj.data.substring(0, transData.len.value);
            
//拖动的数据是以\n分割
            var DragData = sourceUri.split("\n");
            
//获取拖动的数据
            this.url = DragData[0];
        }
    },

    onDrop:
function (e, aDropData, aDragSession){
    },

    unInit:
function(){
    },

    onDragExit:
function(e, aDragSession){
      
//当结束拖动时发生
        if(this.isend == 0)
        {
            DragObserver.reload();
        }
      
//设置flag为1,那么下次结束拖动时就不会再操作了
       //这里值得注意的是,一次拖动时会响应多次拖动结束事件
        this.isend = 1;
    },

    reload:
function()
    {
        
//这里是结束时发生一次的方法
        //if(DragObserver.IsContain(this.url,'http://'))
        //{
            //gBrowser.addTab(this.url);
        //}
        //openUILink("http://www.shangducms.com", null, false, true);
        alert(this.url);
    },

    checkSession :
function(){
    },

    canDrop :
function(e, aDragSession){
    },

    getSupportedFlavours:
function (){
      
//设置数据对象
       var flavourSet = new FlavourSet();
       flavourSet.appendFlavour(
"text/x-moz-url");
       flavourSet.appendFlavour(
"application/x-moz-file", "nsIFile");
       flavourSet.appendFlavour(
"text/unicode");
           flavourSet.appendFlavour(
"text/html");
      
return flavourSet;
    },

    getTransferData :
function(aContentType, aDragSession){
     
//这里是获取拖动的数据,具体可以查nsITransferable接口
      var transfer = this.Cc["@mozilla.org/widget/transferable;1"].
                createInstance(Components.interfaces.nsITransferable);
      transfer.addDataFlavor(aContentType);
      aDragSession.getData (transfer,
0);
      
var Data = {};
      Data.dataObj
= new Object();
      Data.len
= new Object();
      
try{
        transfer.getTransferData(aContentType, Data.dataObj, Data.len);
      }
catch (ex) {}
      
return Data;
    },

    IsContain:
function(str,para)
    {
        
var regex=new RegExp(para, 'g').exec(str);
        
if(regex)
        {
            
//if the string contain the para
            return true;
        }
        
else
        {
            
return false;
        }
    }
}

上述代码就实现了响应拖动的事件,看上去是不是很复杂很麻烦,其实确实很复杂很麻烦,我也是查了很多资料才知道要这么写的,注意其中一些方法是系统内部彼此调用的,感觉很像重写或者重载的感觉,所以虽然你不知道这个是怎么执行的,但是必须这么写。

其中有一些方法,这里我就不列举了,例如onDragStart,可以不写,但是不写就不会响应,还有名字和参数最好也要写成一致的。因为当浏览器响应的时候,会自动传递这些参数以便在浏览器钟使用或进行转换。这些事件响应过程分别为,开始拖动=》canDrop=》获取传递的数据=》过滤数据(getSupportedFlavours)=》onDragOver=》查看会话=》onDragExit,当然,这些步骤并不会响应一次,在移动的时候可能会响应多次。

看到这里,你应该觉得一个小小的功能实现起来太麻烦了,好在Firefox 3.5提供了更好的API,可以直接响应DragEnd方法,示例代码如下所示。

OnMainLoad: function(){
    
try
    {
        getBrowser().setAttribute(
'ondragend', 'DragUrLink.DoSomeThing(event)');
    }
    
catch(e)
    {
       
//出错处理
    }
},

DoSomeThing:
function(event)
{
    
//执行响应的事件
}

是不是非常简单?所以赶快升级到3.5吧,3.5的API和HTML5的支持更上一层楼了。

OK,最后,如果你还不能理解,就制作一个3.5的程序,如果你能搞定老的API的拖动效果,那么祝贺你,你比我强多了:),因为老的虽然可以实现,但是实现的太复杂了,用了好多类,所以我还是决定只支持3.5。

示例

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Firefox Addon , , , , ,

Firefox Extension - 说说Tab

1. July 2009

在Firefox里面我们经常要对浏览器进行操作,比如说打开一个Tab或者关闭一个Tab,打开Tab也分两种,一种是在新窗口中打开,而另一种是在当前窗口打开。Tab是很多浏览器新的功能,当然这个新是相对的,因为在2-3年前,Tab还是没有的,主要还是通过IE6进行划分,姑且可以看IE6是解放前,而后面的一些版本可以看做是解放后。

在很多情况下,我们都需要响应自己的一些操作,而这些操作往往是伴随着打开网站的,比如在安装的时候提示用户是否安装成功,在卸载的时候提示用户卸载信息,在点击相应的按钮的时候提示用户相应的信息并打开网站,这些都需要用到Tab。其实Tab一点也不难,这里归纳一下一些Tab的基本操作。

当我们打开一个Tab的时候,最简单的方法是可以编写如下代码,这些代码可以直接写在代码中,不要管它什么错误提示。

// gBrowser是FF的浏览器对象
//
使用addTab方法创建一个Tab
gBrowser.addTab(url);
getBrowser().addTab(url);

通过上面的代码,我们可以打开一个新的tab。但是这个tab并没有被我们所选中,这个时候我们就需要对gBrowser对象的选中属性进行设置,代码也不难。

// 不同版本可能效果不同,也许可以直接打开
gBrowser.addTab("http://www.shangducms.com/");

// 这个是任何版本都可以使用的
gBrowser.selectedTab = gBrowser.addTab("http://www.shangducms.com/");

在有些时候,我们打开一个新的tab的时候还需要对其中的dom进行操作,这个时候就需要等待新的tab里面的document对象执行完毕,否则可能会出现错误,代码可以编写如下。

// 页面还没有完全载入完成,所以可能出现错误
var newTabBrowser = gBrowser.getBrowserForTab(gBrowser.addTab("http://www.shangducms.com/"));
alert(newTabBrowser.contentDocument.body.innerHTML);

// 这个就要更好一些了
var newTabBrowser = gBrowser.getBrowserForTab(gBrowser.addTab("http://www.shangducms.com/"));
newTabBrowser.addEventListener(
"load",
function() { newTabBrowser.contentDocument.body.innerHTML = "<div>hello world</div>"; }, true);

上面的几种方法都是打开了新的窗口,然后激活新的窗口,但是有时候我们需要在当前tab更改url怎么办呢,这里gBrowser就没有作用了,我们必须要使用openUILink方法打开url到当前的tab。代码可以编写如下。

var myExtension = {
  test: function(
event) {
    openUILink(
"http://www.shangducms.com", event, false, true);
  }
}

上面的openUILink也可以直接写在代码里,不管IDE是否报错。上面的代码里面有一个event参数,如果我们只是单纯的打开一个页面不管是否有event参数的话,可以直接传递null即可,一样可以达到我们的效果。:)

在打开了tab之后,我们还需要对当前的tab进行关闭操作,关闭操作可以关闭当前的tab,代码不难。

gBrowser.removeCurrentTab();

另外我们还能够把当前的tab进行移动,例如向左移动和向右移动。

//向右移动
gBrowser.mTabContainer.advanceSelectedTab(1, true);
//向左移动
gBrowser.mTabContainer.advanceSelectedTab(-1, true);

所以,我们对tab的操作完全是可以自定义化,比如创建tab,关闭tab,移动tab之类的,都可以很轻松的完成,而且tab还提供了一些其他的方法,比如获取当前的tab的文档,可以写content.document获取当前的tab的document对象,这样就可以省去httprequest等操作了,也就更加方便了。

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Firefox Addon , , , ,

巫山烤全鱼

1. July 2009

北京有一家饭店还蛮不错的,在塔院小区后面,翠微超市那,有一个巫山烤全鱼,吃了两次之后感觉依旧还是很不错。今天是欢迎实习生们都归队了,而且Vaughn也来到中国了(虽然有点担心H1N1流感),但是还是热烈欢迎了一下,于是就到这个地方吃烤鱼。

其实本来今天应该带上自己的单反的,但是没有想到,所以就算了,以后还是会有机会的,比如 Vaughn要去长城,那时候我们应该也会一起去。

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

倒带人生

Firefox 3.5 is ready now

1. July 2009

Firefox 3.5已经出了,虽然出了有一段时间了,但是我至今还没有下载过,所以今天下午就下载了一个Firefox 3.5试了一下,因为一些Firefox扩展必须要升级到3.5版本,并兼容到3.5版本,所以必须下载一个做实验。

安装之后感觉Firefox 3.5确实要比Firefox 3.0.x要好很多。最最直观的感受就是Firefox 3.5速度要快了很多,不仅在打开浏览器还是在浏览网页方面,都快了很多,所以我一下子就抛弃了Firefox 3.0.x,因为Firefox 3.5的感觉实在是太好了。

另外,在Firefox 3.5上面做了两个插件,这两个插件分别是Cnblogs Search Box和DragUrLink,第一个就是在博客园的一个搜索插件,第二个是像遨游一样拖动一个连接就在新窗口打开的一个插件,而不需要右键点击,然后选择然后再选择“在新窗口打开”,太慢了,所以做了这两个插件,有需要的可以到下面去下载,现在还是Alpha版本,有问题可以直接联系我。:)

    
 here
     here

这两个插件都可以在我的博客的浏览器插件里面下载,如果有问题,可以发送邮件给我。:)

另外,3.5确实要爽多了。。

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

小分享 , ,

晚餐或者说夜宴

1. July 2009

今天和chan最后吃一顿,因为要走了,但是我觉得没有那么悲伤,可能一开始慢慢的接受了,所以就想的比较开吧。今天本来是我们请chan吃饭的,但是可能chan看我们是小孩所以还是出了大头,我们都只出了小头,还是非常感谢chan对我们这些晚辈的照顾。

本来标题想起最后的晚餐的,但是一想感觉有点怪,还是就写个晚餐吧,就当是对chan的一些纪念。希望以后大家各自都能好好发展。

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

倒带人生

Blog Engine Theme Compositio

30. June 2009

今天看到一个皮,感觉还可以,所以就拿下来做成了BE的皮肤,多的就不介绍了,这个皮肤的名字叫Compositio,很多WP的博客用这个皮肤,所以今天也扒过来了,才知道其实Blog Engine做的并不那么好,再加上又不好升级,看来我要自己二次开发这个博客了,让这个博客更加完善。。因为我也不能升级到1.5版,郁闷。。下面上图。。

看上去感觉还行,尽量把细节做的还可以,当然我自己会不会使用是另一个问题,可能这个皮肤在细节上还是会有一些问题的吧,我尽量完善细节,然后再说,不过当前已经足够使用了。

如果trackback有错位,加上这个

.pic img
{
    width
:32px;
    height
:32px;
}

在线演示

compositio.rar (153.11 kb)

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Blog Engine Theme , ,

Blog Engine Theme Crazy Car

30. June 2009

最近想出一个皮肤,但是一直都没有什么好点子,所以就在网上找,可能我有点完美主义,不想用别人的好皮肤,自己做又觉得速度太慢,所以一直都没有做。于是看到了一个BE的皮肤,不过国外的风格和国内的风格有点不同,修改了一下可以拿来使用,具体效果如下。

喜欢的话可以下载这个皮肤,这个皮肤有几个细节还不错,比如留言的STOP和最底下的行走的样子,都还是蛮不错的,所以喜欢宽屏看的朋友可以下下来用了,不过我个人不是很喜欢,颜色可能有点亮了,可能我更挑剔一些吧。

在线演示

CrazyWheelsTheme.rar (120.16 kb)

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Blog Engine Theme , ,

Windows Mobile 6.5 Widget - 读取JSON数据

26. June 2009

JSON是什么?我想JSON可能对很多人来说都不陌生了吧,前面我们说到可以用最原始的方法读取XML,又可以在一切都规范的情况下读取XML,那么我们有没有更好的数据读取方式呢,当然有,就是JSON,说实话我原来没怎么去接触JSON,不过最近看了一下JSON的东西,觉得JSON真是太简单了。真是不用不知道,一用吓一跳,没想到还有这么轻量的东西。

多的不说了,我们先看一下JavaScript怎么读取JSON数据的。

var myJSONObject = {"bindings": [
        {
"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"},
        {
"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"},
        {
"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"}
    ]
};

我们可以看到上面的代码,是不是感觉有点乱?嗯,是有一点,不过其实当你了解之后就会觉得其实很整齐了。我们现在这里可以读取randomURI这个数据,怎么读呢,看看下面的代码。

myJSONObject.bindings[2].method

这个代码是不是很简单?其中,ircEvent可以看做字段,PRIVMSG可以看做值。其实JSON是基于map实现的,所以也是键值对应的了。这样看上去是不是就不那么乱了?OK,既然我们了解了JSON的基本原理后,一切都好办了,既然我们有一个这么好的数据源,我们就可以轻松的读取远程数据了,其实代码很好写,我们一样是获取远程的responseText,然后转换成JSON数据就可以了,示例代码如下。

function LoadDone(url)
{
  
if (req.readyState == 4)
  {
    
if (req.status == 200)
    {
      response
= req.responseText;
      var json
= eval('(' + response + ')');
     
//{"weather:{"city":"北京"}......"}
      var city = json.weather.city;
     
//插入我们的json数据
      $("#city").append(city);
      $(
"#load").hide("slow");
    }
    
else
    {
      
//connect failure
    }
    
return response;
  }
}

上面的代码是基于这篇文章写的,这篇文章和读取JSON差不多,也是一开始读取远程数据,获取response对象。最开始是获取responseText,上一篇文章是responseXML,这里我们还是读取responseText,然后转换为JSON对象,这里就要注意转换的方式,是不能够直接用responseText的,直接用是会发生错误的。

OK,既然我们远程可以读取JSON数据了,我们也可以使用现有的很多网络提供的Service做很多事情了,比如做一些IP查询啊,股票查询,天气查询的事情了,比如我这里,就简单的做了一个小插件。:),还在Alpha阶段。

所以说读取远程数据在Windows Mobile 6.5 Widget中是非常重要的,这里我说了3种读取远程数据的方式,都是非常行之有效的,所以有了远程数据,再加上HTML和JavaScript,就具有非常强的可扩展性了,可是在开发和维护上,暂时还没有很好的解决方案,不过我觉得这么轻量的东西,不需要搞那么复杂。

Currently rated 4.8 by 4 people

  • Currently 4.75/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Windows Mobile 6.5 , , , , , , , ,

Windows Mobile 6.5 Widget - 使用XMLHttpRequest读取数据

24. June 2009

前面我的一篇文章,即WM6.5读取远程数据,其中讲到XMLHttpRequest有时候并不能读取到数据,这一定程度上是正确的,因为不同的网页,不同的规格的XML,可能通过XMLHttpRequest获取的数据为空(例如我的博客的RSS就读不到),这得看浏览器和网站之间的彼此的兼容性了,当然,XMLHttpRequest在某种程度上还是非常好用的,因为它的responseXML对象能够很好的为我们读取数据。所以今天我们用XMLHttpRequest读取数据。

这几天和几个WM的开发人员聊了一下,有的人也说XMLHttpRequest这个在Widget开发里并不好用,确实不是很好用,但是偶尔还是很好用的。比如在你正确的编写了一个XML的时候。所以这里可以看的出来,我们平时遵守标准是多么重要的一件事情啊。如果不遵守标准,很多时候做事情就变得更加复杂了。。。废话太多了,我们先做一个简单的RSS阅读器,我们先看效果图。

这里我们使用了JQuery混合使用,可真是网页开发一个都不能少啊。(右边的这个图是直接读取XML里面的description,所以排的很混乱,如果是自己做的话,就会更好看了,我这是读的Amazon的数据)

首先我们先写好我们的HTML,代码如下所示。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd"
>
<html xmlns="http://www.w3.org/1999/xhtml">
    
<head>
        
<title>Shang RSS Reader</title>
        
<script src="js/widget.js" type="text/javascript"></script>
        
<script src="js/menu.js" type="text/javascript"></script>
        
<link href="css/css.css" rel="stylesheet" type="text/css" />
        
<script src="js/jquery-1.3.2.min.js" type="text/javascript"></script>
    
</head>
    
<body onload=
       "load('http://www.amazon.com/rss/bestsellers/books/ref=pd_ts_rss_link','true')"
>
        
<div class="load" id="load">
            
<img src="images/load.gif" />
            
<br />
            loading..
        
</div>
        
<div id="root">
        
<div class="main" id="main">
        
</div>
        
<div class="close" id ="close"
                onclick
="CloseRead()" style="display:none;">close</div>
        
<div class="main" id="detailRead">
        
</div>
        
</div>
    
</body>
</html>

我们可以看到在页面加载的时候,我们启用了load方法,load方法就是执行远程的数据的连接,这里我们就是读取数据,读取数据代码如下所示。 

function load(name,isMain)
{
    var loadText
= StartLoad(name,isMain);
    
return loadText;
}

var response;

function StartLoad(url,isMain)
{
  var returnValue;
  
if (window.XMLHttpRequest)
  {
    req
= new XMLHttpRequest();
  }
  
else if (window.ActiveXObject)
  {
    req
= new ActiveXObject("Microsoft.XMLHTTP");
  }
  
if (req != undefined)
  {
    req.
onreadystatechange = function()
    {
        returnValue
= LoadDone(url,isMain);
    };
    req.open(
"GET", url, true);
    req.send(
"");
  }
  
return returnValue;
}  

function LoadDone(url,isMain)
{
  
if (req.readyState == 4)
  {
    
if (req.status == 200)
    {

      response = req.responseXML;
      if(isMain)
      {
        CreateElement(req.responseXML);

      }
      $(
"#load").hide("slow");
    }
    
else
    {
      
//connect failure
    }
    
return response;
  }
}

这里我们就是读取远程数据的几个函数了,同时还要注意上面我加红的代码。这里如果读取成功的话,我们就创建元素,例如这里创建的就是一些div了。isMain参数是我自己加的一些扩展用的参数,所以这里可以暂时不用理解。我们看到前面的HTML我写的也是true,所以这里面所有的isMain都是true。CreateElement方法就是创建前面样式的一些标题,这样可以让用户读到RSS数据,示例代码如下所示。

function CreateElement(responseXML)
{  
    
var title = GetElementByXML('title',responseXML);
    
var link  = GetElementByXML('link',responseXML);
    
for(tempNum = 1; tempNum < title.length; tempNum++)
    {
        
var divs = '<div id=\'detail' + tempNum +  '\' class=\'detail\'
        onmouseover=\'Change(this.id)\'
        onmouseout=\'ReturnDiv(this.id)\'
        onclick=\'ShowDetail(this.id)\'>
' + title[tempNum].firstChild.nodeValue + '</div>';
        $(
"#main").append(divs);
    }
}

上面的代码看起来可能有点乱,那是因为我为了整齐所以换了行,但是好像还是有点乱,=。=!,不过上面的代码就是从1开始创建div,然后附加到main里面。为什么是从1呢,因为第0个元素往往都是XML最开始的标题,例如RSS的标题啊之类的,所以从1开始就是最开始的标题和内容了。

剩下的代码就是补全我们的RSS阅读器中点击每一个元素的操作了,就是实现上面的onmouseover,onmouseout,onclick等方法,这里我就写一下onclick方法吧,我觉得这个方法还是比较重要的,其他的可以在源代码中去看。

function ShowDetail(id)
{
    
var idNumber = id.toString().replace("detail","");
    
//获取description元素
    var description = GetElementByXML('description',response);
    
//隐藏主窗体
    $("#main").hide("slow");
    $(
"#close").show("slow");
    
//显示文章
    $("#detailRead").append(description[idNumber].firstChild.nodeValue);
    $(
"#detailRead").show("slow");
}

当我们单击【close】的时候,所作的操作和这里相反就行了。

小结

这样,一个简单的RSS阅读器就做好了,也让我们深入的了解了Windows Mobile 6.5如何使用XMLHttpRequest来读取数据,读取远程数据是非常重要的,因为很多时候我们可以将配置和数据保存在远程文件中,或者在远程配置一个WebService,然后在客户端进行调用。但是在这里,还得注意你的XML文件格式的正确性,否则无法用这种方法进行调用,而只能用原始的方法读取数据,这样也是非常不好的。

这里我也只是抛砖引玉,代码不是很复杂,希望能对初学者有一定的帮助。

rss.wgt (126.26 kb)

Currently rated 5.0 by 3 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Windows Mobile 6.5 , , , , , ,