博客

centos6.5搭建ownCloud

1、用yum安装基本的LAMP环境:
[code]
yum -y install httpd mysql mysql-server
yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql
[/code]
由于最新版本owncloud-7.0.2.tar.bz2要求php版本在5.3.8以上,centos 6.5 64bit默认Yum是5.3.3,所以要改yum源
[code]
rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm
[/code]
2、安装php5.5以及扩展
[code]
yum install php55w php55w-bcmath php55w-cli php55w-common php55w-devel php55w-fpm php55w-gd php55w-imap php55w-ldap php55w-mbstring php55w-mcrypt php55w-mysql php55w-odbc php55w-pdo php55w-pear php55w-pecl-igbinary php55w-xml php55w-xmlrpc php55w-opcache php55w-intl php55w-pecl-memcache
[/code]
3、启动httpd和mysqld
[code]
/etc/init.d/httpd start
/etc/init.d/mysqld start
[/code]
4、创建一个名为’ownclouddb’和数据库用户’ownclouduser’以及密码是’password’的数据库
[code]
mysql -uroot -p
mysql> CREATE DATABASE ownclouddb;
mysql>GRANT ALL ON ownclouddb.* TO ownclouduser@localhost IDENTIFIED BY ‘password’;
[/code]
5、下载最新版本的owncloud
[code]
wget https://download.owncloud.org/community/owncloud-9.1.1.tar.bz2
[/code]
6、解压和设置权限
[code]
tar xvf owncloud-7.0.2.tar.bz2
mv owncloud /var/www/html
chown -R apache:apache /var/www/html/owncloud
chmod 777 /var/www/html/owncloud/
[/code]
7、启用apache重写模式
[code]
vi /etc/httpd/conf/httpd.conf
[/code]
查找并修改 AllowOverride None 为 Allowoverride All
[code]
Options FollowSymLinks
AllowOverride All
[/code]
8、重启httpd
[code]
/etc/init.d/httpd restart
[/code]
9、owncloud开始安装和配置,浏览器打开网址执行安装步骤:
http://IP地址/owncloud/
为了配置数据库,点“Advanced” 选择MySQL,然后输入MySQL的数据库名ownclouddb、用户名ownclouduser和密码password。
你要建立一个管理员帐号,输入必填的用户名和密码。然后点击“finish”完成安装过程。

10、如果https不能连接,需要安装sll
[code]
yum install mod_ssl
[/code]

cocos2djs碰撞检测的方法

1、就是官方提供的,根据getBoundingBox();方法获取要检测的碰撞物体的范围,然后再根据rectIntersectsRect();方法进行判断需要检测的两个精灵是否有重叠,有则发生碰撞;
优点:适合对规则的矩形物体进行检测碰撞,简单,直接
缺点:对于复杂图形不友好,对于碰撞的检测不准确,使用中有种莫名其妙的感觉
[code lang=”js”]
var dollRect = sprite.getBoundingBox();
var dollHeadRect = this.catchHand.getBoundingBox();
if(cc.rectIntersectsRect(dollRect, dollHeadRect)){
//发生碰撞事件
}
[/code]

2、第二种是在网上找到的,我感觉有些麻烦,不过相对于第一种,对于不规则物体支持的好了一些
这里根据BoundingBox 的 上下左右的中间点来判断碰撞,使检测的更准确一些
优点:使碰撞检测更准确一点
缺点:麻烦
[code lang=”js”]
var box1 = sprite1.getBoundingBox();
var bottom = cc.p(box1.x +box1.width / 2,box1.y);
var right = cc.p(box1.x +box1.width,box1.y +box1.height / 2);
var left = cc.p(box1.x,box1.y +box1.height / 2);
var top = cc.p(box1.x + box1.width / 2,box1.y + box1.height);

var box2 = sprite2.getBoundingBox();
if(cc.rectContainsPoint(box2, left)||cc.rectContainsPoint(box2, right)||cc.rectContainsPoint(box2, top)||cc.rectContainsPoint(box2, bottom)){
//发生碰撞
}
[/code]

