[C#]P2P通讯初步实现(c#,Socket连接)

mikel阅读(1132)

1:基于Socket连接;

2:在四个局域网内测试通过;

3:简单模型,需要进一步优化效率和处理;

 

基本思路

两个分别在不同的局域网内的用户无法直接建立连接并通讯。因为处在不同局域网的用户(没有公共IP)无法被外部机器主动连接,所以凡是所谓的P2P一般都是通过中间服务器中转通讯的。比如在几年前俺曾经介绍过一个P2P的软件,http://www.cnblogs.com/dlwang2002/archive/2005/04/14/207988.html,基本原理那里面有介绍。

这次所建立的模型,是双方都在不同的局域网内部,都没有公用IP

基本原理是这样的。局域网A内用户PA想要和局域网B内的用户PB通讯,那么需要通过中间服务器S进行转接通讯。Socket链接虽然只是由一方发起(局域网内的),但是socket确实一个可以在两端都能通讯的,也就是说,PA链接S后,S实际上可以使用这个通道直接发消息给PA。同理,如果PB连接之后,S将有两个Socket实例,然后S可以把SA的消息直接转发给SB,这样SB就转载了SA的请求到了PB。虽然还是要通过中转,但是S只负责把两端Socket互联,速度延时可近似认为是0,也就是可以认为PAPB是建立了直接的链接,P2P

过程如下:

1:)PAS发出连接请求;S接受请求,并且保留住PAsocket实例SA,存进一个在线用户列表LiveConnections

2:)PB请求S并建立连接(和A无先后关系),S中保存其socket实例SB

3:)PAs发出通讯请求,指明通讯对象是PB

4:)S接收到A的请求,再当前的LiveConnections中找到PBsocket示例SB,转发消息;

5:)PB接受到来自PA的消息。

 

 

主要程序代码

   1:)首先的问题是如何建立Socket连接。这个问题在以前的一篇Blog中有提到(http://www.cnblogs.com/dlwang2002/archive/2008/07/21/924803.html)。这里使用的代码基本上都是和那一个一样的,只有中间处理通讯数据的部分稍有不同。这些代码不再赘述。

   2:)服务器S处理转发消息的代码

                 

Code

   3:)客户端的简单实现

 

ConnectionManager

    
  4:)UI等其他处理 (略)

 

问题

1:)一个Socket的实例可以在服务器/客户端存活多久呢?我测试发现,至少几个小时没有问题,但是最长时间却不知道。

    2:)服务器S用单独的线程来处理链接,并不是最好的方式

    3:)服务器负载平衡,在多个服务器的情况下,要让客户端可以选择效率最高的服务器进行中转

    4:)有一台机器已经在公网上,或者两台都在公网上,需要另外的模型。他们不需要中转。

 

小结

    简单,效率未知。
server.jpg
client.jpg

[JavaScript]简易而又灵活的Javascript拖拽框架(三)

mikel阅读(780)

一、开篇

     这是这个拖拽系列的第三篇了,第一篇简单的介绍了一下这个拖拽框架,第二篇用这个框架做了一个Tab标签的拖放。这次用这个拖拽框架做一个更复杂一点的效果——跨列拖放。就像iGoogle和netvibes的个性页面布局那样。

 

二、原理

 框架在第一篇做了介绍,这里直接使用。

首先要找到每个可以拖动的item,对于每个拖动的item,对其注册组件Drag.init(handle,dragBody);并且要把这个对象所在的列赋值给这个对象

还是分三个步骤说这个拖放的过程

1、鼠标拖动开始的时候,除了要将dragGhost放到当前被拖动的对象原来的位置上,还要记录每一列的左边距,当然还是要设置被拖动对象的position

 

2、鼠标拖动的过程中

先找到拖动对象是在哪一列,通过现在拖动对象的位置和在拖动开始时记录的列的左边距相比较,得出当前拖动对象在哪一列。


 

