本章描述如何利用javascript脚本语言使用XPCOM来实现高级的处理。 概述 Javascript没有类似于用来打开文件以及进行字符编码转换的函数。要实现这些功能需要采用其他机制。IE使用activex来处理,在firefox中我们使用XPCOM(跨平台组件对象模型)。 关于XPCOM XPCOM是用来开发独立于平台的组件的一个框架(framework)。在这个框架下开发的组件通常称之为XPCOM组件,有时候也简单的称为XPCOM。 Firefox本身包含大量的XPCOM组件,这些组件也可以用于扩展。有时候,一个扩展也会包装成一个特殊的XPCOM组件。 注意:如果用C++或者其他编译语言开发组件,请确保包含用于各种平台的二进制文件。 参考材料 要获取关于XPCOM中嵌入的可以处理的功能的信息可以看看其API reference以及其源代码中的XPIDL文件的接口定义。 注意:接口定义语言(IDL)是一种为对象、方法等进行标准定义的语言。Mozilla使用的XPIDL是CORBA IDL的一种扩展。 你也可以在MXR(Mozilla Cross-Reference)中firefox的源代码中进行全文搜索,可以使用字符串、文件名等作为关键词。如果你对这些接口的细节有任何困难,在firefox的源代码中搜索使用例子非常有帮助。 注意:要查看firefox 3的源代码,可以在开始的清单中选择firefox 3.要查看firefox 3.5的可以选择“Mozilla 1.9.1.”要查看当前开发的firefox。选择“Mozilla central”。要查看thunderbird则选择“Comm.Central” 从XPConnect中调用XPCOM 用javascript脚本利用XPConnect技术来使用XPCOM。清单1显示了如何使用XPConnect来获取一个XPCOM服务的引用并创建新的XPCOM对象。 每个组件都由一个contractID来唯一标志,其形式是:@domain_name/module_name/component_name;version_number,实现一个或者多个接口来确定在这些组件中需要调用哪些函数。接口名通常具有nsIXXX的形式。为了能够访问相应函数,有必要使用具有你想使用的接口的组件。有些XPCOM组件是服务,即意味着在内存中只有一个实例。例如:书签组件其实是一个服务。它使得你可以访问并操作用户的书签。这些服务需要使用getService()来访问。对于其他组件,你可以根据需要创建多个实例。例如:文件的例子(nsILocalFile),这些实例是用createInstance()来创建的。搞清楚某一个组件是用getService()还是createInstance()来创建的非常重要,因为使用错了会导致错误的。 清单1:使用XPConnect来调用XPCOM函数 [html] view plaincopyprint? <?xml version=“1.0″ encoding=“UTF-8″?> <page xmlns=“http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul”> <script type=“application/javascript”><![CDATA[ var ioService = Components.classes['@mozilla.org/network/io-service;1'] .getService(Components.interfaces.nsIIOService); alert(ioService); ]]></script> </page> <?xml version=”1.0″ encoding=”UTF-8″?><br /> <page xmlns=”http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul”><br /> <script…
如图所示: 在chrome中打开一个页面,将这个页面的一张图片拖入到firefox中,实现文件上传。 就是用了e.dataTransfer.getData(‘text/html’)或e.dataTransfer.getData(‘text’),具体用text/html或text查看e.dataTransfer.types,不同浏览器支持的不同。
node.js读取mysql时中文时乱时不乱的问题,还没有解决,make一下。 后来数据迁移到PostgreSQL换了模块该问题自愈了。
先来个demo 几个功能点: 无限滚动分页; 绝对定位; 自动补短; 后退保存瀑布滚状态; 无限滚动分页: scroll事件里判断滚动条高度大于Math.min.apply(null,cols)时调用取数据函数。当然要加个setTimeout,做的好一些可以多取一屏的数据。 绝对定位: 图片上传要算出图片的宽高; 压缩图片(推荐又拍云); json取list时,按显示图片的宽度计算出该图片的高度,如:var h = parseInt(data.hight/ (data.width/228)); 维护一个列数组如:cols = [0,0,0,0],该值可以以当前用户屏宽度来算出。每次将内容插入到dom中时,更改当前维的的cols的值。如:cols[minCol.col] += temp.height()+21; 自动补短: 每次插入之前要计算往哪列插入。如:var min = Math.min.apply(null,cols );计算出最短列。 后退保存瀑布滚状态 利用html5 History.pushState(null, null, tag.parentNode.href);然后ajax tag.parentNode.href的内容写入body,当然之前要将原来body的innerHTML存在一个全局变量全局对象中,该对象保存了当前locationl.href做key,body的innerHTML和scrollTop做value,绑定window.onpopstate事件,在那里处理将body的innerHTML重置成离开之前的全局对象中相应的html的滚动高度 遇到的问题: firefox刷新时记忆了滚动条的位置,这时会不断的触发滚动分页函数,暂时解决方法是在window.onbeforunload时将滚动条滚到0的位置
又拍云邀请码,送给有缘人。图片放在又拍云省心。静态文件如js,css,image 也能放在又拍云,做cdn,访问超快。 34CE04C6FA87DADE 952C62A413006154 9CA1EC159C40A0A2 A851DDF4457A97FF A9CBAE6E15A31504 BB7F90784E2563F9 BF84F5851538B65C D31609CF9FF9F5DE DFB75C79416EFBD4 785033C64A91A056 738AD23991ACBFE3 36FE438ECAE06A89 38A1F5B25B6E7658 3AAB9DFE742F32AF 5607A53C9D161CB9 5FC6C43472780FBC 5FF9D59621AAA288 6AEBC22EC00A0DA6 6DC06786381B019C FBE7A3213ED74AA6
Firefox通过ctypes调用exe,可以做到无命令行窗口闪一下。代码如下:
原文地址:http://hi.baidu.com/xletian/blog/item/54c1392a6c22e7355243c17a.html var file = Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) .get(module, Components.interfaces.nsILocalFile); alert(file.path); 其中module参数的说明,在mdc中没有完全的列举出来,我找了一个比较全的,在附件中. 可以获取 我的文档(“Pers”) , 收藏夹(“Favs”), 开始菜单(“CmStrt”)…等等…而且对于不同操作系统,都有详细说明. 希望对大家有所帮助. 下面是具体的参数内容,以及说明 vista系统: The output Vista machine AChrom : C:\Program Files\Mozilla Firefox 3.0\chrome AChromDL : Can’t get shortcut APluginsDL : Can’t get shortcut APlugns : C:\Program Files\Mozilla Firefox 3.0\plugins ARes : C:\Program Files\Mozilla Firefox 3.0\res…
Google: 首先要去https://code.google.com/apis/console 创建Product ,友情提示:需要翻墙 如图得到你的Client ID和apikey 请求https://accounts.google.com/o/oauth2/auth?client_id=你的client_id&redirect_uri=用户登陆成功回调地址&scope=你要的权限&response_type=token 其中scope是你要的权限, 如我只想要用户名,头像信息 https://www.googleapis.com/auth/userinfo.profile 如我想要用户的google纵横信息 https://www.googleapis.com/auth/latitude.all.best 多个scope以空格隔开 用户登陆成功,会将一个令牌回传到你的redirect_uri 格式为: 你的回调地址#access_token=ya29.AHES6ZQn2Ws1eXemFq0M8DhyeS2-ZdonVUqsxSdGdqOwnaRXaIRKj_U&token_type=Bearer&expires_in=3600 用js 得到access_token存到cookie或存到服务器session里。 之后调用googleapi里只要将这个access_token和api加到googleapi的querystring里就行了 如google纵横信息 https://www.googleapis.com/latitude/v1/currentLocation?key=你的apikey&granularity=best&access_token=存在cookie或session里的access_token 如用户信息: $f = new SaeFetchurl(); $ttt = json_decode($_COOKIE["token"],true); $content = $f->fetch(“https://www.googleapis.com/oauth2/v1/userinfo?access_token=”.$ttt["access_token"]); $info = json_decode($content,true); $uid = $info["id"]; $userimg = $info['picture']; $username = $info['name']; sina和qq的很好调,类似不过他们把access_token回调回来是放在?后面,这样服务器端程序取querystring直接放sesson比google方便。调用中也遇到些问题 qq: 回调地址请填写你的域名 如 huaworld.sinaapp.com,而不是xxxx.php或huaworld.sinaapp.com/xxx.php。
有幸网速预警系统立项,该系统为利用html5的新特性来采集一些时间节点在系统中展示,当然这系统的下场可能跟之前的项目一样…即使是现在某些领导表示很关注,隔三差五来问进度,项目周报定时定度的发送,看上去像真的一样。。。 结果不重要,重要的是过程,在技术选型上冲动的用node.js来做展示图表的系统。由于考虑到有风险所以将逻辑都放在了存储过程,node.js保持尽量少的逻辑,以备后面遇到风险时转到php。 安装: node.js npm express mysql,jqtpl模块,一一将这些装完遇到了各种各样的问题,原因是因为npm被墙了,导致无法方便的安装各种模块。后来只有一个个的手动下载解压安装。还好express有个node_modules文件夹,只要将模块丢在那里,copy到那都能运行。 开发: 一个字爽,理由有: 1.前端到后端都是json格式的数据,传递起来就跟前端写js一样,甚至数据库取出来的记录集也是json. 2.jqtpl服务器端模版,将服务器端数据与tpl绑定,由于都是json数据,与前端使用jqtpl一样的爽。 3.在以前的项目中,本着互不信认原则,前端与服务器端来回数据都要做自己的验证,但现在在node.js上前端与服务器共用验证代码,同样的逻辑只需写一次。 4.无需与某些人一样,开发php时开着个chm手册,边查边开发。 5…………… 6…………… 7…………… 8…………… 遇到的问题: 1.mysql的connection无法释放—解决方法:sqlobj.client.end(); 2.putty不能关闭,半了服务器端node.js就停止—解决方法:nohup node app.js 未完待续。。。。
话说有压力才有动力。最近早晨老被某领导电话骚扰,不就迟个到嘛,至于嘛。 想来想去,这办法也只有mck才能想得出。很不爽。于是开发这么一个定时呼叫转移的应用。可以指定时间如:每天9:00到9:30这段时间内自动开启呼叫转移到一个空号或忙音号再或是其它的领导。 为了表达我对mck的敬意,特命名appname为mckv6,这已超越v5了 后期还要再处理的: 1.做成service 2.gps定位,判断范围,当到达某些点的时候振动提醒。