3、第三种就是我现在使用的,不过这个针对大小比较规矩,即接近正方形比较好,但是对于外形可以复杂
这个碰撞检测就是要给精灵添加一个radius属性,设置精灵以中心为原点,radius为半径的碰撞区域,然后去判断两个精灵的中心点的距离是否小于radius之和,如果是则发生碰撞;
优点:更准确,简单
缺点:对于长的图片碰撞不友好
想判断距离首先要知道一个方法:pDistance();这个方法是cocos2d-html5获取两个坐标点之间的方法,使用这个方法我们就可以获取两个精灵中心的距离
[code lang=”js”]
var sprite = this.dolls3[i];
var distance = cc.pDistance(this.catchHand.getPosition(), sprite.getPosition());
var radiusSum = sprite.radius + this.catchHand.radius;
cc.log("distance:" + distance + "; radius:" + radiusSum);
if(distance < radiusSum){
//发生碰撞
}

//针对第三三种方法又加深了一下,使得对矩形类的精灵也能有好的判断,
//主要就是分别对X和Y方向设置不同的Radius,然后去进行分别判断
var distanceX = Math.abs(this.catchHand.getPositionX() – sprite.getPositionX());
var distanceY = Math.abs(this.catchHand.getPositionY() – sprite.getPositionY());
var radiusYSum = sprite.radiusY + this.catchHand.radius;
if(distanceX < sprite.radiusX && distanceY < radiusYSum){
this.catchDollSucceed(sprite);
return;
}
[/code]

资料来源自:http://blog.csdn.net/lzan13/article/details/30247447

cocos2djs自定义loading

[code lang=”js”]
// 加载 64 位图片码的
var image = 64位图片码, self = this;

cc.loader.loadImg(image, {isCrossOrigin : false }, function(err, img){
var sprite = cc.Sprite.create(img); // 这时候生成Sprite就不会提跨域
self.addChild(sprite); // 接下来,怎么弄那张图,就自己玩了。
});

// 加载资源的
cc.loader.load([加载资源列表], function(result, count, loadedCount){
var percent = ((loadedCount + 1) / count * 100) | 0; // 很奇怪,loadedCount是从0开始的,求大神能解析…
percent = Math.min(percent, 100);
// "加载进度:" + percent + "%");
}, function(){
// 加载完成..
});

[/code]

svn搭建

检查已安装版本
#检查是否安装了低版本的SVN
[root@localhost /]# rpm -qa subversion

#卸载旧版本SVN
[root@localhost modules]# yum remove subversion

安装SVN
[root@localhost modules]# yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql

确认已安装了svn模块
[root@localhost /]# cd /etc/httpd/modules
[root@localhost modules]# ls | grep svn
mod_authz_svn.so
mod_dav_svn.so

验证安装
检验已经安装的SVN版本信息
[root@localhost modules]# svnserve –version