如果在原来那一列上,则不用管了,如果在别的列上,则将dragGhost插入到这个新的列中去(用column.appendChild插入到最后)。无论是本来就在这一列的元素还是从别的列拖过来的元素,都得让拖动对象与他所在的列的每一个元素的纵坐标相比较,得出应该在这一列的什么位置,将dragGhost插入(用column.insertBefore)。至于怎么找到拖动元素应该放在这一列的什么位置,这个原理和上边找列的原理差不多,只是比较的是纵坐标的值,比较的对象是本列的所有对象(注意,遍历的时候一定要排除dragGhost和本身,要不然在本列不能向下拖动)。

3、拖动完成

ghost替换为被拖动的元素,设置相应的样式

三、代码

Code

 如果这样不方便观看,可以下载示例。

四、示例下载

      点此下载示例

[JavaScript]简易而又灵活的Javascript拖拽框架(二)

mikel阅读(779)

一、开篇

在上一篇中,似乎不出来这个框架有多强大。是因为我们实现的效果太简单了,还不足以体现框架的强大和灵活,在这一节中,用这个灵活的框架轻易的来实现拖放!

 

二、原理

 

框架的原理在上一篇文章中介绍了,这里就不在重复,直接开始使用这个框架了

首先通过Drag.init来注册拖动组件;

分析:

1、拖动开始的时候

dragGhost插入到鼠标拖动的那个元素,鼠标拖动的元素的positionabsolute

dragGhost为拖动过程中指示拖动元素的当前位置的元素

2、拖动正在进行的时候

根据当前鼠标的位置或者正在被鼠标拖动的元素的位置 和需要排列的各种元素来比较,以确定将dragGhost放在哪个地方。

具体的分析,就是遍历拖动元素的各个兄弟元素,从第一元素起,一旦发现某个元素的xy比鼠标的xy大的话,则将dragGhost添加到这个元素之前。

3、拖动结束的时候

dragGhost替换为被拖动的元素,然后将dragGhost隐藏。

 

这样就让思路很清晰,不必再花精力去管元素是怎么随着鼠标走的,而且我们的却很精确的控制了整个拖放过程,所以说这个框架很强大很灵活

三、代码

Code

 

四、示例下载

      点此下载示例

[JavaScript]简易而又灵活的Javascript拖拽框架(一)

mikel阅读(787)

一、开篇

最近在做js拖拽的时候,发现了一个强大而又灵活的拖拽框架,(之前用了代码混淆器,还好代码比较短,我就翻译过来了)利用这个框架不仅能实现简单的拖动,更能轻易的实现各种复杂的拖放功能。这一篇先实现最简单的拖拽,稍微复杂的拖放将在后面的文章里写出来。

二、代码

先把代码贴出来


var Drag={
    
"obj":null,
    
"init":function(handle, dragBody, e){
        
if (e == null) {
            handle.onmousedown
=Drag.start;
        }
        handle.root 
= dragBody;
        
        
if(isNaN(parseInt(handle.root.style.left)))handle.root.style.left="0px";
        
if(isNaN(parseInt(handle.root.style.top)))handle.root.style.top="0px";//确保后来能够取得top值
        handle.root.onDragStart=new Function();
        handle.root.onDragEnd
=new Function();
        handle.root.onDrag
=new Function();
        
if (e !=null) {
            
var handle=Drag.obj=handle;
            e
=Drag.fixe(e);
            
var top=parseInt(handle.root.style.top);
            
var left=parseInt(handle.root.style.left);
            handle.root.onDragStart(left,top,e.pageX,e.pageY);
            handle.lastMouseX
=e.pageX;
            handle.lastMouseY
=e.pageY;
            document.onmousemove
=Drag.drag;
            document.onmouseup
=Drag.end;
        }
    },
    
"start":function(e){
        
var handle=Drag.obj=this;
        e
=Drag.fixEvent(e);
        
var top=parseInt(handle.root.style.top);
        
var left=parseInt(handle.root.style.left);
        
//alert(left)
        //一般情况下 left top 在初始的时候都为0
        handle.root.onDragStart(left,top,e.pageX,e.pageY);
        handle.lastMouseX
=e.pageX;
        handle.lastMouseY
=e.pageY;
        document.onmousemove
=Drag.drag;
        document.onmouseup
=Drag.end;
        
return false;
    },    
    
"drag":function(e){//这里的this为document 所以拖动对象只能保存在Drag.obj里
        e=Drag.fixEvent(e);
        
var handle=Drag.obj;
        
var mouseY=e.pageY;
        
var mouseX=e.pageX;
        
var top=parseInt(handle.root.style.top);
        
var left=parseInt(handle.root.style.left);//这里的top和left是handle.root距离浏览器边框的上边距和左边距
        
        
var currentLeft,currentTop;
        currentLeft
=left+mouseXhandle.lastMouseX;
        currentTop
=top+(mouseYhandle.lastMouseY);
        
        
//上一瞬间的上边距加上鼠标在两个瞬间移动的距离 得到现在的上边距
        
        handle.root.style.left
=currentLeft +"px";
        handle.root.style.top
=currentTop+"px";
        
        
//更新当前的位置
        
        handle.lastMouseX
=mouseX;
        handle.lastMouseY
=mouseY;
        
        
//保存这一瞬间的鼠标值 用于下一次计算位移
        
        handle.root.onDrag(currentLeft,currentTop,e.pageX,e.pageY);
//调用外面对应的函数
        return false;
    },
    
"end":function(){
        document.onmousemove
=null;
        document.onmouseup
=null;
        Drag.obj.root.onDragEnd(parseInt(Drag.obj.root.style.left),parseInt(Drag.obj.root.style.top));
        Drag.obj
=null;
    },
    
"fixEvent":function(e){//格式化事件参数对象
        if(typeof e=="undefined")e=window.event;
        
if(typeof e.layerX=="undefined")e.layerX=e.offsetX;
        
if(typeof e.layerY=="undefined")e.layerY=e.offsetY;
        
if(typeof e.pageX == "undefined")e.pageX = e.clientX + document.body.scrollLeft  document.body.clientLeft;
        
if(typeof e.pageY == "undefined")e.pageY = e.clientY + document.body.scrollTop  document.body.clientTop;
        
return e;
    }
};

使用方法

Drag.init(handle,dragBody);这样可以让鼠标拖动元素。Handle为拖动的把手,dragBody是在拖动时需要移动的元素。

 

如果需要更高级的控制拖动或者拖放的话,可以给dragBody设置三个方法

dragBody.onDragStart=function(left,top,mouseX,mouseY){}

onDragleft,top,mouseX,mouseY){}

onDragEndleft,top,mouseX,mouseY){}

这四个参数分别 是:拖动对象的left属性、拖动对象的top属性(此时拖动对象的position为absolute)、鼠标当前的x、鼠标当前的y。在每个过程中都 可以通过四个参数来更精确的控制拖动的每个过程,更主要的是我们不需要去管被鼠标拖动的元素是怎么移动的,这些都在框架中已经做好了,这让拖拽看起来更整 洁。框架具体是怎么运转的,其实很简单

 

三、原理

Drag有几个成员

Drag.obj用来存放鼠标正在被拖动的元素,只有在鼠标按下过后才会赋值,鼠标松开便为空了。便于在这几个方法之间都能够轻易的找到正在被拖动的元素。

Drag.init主要是用来订阅handleonmousedown事件,所以handle一旦点击,则会执行Drag.start方法。

Drag.start是用来注册documentmousemovemouseup事件的,而且会调用我们定义的dragBody.onDragStart方法(这里的dragBody就是通过Drag.obj来获得的),以便处理框架以外需要处理的事情。

Mousemove的时候会不断的触发Drag.drag方法,这个方法主要是控制dragBody的移动(通过前后两个瞬间的位移差来调整dragBody的位置),以及调用外部的dragBody.onDrag方法,处理框架以外的事情。

Documentmouseup方法,调用外部的onDragEnd方法,释放document绑定的两个事件,以及将临时的obj置为空

四、示例下载

 点此下载示例