[code]
svnserve,版本 1.6.11 (r934486)
编译于 Jun 23 2012,00:44:03
版权所有 (C) 2000-2009 CollabNet。
Subversion 是开放源代码软件,请参阅 http://subversion.tigris.org/ 站点。
此产品包含由 CollabNet(http://www.Collab.Net/) 开发的软件。

下列版本库后端(FS) 模块可用:

* fs_base : 模块只能操作BDB版本库。
* fs_fs : 模块与文本文件(FSFS)版本库一起工作。

Cyrus SASL 认证可用。
[/code]

代码库创建
SVN软件安装完成后还需要建立SVN库
[root@localhost modules]# mkdir -p /var/www/html/svn/sites
[root@localhost modules]# svnadmin create /var/www/html/svn/sites
执行上面的命令后,自动建立sites库,查看/var/www/html/svn/sites 文件夹发现包含了conf, db,format,hooks, locks, README.txt等文件,说明一个SVN库已经建立。

配置代码库
进入上面生成的文件夹conf下,进行配置
[root@localhost modules]# cd /var/www/html/svn/sites/conf

用户密码passwd配置
[root@localhost password]# cd /var/www/html/svn/sites/conf
[root@admin conf]# vi + passwd
修改passwd为以下内容:
[code]
[users]
# harry = harryssecret
# sally = sallyssecret
hfhleo=hfh12345
[/code]

权限控制authz配置
[root@admin conf]# vi + authz
目的是设置哪些用户可以访问哪些目录,向authz文件追加以下内容:

[code]
#设置[/]代表根目录下所有的资源
[/]
zhoulf=rw
[/code]

服务svnserve.conf配置
[root@admin conf]# vi + svnserve.conf

追加以下内容:

[code]
[general]
#匿名访问的权限,可以是read,write,none,默认为read
anon-access=none
#使授权用户有写权限
auth-access=write
#密码数据库的路径
password-db=passwd
#访问控制文件
authz-db=authz
#认证命名空间,subversion会在认证提示里显示,并且作为凭证缓存的关键字
realm=/var/www/html/svn/repositories
[/code]

配置防火墙端口
[root@localhost conf]# vi /etc/sysconfig/iptables
添加以下内容:
-A INPUT -m state –state NEW -m tcp -p tcp –dport 3690 -j ACCEPT
保存后重启防火墙
[root@localhost conf]# service iptables restart

启动SVN(注意,创建sites库,启动必须是前一个目录)
svnserve -d -r /var/www/html/svn/

查看SVN进程
[root@localhost conf]# ps -ef|grep svn|grep -v grep
root 12538 1 0 14:40 ? 00:00:00 svnserve -d -r /var/www/html/svn/

检测SVN 端口
[root@localhost conf]# netstat -ln |grep 3690
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN

停止重启SVN
[root@localhost password]# killall svnserve //停止
[root@localhost password]# svnserve -d -r /var/www/html/svn/ // 启动

测试
SVN服务已经启动,使用客户端测试连接。
客户端连接地址:svn://url/sites
用户名/密码: hfhleo/hfh12345

centos常用命令

####vi编辑
i //进入编辑模式
esc+:wq //保存退出

#####系统服务
//检查服务状态:
service –status-all
service –status-all | grep ntpd
service –status-all | less
service httpd status

chkconfig –list //列出所有服务启动级别
chkconfig xx on //添加服务开机启动
service pptpd restart //重启服务
service pptpd restart-kill //先杀死再重启

######端口操作
netstat -tulpn //列出服务和他们对应的端口:
netstat –apn //查看所有的进程和端口使用情况
netstat -tunlp|grep 端口号,用于查看指定端口号的进程情况
ps -aux | grep xxx //查看xx进程具体使用情况

#文件操作
~ //代表/root目录
/ //代表根目录
# //代表超级管理员
$ //当前登陆的用户是普通用户
pwd //查看当前路径
ls //查看当前目录下的文件和文件夹
mkdir //创建文件夹mkdir /tmp/test
touch //创建文件touch /tmp/a.txt
rm //删除文件或文件夹(f,r参数)
cp //复制文件(cp [参数] 源文件 目标文件)
mv //移动和改名 移动:(mv [参数] 源文件 目地文件);改名:移动mv dir/ directory
find //查找
cat //查看文件()
cat //重定向,需要将一些文件信息不是输出到屏幕上,而是让其输出到指定的文件或其它位置 (cat /etc/services > a.txt)

###防火墙操作
iptables -A INPUT -p tcp –dport 1723 -j ACCEPT //开放对应端口
iptables -t nat -A POSTROUTING -o venet0:0 -s 192.168.7.0/24 -j SNAT –to-source 45.124.67.22 //添加网卡转发( 192.168.7.0/24的客户机,通过本机网卡venet0:0转发)
/etc/init.d/iptables save //保存修改
/sbin/service iptables restart //重启服务

vps搭建pptpd

###ppp和pptpd对应的版本库
#安装ppp
yum install ppp
#查看当前的ppp版本 (ppp 2.4.4——————>pptpd 1.3.4,ppp 2.4.5——————>pptpd 1.4.0)
yum list installed ppp

#安装对应的pptpd版本
wget http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.x86_64.rpm
#安装
rpm -ivh pptpd-1.3.4-1.rhel5.1.x86_64.rpm
//////或者
#加入yum源:
rpm -Uvh http://poptop.sourceforge.net/yum/stable/rhel6/pptp-release-current.noarch.rpm
#安装pptpd
yum install -y pptpd
chkconfig pptpd on //开机启动pptp vpn服务

1、
#配置文件/etc/ppp/options.pptpd
cp /etc/ppp/options.pptpd /etc/ppp/options.pptpd.bak
vi /etc/ppp/options.pptpd
#加入dns
ms-dns 8.8.8.8
ms-dns 8.8.4.4

2、
#配置文件/etc/ppp/chap-secrets
cp /etc/ppp/chap-secrets /etc/ppp/chap-secrets.bak
vi /etc/ppp/chap-secrets

# Secrets for authentication using CHAP
# client server secret IP addresses
myusername pptpd mypassword *
//myusername是你的vpn帐号,mypassword是你的vpn的密码,*表示对任何ip,记得不要丢了这个星号。我这里根据这个格式,假设我的vpn的帐号是ksharpdabu,密码是 sky。那么,应该如下:
ksharpdabu pptpd sky *

3、
#配置文件/etc/pptpd.conf
cp /etc/pptpd.conf /etc/pptpd.conf.bak
vi /etc/pptpd.conf
#添加:
localip 127.16.36.1
remoteip 127.16.36.11-30 //表示vpn客户端获得ip的范围
////////pptpd.conf这个配置文件必须保证最后是以空行结尾才行,否则会导致启动pptpd服务时,出现“Starting pptpd:”,一直卡着不动的问题,无法启动服务,切记呀!

4、
配置文件/etc/sysctl.conf
vi /etc/sysctl.conf //修改内核设置,使其支持转发
将net.ipv4.ip_forward = 0 改成 net.ipv4.ip_forward = 1
保存修改后的文件:
/sbin/sysctl -p

5、启动pptp vpn服务和iptables
/sbin/service pptpd start 或者 #service pptpd start
/sbin/service iptables start

6、添加转发规则
#开启端口
iptables -A INPUT -p tcp –dport 1723 -j ACCEPT
iptables -A INPUT -p tcp –dport 47 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT
iptables -A INPUT -p UDP –dport 53 -j ACCEPT //开启dns

iptables -t nat -A POSTROUTING -o venet0:0 -s 192.168.7.0/24 -j SNAT –to-source 45.124.67.22
iptables -t nat -A POSTROUTING -s 127.16.36.0/24 -j SNAT –to-source 45.124.67.22

##出现某些网站不能访问(一般不用添加)
iptables -A FORWARD -s 127.16.36.0/24 -p tcp -m tcp –tcp-flags SYN,RST SYN -j TCPMSS –set-mss 1400(mss可以连接vpn后通过netstat -i,看看mtu;mss=mtu-20字节的IP头部+20字节的TCP 头部)

/etc/init.d/iptables save
/sbin/service iptables restart
//重启
service pptpd restart

//查看全部连接
netstat -antp

AngularJS对带有contentEditable的普通元素directive一个ng-model

[code lang=”js”]

‘use strict’;
angular
.module(‘app’)
.directive(‘contenteditable’, function() {
return {
restrict: ‘A’, // only activate on element attribute
require: ‘?^ngModel’, // get a hold of NgModelController
link: function(scope, element, attrs, ngModel) {
if (!ngModel) {
return;
} // do nothing if no ng-model
// Specify how UI should be updated(更新ui)
ngModel.$render = function() {
element.html(ngModel.$viewValue || ”);
};
// Listen for change events to enable binding(添加事件)
element.on(‘blur keyup change’, function() {
scope.$apply(readViewText);
});
// No need to initialize, AngularJS will initialize the text based on ng-model attribute
// Write data to the model
function readViewText() {
var html = element.html();
// When we clear the content editable the browser leaves a <br> behind
// If strip-br attribute is provided then we strip this out
if (attrs.stripBr && html === ‘<br>’) {
html = ”;
}
ngModel.$setViewValue(html);
}
}
};
});
[/code]
Well-Crafted Apps: How make a two-way binding to your contenteditable DIV or SPAN using AngularJS directives

angularJS controller之间的通信

1、event
这里可以有两种方式,一种是$scope.$emit,然后通过监听$rootScope的事件获取参数;另一种是$rootScope.$broadcast,通过监听$scope的事件获取参数。
这两种方法在最新版本的Angular中已经没有性能区别了,主要就是事件发送的方向不同,可以按实际情况选择。
[code lang=”js”]
/******* example ****/
///////子级传递数据给父级
// 子级传递
$scope.$emit(‘transferType’, "我要发送给父");

// 父级接收
$scope.$on(‘transferType’, function(event, data) {
$scope.transferType = data;
//console.log(data),接收到的值
};

/////// 父级传递数据给子级
// 父级传递
$scope.transferType = ”;
$scope.$broadcast(‘transferType’, "我要发送给子");

// 子级接收
$scope.transferType = ”;
$scope.$on(‘transferType’, function(event, data) {
$scope.transferType = data;
//console.log(data),接收到的值
}
[/code]

2、service
可以创建一个专用的事件Service,也可以按照业务逻辑切分,将数据存储在相应的Service中。

3、$rootScope
这个方法可能会比较dirty一点,胜在方便,也就是把数据存在$rootScope中,这样各个子$scope都可以调用,不过需要注意一下生命周期

4、直接使用$scope.$$nextSibling及类似的属性
类似的还有$scope.$parent。这个方法的缺点就更多了,官方不推荐使用任何$$开头的属性,既增加了耦合,又需要处理异步的问题,而且scope的顺序也不是固定的。不推荐

另外就是通过本地存储、全局变量或者现代浏览器的postMessage来传递参数了,除非特殊情况,请避免这类方式。

AngularJS表单验证分析

文章转载自:http://www.oschina.net/translate/angularjs-form-validation

Angular 的表单属性 $valid, $invalid, $pristine, $dirty

Angular 提供了有关表单的属性来帮助我们验证表单. 他们给我们提供了各种有关一个表单及其输入的信息,并且应用到了表单和输入.
属性类
描述
$valid ng-valid Boolean 告诉我们这一项当前基于你设定的规则是否验证通过
$invalid ng-invalid Boolean 告诉我们这一项当前基于你设定的规则是否验证未通过
$pristine ng-pristine Boolean 如果表单或者输入框没有使用则为True
$dirty ng-dirty Boolean 如果表单或者输入框有使用到则为True
Angular 也提供了有关表单及其输入框的类,以便你能够依据每一个状态设置其样式.

访问表单属性

  • 访问表单属性: [code]<form name>.<angular property>[/code]
  • 访问一个输入框:[code]<form name>.<input name>.<angular property>[/code]

Angular 的验证规则

[code lang=”js”]
<input
ng-model="{ string }"
name="{ string }"
required //代表必填项
ng-required="{ boolean }"
ng-minlength="{ number }"
ng-maxlength="{ number }"
ng-pattern="{ string }"
ng-change="{ string }">
</input>
[/code]

实例验证代码

1、html表单代码

[code lang=”html”]
<!– pass in the variable if our form is valid or invalid –>
<form name="userForm" ng-submit="submitForm(userInfo,userForm)" novalidate> <!– novalidate prevents HTML5 validation since we will be validating ourselves –>

<!– NAME –>
<div class="form-group">
<label>Name</label>
<input type="text" name="name" class="form-control" ng-model="name" required>
</div>

<!– USERNAME –>
<div class="form-group">
<label>Username</label>
<input type="text" name="username" class="form-control" ng-model="user.username" ng-minlength="3" ng-maxlength="8">
</div>

<!– EMAIL –>
<div class="form-group">
<label>Email</label>
<input type="email" name="email" class="form-control" ng-model="email">
</div>

<!– SUBMIT BUTTON –>
<!– 可以使用ng-disabled="formInfo.$invalid"(当输入不符合规则)来控制按钮的 点击状态
<button type="submit" class="btn btn-primary">Submit</button>
<!– 通过 表单已经使用担不符合规则,的逻辑产生布尔值来控制显示隐藏 –>
<span class="error" ng-show="formInfo.username.$invalid && !formInfo.username.$pristine">错误信息</span>
</form>
[/code]

2、js代码

[code lang=”js”]
// app.js
// create angular app
var validationApp = angular.module(‘validationApp’, []);

// create angular controller
validationApp.controller(‘mainController’, function($scope) {

// function to submit the form after all validation has occurred
$scope.submitForm = function(u,uf) {

// check to make sure the form is completely valid
if (uf.$valid) {
alert(‘our form is amazing’);
}

};

});
[/code]

功能实现

1、简单的控制提交按钮的状态

[code lang=”html”]
<!– 在from表单位置添加name和ng-submit,表单提交实际上就是提交到submitForm(userInfo,userForm),userInfo,userForm分别代表表单提交的数据和表单的状态 –>
<form class="form-horizontal" role="form" name="userForm" ng-submit="submitForm(userInfo,userForm)" novalidate>
<!– 在input位置添加规则(required代表必填项) –>
<input type="text" name="username" class="form-control" ng-model="user.username" ng-minlength="3" ng-maxlength="8" required>
<!– 在表单提交通过ng-disabled来实现状态控制 –>
<button type="submit" class="btn btn-success" ng-disabled="userForm.$invalid">登录</button>
[/code]

2、只在提交表单后显示错误信息

实现过程:
1.你要去掉提交按钮上的ng-disabled,因为我们想要用户即使是在表单没有全部验证完的情况下也能点击提交.
2.你要在表单已经被提交之后添加一个变量. 在你的 submitForm() 函数中, 只要加入 $scope.submitted = true 就行了;. 一旦表单被提交,它就会保存提交值为true的submitted变量.
3.将错误规则从ng-class=”{ ‘has-error’ : userForm.name.$invalid && !userForm.name.$pristine }” 调整为 ng-class=”{ ‘has-error’ : userForm.name.$invalid && !userForm.name.$pristine && submitted }”. 这就确保了错误消息只会在表单被提交时被显示出来. 你也许会需要为这个变量调整所有其它的 ng-class 和 ng-show.
[code lang=”html”]
<!– 在from表单位置添加name和ng-submit,表单提交实际上就是提交到submitForm(userInfo,userForm),userInfo,userForm分别代表表单提交的数据和表单的状态 –>
<form class="form-horizontal" role="form" name="userForm" ng-submit="submitForm(userInfo,userForm)" novalidate>
<!– 在input容器添加规则ng-class规则,同时修改错误显示的规则 –>
<div class="form-group " ng-class="{ ‘has-error’: userForm.email.$invalid && userForm.email.$dirty && submitted}">

<p class="help-block" ng-show="userForm.email.$invalid && userForm.email.$dirty && submitted">必须大于5个字符</p>
<!– 在input位置添加规则 –>
<input type="text" name="username" class="form-control" ng-model="user.username" ng-minlength="3" >
<!– 在表单提交去掉ng-disabled的状态控制 –>
<button type="submit" class="btn btn-success" >登录</button>
[/code]

遗留的问题

一个input有好几个规则,比如必须输入和最长字段,怎么来判断不同的错误??

js和jq获取宽高

工作中经常会用到js获取页面或者容器的宽高,经常会混淆。

如果出现获取的值不对,可能是页面未load渲染完成
下面结果都是基于ie7 =以上的结果
一、获取浏览器工作窗口宽高

[code lang=”js”]
/*1、获取窗口的高度与宽度(不包含工具条与滚动条)*/
document.documentElement.clientWidth/document.documentElement.clientHeight;//(IE、FireFox)
$(window).width()/$(window).height();

/*2、获取窗口的高度与宽度(包含滚动条)*/
window.innerWidth/window.innerHeight;//>IE8(api说是不包含工具条与滚动条,但实际上是包括了的滚动条的宽度)

/*3、获取窗口的高度与宽度(包含工具条与滚动条)*/
window.outerWidth/window.outerHeight;//>ie8
[/code]

二、获取document,body的宽高

[code lang=”js”]
/*1、获取document的整体高度(包括被卷去的部分)*/
document.body.clientWidth/document.body.clientHeight ;//IE、FireFox、Opera
document.body.offsetWidth/document.body.offsetHeight;//包括边线的宽高
document.body.scrollWidth/document.body.scrollHeight;

$(document).width()/$(document).height()/$(‘body’).height();
[/code]

三、获取滚动条的高度

[code lang=”js”]
/*1、浏览器滚动条滚动的位移*/
document.body.scrollTop/document.body.scrollLeft/

/*2、返回当前页面相对于窗口显示区左上角的位置(测试结果是返回浏览器滚动条滚动的位移)*/
window.pageXOffset/window.pageYOffset;//>ie8
[/code]

四、浏览器的宽高位置

[code lang=”js”]
/*1、返回浏览器相对于屏幕窗口的坐标*/
window.screenX/window.screenY;//>ie8
window.screenLeft/window.screenTop;
/*2、返回屏幕的宽高*/
window.screen.height/window.screen.width;
/*3、屏幕可用工作区的宽高*/
window.screen.availHeight/window.screen.availWidth;
[/code]