[C#]调用Master Page的属性和方法

mikel阅读(1270)

    ((命名空间.母板的类)(this.Page.Master)).属性 = "你好";
例如:
//用于读取JobSeeker Master的IsLogin属性
(( NewTang.Views.Shared.JobSeeker)this.Page.Master).IsLogin;

1.缓存使用:
 在使用master页面时,不能把高速缓存只应用与master页面,不能把OutputCache指令放到master页面上。如果这么做,在页面的第二次检索时,就会报错。因为应用程序找不到缓存页面.

2.在内容页中编写代码来引用母版页中的属性、方法和控件:

可以在内容页中编写代码来引用母版页中的属性、方法和控件,但这种引用有一定的限制。对于属性和方法的规则是:如果它们在母版页上被声明为公共成员,则可以引用它们。这包括公共属性和公共方法。在引用母版页上的控件时,没有只能引用公共成员的这种限制。

引用母版页上的公共成员

  1. 在内容页中添加 @ MasterType 指令。在该指令中,将 VirtualPath 属性设置为母版页的位置,如下面的示例所示:

    <%@ MasterType virtualpath="~/Masters/Master1.master" %>

    此指令使内容页的 Master 属性被强类型化。

  2. 编写代码,将母版页的公共成员用作 Master 属性的一个成员,如本例中,将母版页名为 CompanyName 的公共属性的值赋给内容页上的一个文本框:

引用母版页上的控件

  • 使用 FindControl 方法,将 Master 属性的返回值用作命名容器。

    下面的代码示例演示如何使用 FindControl 方法获取对母版页上的两个控件的引用(一个 TextBox 控件和一个 Label 控件)。因为 TextBox 控件处在 ContentPlaceHolder 控件的内部,必须首先获取对 ContentPlaceHolder 的引用,然后使用其 FindControl 方法来定位 TextBox 控件。

  • void Page_Load()
        {
        // Gets a reference to a TextBox control inside
        // a ContentPlaceHolder
        ContentPlaceHolder mpContentPlaceHolder;
        TextBox mpTextBox;
        mpContentPlaceHolder =
        (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
        if(mpContentPlaceHolder != null)
        {
        mpTextBox =
        (TextBox) mpContentPlaceHolder.FindControl("TextBox1");
        if(mpTextBox != null)
        {
        mpTextBox.Text = "TextBox found!";
        }
        }
        // Gets a reference to a Label control that not in
        // a ContentPlaceHolder
        Label mpLabel = (Label) Master.FindControl("masterPageLabel");
        if(mpLabel != null)
        {
        Label1.Text = "Master page label = " + mpLabel.Text;
        }
        }

[SQL]SQL Server2005的Top n PERCENT的说明

mikel阅读(960)

使用TOP   n   [PERCENT]选项限制返回的数据行数,TOP   n说明返回n行,而TOP   n   PERCENT时,说明n是表示一百分数,指定返回的行数等于总行数的百分之几。  
  使用技巧:  
  SQL   Server   2000不允许在视图、嵌入式UDF、子查询中出现ORDER   BY子句,因为它们都应该返回一个表,表不能指定行的次序。然而,如果使用了TOP关键词,ORDER   BY子句将帮助确定查询所返回的行。因此,如果指定了TOP,你还可以同时指定ORDER   BY。由于在带有TOP的UDF中允许使用ORDER   BY子句,你可以使用一个技巧:把“Select   *”替换成“Select   TOP   100   PERCENT   *”。这样,你就能够成功地构造出一个接受列名字或编号为参数、返回排序结果的函数。

[JQuery]JQuery源码学习

mikel阅读(890)

JQuery 源码初看 作者:mifly

JQuery工作原理解析以及源代码示例 作者:cloudandy的专栏

窥探JQuery——面向JavaScript程序员 原作者: simon willison 原文 译者: davidkore…

。。。 还有很多 慢慢补充

jQuery 的代码非常的美观整洁 很方便我们学习研究

我用刚学的python 写了一个小脚本,在jQuery 源码前面+了行号 方便读写

 

 1#addLineNumber.py
 2'''add LineNumber to some file'''
 3
 4
 5addNum = 1
 6all = []
 7
 8fname = raw_input('Enter file name: ')
 9print
10
11try:
12    fobj = open(fname, 'r')
13except IOError, e:
14    print"*** file open error:", e
15else:
16    
17    for eachLine in fobj:
18        all.append(("[%-4d]" % addNum)+' '+eachLine);
19        addNum+=1
20    fobj.close()
21
22fobj = open('result.js''w')
23fobj.writelines(['%s' % x for x in all])
24fobj.close()
25print 'DONE!'
26raw_input()
27 1(function(){
 2/*d
 3 * jQuery 1.2.6 – New Wave JavaScript
 4 *
 5 * Copyright (c) 2008 John Resig (jquery.com)
 6 * Dual licensed under the MIT (MIT-LICENSE.txt)
 7 * and GPL (GPL-LICENSE.txt) licenses.
 8 *
 9 * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
10 * $Rev: 5685 $
11 */

12
13// Map over jQuery in case of overwrite
14var _jQuery = window.jQuery,
15// Map over the $ in case of overwrited
16    _$ = window.$;
17
18var jQuery = window.jQuery = window.$ = function( selector, context ) {
19    // The jQuery object is actually just the init constructor 'enhanced'
20    return new jQuery.fn.init( selector, context );
21}
;
22
23// A simple way to check for HTML strings or ID strings
24// (both of which we optimize for)
25var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
26
27// Is it a simple selector
28    isSimple = /^.[^:#\[\.]*$/,
29
30// Will speed up references to undefined, and allows munging its name.
31    undefined;

32

 

[1   ] (function(){
(function(){})();
第一个括号里面是个匿名函数,第二个括号表示马上执行第一个括号里面的代码。所有JavaScript代码都在一个匿名函数里,确保了所定义的函数、对象的有效范围,起到了命名空间的作用。

[3   ] * jQuery 1.2.6 – New Wave Javascript
版本信息 jquery 1.2.6 伟大的代码 伟大的版本

[14 ] var _jQuery = window.jQuery,
保存window对象本身的jQuery对象(如果存在),避免与 jQuery 库的冲突

[16 ] _$ = window.$;
同上

[18 ] var jQuery = window.jQuery = window.$ = function( selector, context ) {

[21 ] };
返回jQuery对象,jQuery同时也是window对象的一个属性,这样就可以在其他地方像使用document(document也是window的一个属性)一样使用jQuery了。$是jQuery的同名对象

[25 ] var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
/『^』开始『[^<]*』大于等于0个不是符号"<"的任意字符『(<(.|\s)+>)』符号"<"+大于等于1个任 意字符或者空白+符号">"『[^>]*$|^#(\w+)$』以大于等于0个非符号">"结束或者以开头是符号"#"和大于等于1个 的数字字母结束/

[28 ] isSimple = /^.[^:#\[\.]*$/,

『^.』任意字符开头(除换行符)『[^:#\[\.]*』大于等于0个非符号":"、"#"、"|"、"."的字符结束

[JIRA]JIRA破解

mikel阅读(1086)

一 jira安装
二 jira破解
三 jira默认数据库改为ms mqlserver
四 jira跟cvs关联
硬件环境
thinkpad x61
软件环境
windows xp sp3
ms SQLServer 2000 sp4
网络环境
普通局域网
需要下载的软件
1 jira
下载地址:http://www.fangwai.net/
我下载的是:atlassian-jira-enterprise-3.12.3-windows-installer.exe
2 破解补丁
下载地址就不放了,不和谐
我下载的是:atlassian-extras-1.12.jar
3 连接ms SQLServer用的JDBC驱动
下载地址:http://jtds.sourceforge.net/
我下载的是:jtds-1.2.2-dist.zip
一 jira安装
1 安装jira
双击exe,没什么好说的,唯一一个注意的是:是否把jira注册为windows服务,安装的时候有链接详细说明,此处不再赘述。
我选择了注册为windows服务后,可以从windows的“服务管理器”看到jira服务,我的叫做“Atlassian JIRA Enterprise Edition 3.12.3”
二 jira破解
1 默认可以申请30天试用,强烈不推荐非法破解,由于此文档产生的一切责任后果自负。
注册机网上有下载,我使用的是用别人破解好的文件覆盖原文件的方法:
将atlassian-extras-1.12.jar覆盖C:\Program Files\JIRA-Enterprise-3.12.3\atlassian-jira\WEB-INF\lib下同名文件即可。
2 开启服务,在浏览器输入http://localhost:8080如果出现jira向导就说明成功安装了。
输入序列号的地方输入
12345
12345
12345
12345
12345
如果点击下一步不提示序列号错误就完成注册了。
三 jira默认数据库改为ms mqlserver
1 创建jiradb数据库
2 创建jirauser用户,密码随意,为了描述方便此处用sonic,把jiradb的public和db_ower角色赋给jirauser。
3 编辑C:\Program Files\JIRA-Enterprise-3.12.3\conf\server.xml 文件,有一段是
<Context path="" docBase="${catalina.home}/atlassian-jira" reloadable="false">
<Resource name="jdbc/JiraDS" auth="Container" type="javax.SQL.DataSource"
username="sa"
password=""
driverClassName="org.hSQLdb.jdbcDriver"
url="jdbc:hsqldb:${catalina.home}/database/jiradb"
minEvictableIdleTimeMillis="4000"
timeBetweenEvictionRunsMillis="5000"
maxActive="20" />
修改几个地方:用户名、密码、驱动、URL
修改以后类似:
<Context path="" docBase="${catalina.home}/atlassian-jira" reloadable="false">
<Resource name="jdbc/JiraDS" auth="Container" type="javax.sql.DataSource"
username="jirauser"
password="sonic"
driverClassName="net.sourceforge.jtds.jdbc.Driver"
url="jdbc:jtds:SQLServer://localhost:1433/jiradb"
minEvictableIdleTimeMillis="4000"
timeBetweenEvictionRunsMillis="5000"
maxActive="20" />
4 编辑 C:\Program Files\JIRA-Enterprise-3.12.3\atlassian-jira\WEB-INF\classes\entityengine.xml文件,有一段是:
<datasource name="defaultDS" field-type-name="hsql"
schema-name="PUBLIC"
…………
修改为
<datasource name="defaultDS" field-type-name="mssql"
删除下一行的
schema-name="PUBLIC"
5 把下载好的jtds驱动压缩包解压,把其中的jtds-1.2.2.jar文件拷贝到C:\Program Files\JIRA-Enterprise-3.12.3\common\lib目录下。
6 最后重启一下服务就可以了。
四 jira跟cvs关联
1 配置cvs模块
1.1 Cvsroot 设置:jira支持的访问方式有pserver,ext(ssh)以及本地的仓库三种。
a :some/local/path (对于本地的仓库)
b :pserver:username@hostname:port/some/path (利用pserver访问,适用于局域网)
c :ext:username@hostname:/some/path (利用ssh协议访问,适用于internet)
1.2 Module name :是cvs服务器上的模块名称。模块的名称应该和后面的log的信息是一致的,也就是说log是针对该模块的日志。所以如填写了一个cvs上没有模块,则就找不到log文件,那样创建就会失败。
1.3 Log Retrieval:一种是自动检索cvs log, 一种是手动更新log.
1.4 Log File Path:如果上面选择的是手动更新Log,则需要自己先建立一个log文件,然后再这里选中它,如果是自动检索的话,那么可以任意制定一个路径,jira会自动将cvs log文件复制到指定位置。
1.5 Cvs timeout:默认设置是600秒,也就是说在cvs更新后一个小时才在jira上更新日志信息。
1.6 Password: 如果选择了自动检索日志的话,就需要输入密码,该密码是登陆cvs服务器的密码。
2 将cvs模块和jira的项目关联
2.1 打开项目列表
2.2 在需要加入cvs模块的项目后面选择查看
2.3 在CVS Modules点击选择modules,从中选择相应的模块即可。这样系统就会获取该模块的日志,更新Jira指定的日志文件。
2.4 对于jira中的问题,每个问题都拥有一个问题id,在cvs用户向服务器提交了该问题的修改版本时,log message中填写相应的问题id,那么对于问题所在源代码的修改就可以在jira的版本控制中反映出来。
3 修改模块更新频率
3.1 管理-〉System->services中更改 VCS Update Service的时间就可以了。

[新闻]淘宝“开放平台”正式开放

mikel阅读(929)

马云说冬天来了,可再冷的天也不能躲在家里不是。淘宝这些日子可没消停,前有大淘宝,接着淘宝封了百度,9月8日正式开放名为“淘园”的开放API项目:淘宝开放平台(Taobao Open Platform),这个项目意在拉拢“第三方开发者”(个人开发者和企业开发者),通过第三方开发者开发基于淘宝网数据的电子商务产品和增值商务应用, 这无疑对淘宝拓展外围业务具有重要的意义。“抓住”了开发者,从某种意义来说就是借“开发者”之力,来吸引用户,这种淘宝和“开发者”双赢的策略非常具有 吸引力。
http://www.watch-life.net/website-app/taobao-open-platform.html
下面是官方的相关简介

淘宝开放平台

淘宝开放平台项目(TOP: taobao open platform)是淘宝(中国)软件公司面向3rd app开发者,提供API接口和相关开发环境的平台。包括:

API接口规范和定义及其规范
API sandbox 在线开发测试环境
Top V1.0 版本以提供全淘宝C2C 的数据查询式API:

淘宝用户信息 (卖方和卖方用户信息,私有信息需要授权)
淘宝商品信息 (全淘宝超过1亿个商品的名称、类目、型号、介绍等信息)
淘宝商品类目信息(全淘宝商品索引及分类明细)
淘宝店铺信息(全淘宝店铺信息)
淘宝交易明细信息(在取得用户授权的情况下,查询每笔交易的详细情况)
淘宝商品管理(淘宝商品的上传、编辑、修改等接口)

Taobao Open Platform中开放的API文档很详细,基于阿里软件开发的平台,有完备的收费模式,通过这些API你可以打造一个独立域名“淘宝店”(不再局限在淘宝网上开店),把淘宝的商品搬到你的“家”,这无疑是淘宝开的“小”分店。阿里巴巴希望通过淘宝这样一个巨大的商业用户平台,发展出一个 SaaS 的中小软件产业圈。

关于淘宝开放平台的的相关资源

开发平台介绍:http://www.taobao.com/theme/tao_source/
相关API地址:http://isp.alisoft.com/apidoc/api/apiIndex.html
《ISV接入必备宝典》: http://forum.alisoft.com/viewthread.php?tid=3041
《SIP White Paper》:http://isv.alisoft.com/isv//download/SIPWhitePaper.zip

更多文章见:守望轩[http://www.watch-life.net/]

[JavaScript]关闭浏览器事件unload处理

mikel阅读(906)

当浏览器退出时会触发onunload事件,因此我们可以使用onunload事件做一些在页面关闭时要执行的操作,如提示用户信息等。但或许在实际应用 中我们都发现一个问题,刷新浏览器同样会触发onunload事件,也就是只要是离开该页面就会触发onunload事件,或许刷新时我们并不想执行 onunload定义的操作,或者我们只想在刷新时执行某操作,这样我们就遇到了一些麻烦。
本以为这种问题没有什么解决办法,没想到还是有牛人用很牛的办法解决了这个办法,这里俺就把找到的两段代码共享出来,希望对正好需要解决此问题朋友有所帮助。
方法一:

<HTML>
<HEAD>
<TITLE>判断是刷新还是关闭-www.51windows.Net</TITLE>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META NAME="Author" CONTENT="51windows,海娃,haiwa">
<META NAME="Description" CONTENT="Power by 51windows.Net">
</HEAD>
<script>
function CloSEOpen(event) {
if(event.clientX<=0 && event.clientY<0) {
alert("关闭");
}
else
{
alert("刷新或离开");
}
}
</script>
<body onunload="CloSEOpen(event)">
</BODY>
</HTML>
<div style="position: absolute; top: 10; right: 10; width: 148; height: 18;cursor:hand">
<input type="button" name="Button" value="查看源代码" onClick= 'window.location = "view-source:" + window.location.href'></div>

第二种做法:

<script language="JavaScript">
window.onbeforeunload = function() //author: meizz
{
var n = window.event.screenX – window.screenLeft;
var b = n > document.documentElement.scrollWidth-20;
if(b && window.event.clientY < 0 || window.event.altKey)
{
alert("是关闭而非刷新");
window.event.returnValue = ""; //这里可以放置你想做的操作代码
}
}
</script>