window.onload=fiximage;
function fiximage() {
var max=580;
imgs = document.getElementsByTagName('img');
for(i=0;i<imgs.length;i++) {
w=imgs[i].width;h=imgs[i].height;
if(w>max) { imgs[i].width=max;imgs[i].height=h/(w/max);}
}
}
[JQuery]TextArea的取值问题
在JQuery中读取TextArea的值,以前一直用
$("#textarea").text();
读取,最近测试时候发现在firefox中读取不出textArea的值,IE正常
于是修改为:
$("#textarea").val();
问题解决,不过搜索时,发现有人提另一个问题:
当在一个textarea标签中键入一个回车时,实际上会插入2个符号:\n\r \n 回车符 \r 换行符 如果用text()获取textarea中的值,那么存入数据库的数据就只会有\r 如果用var()获取textarea中的值,那么存入数据库的数据就只会有\n 这样的区别就是,在IE下,你如果是读取用text()存入的数据在展示在textarea中,那么数据的换行是正常的。而读取用var()存入的数据在展示在textarea中,那么数据的就不会换行。
没有具体测试过看来用val()也不妥当
[项目管理]项目管理实践系列文章
项目管理实践【一】工欲善其事,必先利其器【Basic Tools】
项目管理实践【二】版本控制【Version Control Using VisualSVN Server and TortoiseSVN】
项目管理实践【三】每日构建【Daily Build Using CCNET and MSBuild】
项目管理实践【四】Bug跟踪管理【Bug Trace and Management】
项目管理实践【五】自动编译和发布【Using Visual Studio with Source Control System to build and publish website automatically】
项目管理实践【六】自动同步数据库【Using Visual Studio with Source Control System to synchronize database automatically】
[SEO]SEO专题之三:SEO与网站开发
继续来发第三篇文章.在发文之前.回应一下前面几位朋友的留言,关于怎么提高PR 值,我在后面的系列中会具体讲解.PR值google的更新时间是无法确定的.一般二到四个月更新一次,SEO是一门技术.不是投机取巧.也不是钻空子, 虽然也有很多站点也确实钻了SEO的空子(但这样做的代价危险性可想而知).步入正题:
这篇我从程序开发的角度来讲解在网站开发的过程中从SEO的角度需要注意一些什么方面,我只会C#下的ASP.NET,所以本章也是从ASP.NET开发的角度来说.但从事asp/php的程序员也可以基本可以照搬.
我们先把google的设计指南中的话先copy过来,然后再一步一步讲解
设计与内容指南
* 网站应具有清晰的层次结构和文本链接。 每个网页应至少可以通过一个静态文本链接打开。
* 为用户提供网站地图,列出指向网站重要部分的链接。 如果网站地图上的链接超过或大约为 100 个,则需要将网站地图拆分为多个网页。
* 网站应实用且信息丰富,网页文字应清晰、准确地表述要传达的内容。
* 要考虑到用户会使用哪些字词来查找您的网页,确保网站上确实包含了这些文字。
* 尽量使用文字而不是图片来显示重要的名称、内容或链接。 Google 抓取工具无法识别图片中所含的文字。
* 确保 <标题> 元素和 ALT 属性具有描述性且准确无误。
* 检查链接是否损坏,并确保 HTML 格式正确。
* 如果要使用动态网页(即网址中包含"?" 字符),请注意并非每一个搜索引擎抓取工具都能抓取动态和静态网页。缩短参数长度和减少参数数目都会对这种情况有帮助。
* 将特定网页上的链接限制在合理的数量内(少于 100 个)
质量指南 – 具体指南
* 请不要使用隐藏文本或隐藏链接。
* 请不要使用隐藏真实内容或欺骗性的重定向手段。* 请不要向 Google 发送自动查询。
* 请不要加载使用无关关键字的网页。
* 请不要创建包含大量重复内容的多个网页、子域或域。
* 请不要制作欺诈性或安装有病毒、特洛伊木马或其他有害软件的网页。
* 请不要专门针对搜索引擎创建"桥页",或使用其他如联属计划这类原创内容很少或几乎没有原创内容的俗套 (cookie cutter) 方法。
* 如果您的网站参与联属计划,请确保您的网站可为其增添价值。 请提供独特且相关的内容,使用户有理由首先访问您的网站。
这篇文章的出处:http://www.google.com/support/webmasters/bin/answer.py?answer=35769,
我在原有的基础上补充几点:
1.文件命名不宜过长.网站设计中不能出现死页面.死链接.错误链接.空链接.文件名应该富有意义(这点的出发点似乎是为了更容易理解文件的大概内容)
2.除非呈现数据.否则布局不要用table3.URL地址,通过搜索得知.静态页面以及伪静态页面和动态页面google是一样可以收录的.但google建议参动态页面参数不宜过长.我的建议一般不要超过三个,但哪种页面google最亲睐,我们得先来了解一下google收录的基本原理和规律.
google会根据你的网站首页(或其它页)来遍历该页面的其它链接.例如:你的首页有100个超链接.那么google会遍历你的这100个链接页面. 再根据其它的页面的链接一个一个遍历直至整站遍历完成.如果中途出现很多死链接,错误链接或死页的话.google就会认为你这个网站错误百出.可能中止 遍历,从而影响你页面的收录效果.那么带参数的动态页面或伪静态页是否会影响收录呢?答安是肯定的.再举个例子:如有一个显示产品详细内容的页 面:www.a.com/products.aspx?id=x的网页.那么有100种产品是存在数据库里面的.根据不同的ID值来通过 products.aspx?id={1-100}中的<%#Eval("数据库字段")%>来显示相应的产品内容.那么看似有100个页 面.而实际上只有products.aspx这一个页面.而google会遍历你的数据库记录吗?不会.所以你有100个产品介绍.可能只能收录一个页 面!(这种形式是很多cms或企业站所采用的方式),那么有办法能收录这100个页面吗?答安是:可以.折中的选择方案是做一个产品列表页如 productlist.html(aspx)(这个页面应该是手工静态页或后台生成静态页.,只要不从数据库里面读数据就可以),该页面内容如下:
<a href="products.aspx?id=1">球阀</a>
<a href="products.aspx?id=2">闸阀</a>
…….
上面的内容应该静态生成.那么google在遍历productlist.aspx(html)页面的时候.就会遍历这些产品相应的地址了.遍历地址时会根据这个地址是否返回404错误而缓存相应的页面内容..(原理很简单..说了一大堆.不知道大家能否理解)
4.不要轻易网站内页面文件名
google一旦收录了这个页面.而不久你又将这个页面删除或改名.那么GOOGLE再次收录的时候发现这个页面不见了.肯定对你的PR值是有影响的
5.图片的alt属性不要为空.而且内容与你的关键字有关(后面详解)
6.一定要在web.config里面定义404错误转向.这个转向页面里面最好还要定义转向各个重要页面的链接
再加一点:
7.无论在站点内的哪个页面.你必须保证你可以在当前页通过页面与页面之间的链接能跳转到任何一个页面(好像有点别扭.就是说你的页面必须不可缺少正确的导航)
非淡泊无以明志,非宁静以致无以致远
[SEO]seo专题之二:网站pr值
什么是Pr值?pr是英文PageRank的缩写,中文翻译过来中网页级别.网页排名.wiki的解释:是一种由搜索引擎根据网页之间相互的超链接计算的 网页排名技术,以Google公司创办人拉里·佩奇(Larry Page)之姓来命名。此技术通常和搜索引擎优化有关,Google用它来体现网页的相关性和重要性。Google的创始人拉里·佩奇和谢尔盖·布林于 1998年在斯坦福大学发明了这项技术.
我们来通俗的解释一下这段话:pr值是google特有的网页评级标准,它仅对google有效.baidu,yahoo等其它是没有这个评级标准的.这 个评级的范围是0-10,那么这个值对网站和网页能够起到什么决定性的作用呢?通常来讲.网站PR值越高google就认为该网站对浏览者来说越有价值, 资料越具有权威性,则搜索引擎对该站点的抓取和收录频率越高,页面PR值越高则排名越靠前.那么该怎么样查看站点和页面的PR值呢?下面我们隆重请上 serachstatus(一款firefox下的插件,没有装firefox的要先装上了),官方下载地址:http://www.quirk.biz /searchstatus/,安装之后在浏览器状态栏右下角就可以看到如下图标
, 现在大家看到的绿色条就是cnblogs.com的PR值哦 .该值为6,蓝色条为alexa的排名(暂且不表),一般网站PR值能大于或等于6就已经相当不错了(作弊的除外),当我们访问cnblogs里面的不同 页面时.pagerank都会准确的显示出来 ,大家在浏览的时候发现不同页面的PR值是不一样的.那么站点PR值与页面PR值到底有什么区别和联系呢.下面我们来举例说明:
假设:www.a.com站点PR值为6,www.a.com/xx.html的页面PR值为5,该页面的关键字为"阀门"
www.b.com站点PR值为5,www.b.com/xx.html的页面PR值为6,该页面的关键字同样也为"阀门".
那么当用户在搜索"阀门"关键词时哪个站点的xx.html页面的排名会靠前呢?一般来说(90%的可能),www.b.com/xx.html 的页面排名会靠前,因为它的PR值比较a站点的高.google会认为这个页面比b站点的xx.html页面更具有参考价值和权威性.那么还有10%的不 确定性在哪里?那就是google会分析你这个页面的关键词密度,创建时间,页面相似性等因素.来判断你是否有作弊嫌疑,如果认为有则有可能PR值高的页 面可会排在后面(这点我们在后面文章将进一步分析).
我们都知道.网站PR值一般就是指首页的PR值了.因为打开网址自动加载首页.我们可以看到博客园首页是看不到地址的.但根据PR值大概也可以分析出来: 博客园首页的默认转向文件名应该是index.html或index.htm(大家可以尝试不同的默认首页文件名来判断),那么网站PR值高有什么好处 呢?还是以上面两个网址来举例:
a站点和b站点在同一时间同时更新了网站内容,添加了不少新的页面,那么PR值高的站点的新的页面google会先收录.当然两个站点的PR值差距越大.收录时间的差距一般来说也就越大(不能绝对),同时页面PR值差距越大.页面在搜索中的排名也就差距越大.
综上所述:页面PR值是影响当前页面排名的.网站PR值(一般指首页PR值)是影响站内所有页面收录频率的.当然它也影响页面排名了.它不也是指首页嘛!!
下一篇:SEO与网站开发,敬请期待!!
[SEO]SEO专题之四:如何合理有效选定关键字
上一篇我们讲到了SEO与网站开发的中的注意事项,这篇文章继续结合上一篇内容继续讲解,如何合理有效的选定关键字.
我们都知道.搜索引擎的工作是按你在文本框内输入的关键字来查找内容相匹配的网页.如果查找到则在搜索列表中显示出来,那么是不是你只要指定了相应的关键 字浏览者就一定能看到你的网页呢.非也!!如果你的页面排到十几页之后.那么有谁能翻到十几页之后再查找符合要求的信息网页呢.按照我们一般的搜索习惯. 一般最多看前两页,或许大部分浏览者只是看第一页,所以我们要想方设法将自己的页面排到第一页.或第一页前几位(这对于一个新站来说做通用关键字非常难).还是通过例子来说明这件事情
先来了解HTML页面结构
<html>
<head>
<title>xx</title>
<meta name="keywords" content=""/>
<meta name="descritpion" content=""></head>
<body>
xx
</body>
</html>
搜索引擎在区配关键词同时会按HTML页面结构来区配关键字内容(有点像遍历二叉树,不知道这种说法对不对.本人数据结构没学好.),按此理解.它的搜索 顺序为html-head-title-meta-body-div..由此看来title是指定关键字最重要的部分(这点我们在下一章再重点讲解),关 键字如何选?同样我们也要结合一个工具来做分析,,下载地址:http://ff.SEOquake.com/,安装过程就不多说了.运行成功之后在 google搜索时界面截图如下:

在每个页面下都有相应的PR值.外链接.和收录页面提示.通过这个页面我们就可以分析到各个关键字的强度及排名情况,以及重点竞争对手的排名情况.分析关键字应该从哪几方面着手呢?
1.关键字收录页面数,相比较之下.收录页面数越多.关键字越难做
2.搜索列表首页网站的PR值,一页只有10个名额.如果这10个网站的PR值普遍越高.关键字越难做
3.搜索列表首页网站的外链数,外链数越多,超过它越难.
4.google收录的该站点页面数.收录数越多,超过它越难.|
这是几个基本的分析点.但我们可以看到.有些PR值低的页面也排到了PR值高的网站前面.这是因为google排名不仅仅依据上面所列举的这四点,我们还 应该分析排在前面的页面的关键字放置的位置.以及页面关键字的密度.这个我们可以通过seoquake的pageinfo可以分析到(见图):

所以.要想排名靠前.要考虑的因素很多.而google的排名算法一直是没有公开的.这点我们就需要平时经验的不断积累了.我们不能够太相信PR值对网站排名的绝对影响.但也不能忽视,所以选一个好的关键词比做1000个外链来的效果要好得多.
下一节将重点关键词在title,keywords,description中的应用..
非淡泊无以明志,非宁静以致无以致远
[CSS]解决IE和Mozilla的布局差别的利器:“!important”
初学div+css网页布局的设计者常常会被一个问题困扰着。
在IE和其他(Mozilla、Opera等)浏览器里显示的效果常常会偏差2px。
这是因为IE对盒之间距离的解释的bug造成的。一个技巧提示帮我们找到了解决的方法:用!important。
!important是CSS1就定义的语法,作用是提高指定样式规则的应用优先权。
语法格式{ sRule!important },即写在定义的最后面,如:
Example Source Code [www.52css.com]最重要的一点是:IE一直都不支持这个语法,而其他的浏览器都支持。我们就可以利用这一点来分别给IE和其它浏览器不同的样式定义。如:
Example Source Code [www.52css.com]border:20px solid #000 !important;
border:20px solid #CCC;
padding: 30px;
width : 300px;
}
在Mozilla中浏览时候,能够理解!important的优先级,因此显示#000的颜色;
在IE中浏览时候,不能够理解!important的优先级,因此显示#CCC的颜色。
可以看到,利用!important,我们可以针对IE和非IE浏览器设置不同的样式,只要在非IE浏览器样式的后面加上!important。
!important必定成为CSS布局的利器,请记住它、掌握它、并合理的加以利用!
[IIS]使用Microsoft URL Rewrite Module for IIS 7.0修改W
在IIS5和IIS6时代,我们使用URL REWRITING可实现URL重写,使得WEB程序实现伪静态,但默认情况下只能实现.ASPX的伪静态,如果要实现伪静态*.HTML的页面,需要将 ISAPI里面的*.HTML应用程序映射改为.NET的ISAPI。但在IIS 7时代,这一切已经变得非常简单了,您在WEB.CONFIG中就可以管理这一切了。
在服务器上安装好Microsoft URL Rewrite Module,具体下载地址如下:
Microsoft URL Rewrite Module for IIS 7.0 (x86)
下载地址:http://www.iis.net/downloads/default.aspx?tabid=34&g=6&i=1691
Microsoft URL Rewrite Module for IIS 7.0 (x64)
下载地址:http://www.iis.net/downloads/default.aspx?tabid=34&g=6&i=1692
安装好之后如图:


可以直接在IIS 7里面进行添加重写规则,也可以直接在WEB.CONFIG中设置:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rewrite to article.aspx">
<match url="^article/([0-9]+).html$" />
<action type="Rewrite" url="article.aspx?newid={R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
然后,访问 /article/366.html 就是 访问/article.aspx?newid=366的结果了,无需像以前IIS 6时代一样去添加*.HTML的ISAPI的应用程序映射了。(这对使用虚拟主机的站点来说可是个福音,不用再叫管理员去帮你加设置了,自己在 WEB.CONFIG中可以设置这一切了)
下面还附一个重写的规则转换工具。
可以将您原有的第三方组件或apache的.htaccess规则配置,快速按规范转化为IIS7.0的使用web.config重写规则。
[Javascript]FileSystemObject 对象
js用FileSystemObject 对象实现文件控制
|
一、功能实现核心:FileSystemObject 对象 其实,要在JavaScript中实现文件操作功能,主要就是依靠FileSystemobject对象。在详细介绍FileSystemobject对象的各个属性和方法的使用细节前,先来看看这个对象包括哪些相关对象和集合: Driver 对象类型。包括收集系统中驱动器相关信息的方法和属性,不如共享名、可用空间等。一个“drive”对象不一定代表一个物理硬盘,还可以是一个CD-ROM驱动器、一个RAM盘或者一个通过网络逻辑连接的资源。
|
| 二、FileSystemObject编程三部曲 |
| 使用FileSystemObject 对象进行编程很简单,一般要经过如下的步骤: 创建FileSystemObject对象、应用相关方法、访问对象相关属性 。 |
| (一)创建FileSystemObject对象 |
| 创建FileSystemObject对象的代码只要1行: |
| var fso = new ActiveXObject("Scripting.FileSystemObject"); |
| 上述代码执行后,fso就成为一个FileSystemObject对象实例。 |
| (二)应用相关方法 |
| 创建对象实例后,就可以使用对象的相关方法了。比如,使用CreateTextFile方法创建一个文本文件: |
| var fso = new ActiveXObject("Scripting.FileSystemObject"); |
| var f1 = fso.createtextfile("c:\\myjstest.txt",true"); |
| (三)访问对象相关属性 |
| 要访问对象的相关属性,首先要建立指向对象的句柄,这就要通过get系列方法实现:GetDrive负责获取驱动器信息,GetFolder负责获取文件夹信息,GetFile负责获取文件信息。比如,指向下面的代码后,f1就成为指向文件c:\test.txt的句柄: |
| var fso = new ActiveXObject("Scripting.FileSystemObject"); |
| var f1 = fso.GetFile("c:\\myjstest.txt"); |
| 然后,使用f1访问对象的相关属性。比如: |
| var fso = new ActiveXObject("Scripting.FileSystemObject"); |
| var f1 = fso.GetFile("c:\\myjstest.txt"); |
| alert("File last modified: " + f1.DateLastModified); |
| 执行上面最后一句后,将显示c:\myjstest.txt的最后修改日期属性值。 |
| 但有一点请注意:对于使用create方法建立的对象,就不必再使用get方法获取对象句柄了,这时直接使用create方法建立的句柄名称就可以: |
| var fso = new ActiveXObject("Scripting.FileSystemObject"); |
| var f1 = fso.createtextfile("c:\\myjstest.txt",true"); |
| alert("File last modified: " + f1.DateLastModified); |
| 三、操作驱动器(Drives) |
| 使用FileSystemObject对象来编程操作驱动器(Drives)和文件夹(Folders)很容易,这就象在Windows文件浏览器中对文件进行交互操作一样,比如:拷贝、移动文件夹,获取文件夹的属性。 |
| (一)Drives对象属性 |
| Drive对象负责收集系统中的物理或逻辑驱动器资源内容,它具有如下属性: |
| l TotalSize:以字节(byte)为单位计算的驱动器大小。 |
| l AvailableSpace或FreeSpace:以字节(byte)为单位计算的驱动器可用空间。 |
| l DriveLetter:驱动器字母。 |
| l DriveType:驱动器类型,取值为:removable(移动介质)、fixed(固定介质)、network(网络资源)、CD-ROM或者RAM盘。 |
| l SerialNumber:驱动器的系列码。 |
| l FileSystem:所在驱动器的文件系统类型,取值为FAT、FAT32和NTFS。 |
| l IsReady:驱动器是否可用。 |
| l ShareName:共享名称。 |
| l VolumeName:卷标名称。 |
| l Path和RootFolder:驱动器的路径或者根目录名称。 |
| (二)Drive对象操作例程 |
| 下面的例程显示驱动器C的卷标、总容量和可用空间等信息: |
| var fso, drv, s =""; |
| fso = new ActiveXObject("Scripting.FileSystemObject"); |
| drv = fso.GetDrive(fso.GetDriveName("c:\\")); |
| s += "Drive C:" + " – "; |
| s += drv.VolumeName + "\n"; |
| s += "Total Space: " + drv.TotalSize / 1024; |
| s += " Kb" + "\n"; |
| s += "Free Space: " + drv.FreeSpace / 1024; |
| s += " Kb" + "\n"; |
| alert(s); |
| 执行后出现下面的信息框: |
| 四、操作文件夹(Folders) |
| 涉及到文件夹的操作包括创建、移动、删除以及获取相关属性。 |
|
(一) Folder对象的相关属性和方法列表 FileSystemObjec.CreateFolder 创建文件夹
|
| (二)Folder对象操作例程 |
| 下面的例程将练习获取父文件夹名称、创建文件夹、删除文件夹、判断是否为根目录等操作: |
| var fso, fldr, s = ""; |
| // 创建FileSystemObject对象实例 |
| fso = new ActiveXObject("Scripting.FileSystemObject"); |
| // 获取Drive 对象 |
| fldr = fso.GetFolder("c:\\"); |
| // 显示父目录名称 |
| alert("Parent folder name is: " + fldr + "\n"); |
| // 显示所在drive名称 |
| alert("Contained on drive " + fldr.Drive + "\n"); |
| // 判断是否为根目录 |
| if (fldr.IsRootFolder) |
| alert("This is the root folder."); |
| else |
| alert("This folder isn't a root folder."); |
| alert("\n\n"); |
| // 创建新文件夹 |
| fso.CreateFolder ("C:\\Bogus"); |
| alert("Created folder C:\\Bogus" + "\n"); |
| // 显示文件夹基础名称,不包含路径名 |
| alert("Basename = " + fso.GetBaseName("c:\\bogus") + "\n"); |
| // 删除创建的文件夹 |
| fso.DeleteFolder ("C:\\Bogus"); |
| alert("Deleted folder C:\\Bogus" + "\n"); |
| 五、操作文件(Files) |
| 对文件进行的操作要比以上介绍的驱动器(Drive)和文件夹(Folder)操作复杂些,基本上分为以下两个类别:对文件的创建、拷贝、移动、删除操作和对文件内容的创建、添加、删除和读取操作。下面分别详细介绍。 |
| (一)创建文件 |
| 一共有3种方法可用于创建一个空文本文件,这种文件有时候也叫做文本流(text stream)。 |
| 第一种是使用CreateTextFile方法。代码如下: |
| var fso, f1; |
| fso = new ActiveXObject("Scripting.FileSystemObject"); |
| f1 = fso.CreateTextFile("c:\\testfile.txt", true); |
| 第二种是使用OpenTextFile方法,并添加上ForWriting属性,ForWriting的值为2。代码如下: |
| var fso, ts; |
| var ForWriting= 2; |
| fso = new ActiveXObject("Scripting.FileSystemObject"); |
| ts = fso.OpenTextFile("c:\\test.txt", ForWriting, true); |
| 第三种是使用OpenAsTextStream方法,同样要设置好ForWriting属性。代码如下: |
| var fso, f1, ts; |
| var ForWriting = 2; |
| fso = new ActiveXObject("Scripting.FileSystemObject"); |
| fso.CreateTextFile ("c:\\test1.txt"); |
| f1 = fso.GetFile("c:\\test1.txt"); |
| ts = f1.OpenAsTextStream(ForWriting, true); |
| (二)添加数据到文件 |
| 当文件被创建后,一般要按照“打开文件->填写数据->关闭文件”的步骤实现添加数据到文件的目的。 |
| 打开文件可使用FileSystemObject对象的OpenTextFile方法,或者使用File对象的OpenAsTextStream方法。 |
| 填 写数据要使用到TextStream对象的Write、WriteLine或者WriteBlankLines方法。在同是实现写入数据的功能下,这3者 的区别在于:Write方法不在写入数据末尾添加新换行符,WriteLine方法要在最后添加一个新换行符,而WriteBlankLines则增加一 个或者多个空行。 |
| 关闭文件可使用TextStream对象的Close方法。 |
| (三)创建文件及添加数据例程 |
| 下面的代码将创建文件、添加数据、关闭文件几个步骤结合起来进行应用: |
| var fso, tf; |
| fso = new ActiveXObject("Scripting.FileSystemObject"); |
| // 创建新文件 |
| tf = fso.CreateTextFile("c:\\testfile.txt", true); |
| // 填写数据,并增加换行符 |
| tf.WriteLine("Testing 1, 2, 3.") ; |
| // 增加3个空行 |
| tf.WriteBlankLines(3) ; |
| // 填写一行,不带换行符 |
| tf.Write ("This is a test."); |
| // 关闭文件 |
| tf.Close(); |
| (四)读取文件内容 |
| 从 文本文件中读取数据要使用TextStream对象的Read、ReadLine或ReadAll 方法。Read方法用于读取文件中指定数量的字符;ReadLine方法读取一整行,但不包括换行符;ReadAll方法则读取文本文件的整个内容。读取 的内容存放于字符串变量中,用于显示、分析。在使用Read或ReadLine方法读取文件内容时,如果要跳过一些部分,就要用到Skip或 SkipLine方法。 |
| 下面的代码演示打开文件、填写数据,然后读取数据: |
| var fso, f1, ts, s; |
| var ForReading = 1; |
| fso = new ActiveXObject("Scripting.FileSystemObject"); |
| // 创建文件 |
| f1 = fso.CreateTextFile("c:\\testfile.txt", true); |
| // 填写一行数据 |
| f1.WriteLine("Hello World"); |
| f1.WriteBlankLines(1); |
| // 关闭文件 |
| f1.Close(); |
| // 打开文件 |
| ts = fso.OpenTextFile("c:\\testfile.txt", ForReading); |
| // 读取文件一行内容到字符串 |
| s = ts.ReadLine(); |
| // 显示字符串信息 |
| alert("File contents = '" + s + "'"); |
| // 关闭文件 |
| ts.Close(); |
| (五)移动、拷贝和删除文件 |
| 对 于以上三种文件操作,JavaScript各有两种对应的方法:File.Move 或 FileSystemObject.MoveFile用于移动文件;File.Copy 或 FileSystemObject.CopyFile用于拷贝文件;File.Delete 或 FileSystemObject.DeleteFile用于删除文件。 |
| 下面的代码演示在驱动器C的根目录下创建一个文本文件,填写一些内容,然后将文件移动到\tmp目录下,再在目录\temp下面建立一个文件拷贝,最后删除这两个目录的文件: |
| var fso, f1, f2, s; |
| fso = new ActiveXObject("Scripting.FileSystemObject"); |
| f1 = fso.CreateTextFile("c:\\testfile.txt", true); |
| // 写一行 |
| f1.Write("This is a test."); |
| // 关闭文件 |
| f1.Close(); |
| // 获取C:\根目录下的文件句柄 |
| f2 = fso.GetFile("c:\\testfile.txt"); |
| // 移动文件到\tmp目录下 |
| f2.Move ("c:\\tmp\\testfile.txt"); |
| // 拷贝文件到\temp目录下 |
| f2.Copy ("c:\\temp\\testfile.txt"); |
| // 获取文件句柄 |
| f2 = fso.GetFile("c:\\tmp\\testfile.txt"); |
| f3 = fso.GetFile("c:\\temp\\testfile.txt"); |
| // 删除文件 |
| f2.Delete(); |
f3.Delete();
[浏览器]兼容多种浏览器“复制到剪贴板”的解决方案
昨天在也一个php程序的时候,要实现“复制到剪贴板”的功能,由于安全问题,浏览器的限制越来越严,实现的方法也越来越有限,这个简单的功能要想实现兼容不同的浏览器还真不容易,根据网上的一些资料结合我测试的经验,相关解决方案如下:
方案一:利用“window.clipboardData”
代码示例:
window.clipboardData.clearData();
window.clipboardData.setData("Text", txt)
};
评论:这个方案只适合IE浏览器,同时在IE7下有个如下安全提示的对话框。
由于IE的浏览器的占有率比较大,这个方案是使用最广的,也是最简单的方法。
支持浏览器:IE5.5 IE6.0 IE7.0
方案二:利用“Components.interfaces.nsIClipboard”
代码示例:
try {
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
} catch (e) {
if (flag == 0) {
alert("You are using the Firefox browser, copy the function browser refuse!
\nPlease in the browser address bar enter'about:config' and Enter \n and set'signed.applets.codebase_principal_support' to 'true'");
} else {
alert("你使用的是Firefox 浏览器,复制功能被浏览器拒绝!\n请在浏览器地址栏输入'about:config'
并回车\n然后将'signed.applets.codebase_principal_support'设置为'true'");
}
}
var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance
(Components.interfaces.nsIClipboard);
if (!clip)
return;
var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance
(Components.interfaces.nsITransferable);
if (!trans)
return;
trans.addDataFlavor('text/unicode');
var str = new Object();
var len = new Object();
var str = Components.classes["@mozilla.org/supports-string;1"].createInstance
(Components.interfaces.nsISupportsString);
var copytext = txt;
str.data = copytext;
trans.setTransferData("text/unicode", str, copytext.length * 2);
var clipid = Components.interfaces.nsIClipboard;
if (!clip)
return false;
clip.setData(trans, null, clipid.kGlobalClipboard);
}
评论:这个方案只适合Firefox,同时也有安全的问题,如果想使用这个方法,必须手动开启Firefox的 一个配置:signed.applets.codebase_principal_support。方法是:在地址栏输输入 “about:config”,设置“signed.applets.codebase_principal_support”为true,默认该项是false。
这个方法虽然可以在Firefox使用,但让一个普通用户去开启这个配置似乎太专业了。
把这个方案和方案一结合,可以适用80%以上的用户。
支持浏览器:Firefox1.5 firefox2.0 firefox3.0
方案三:JavaScript + flash
代码示例:
if (!document.getElementById(flashcopier)) {
var divholder = document.createElement('div');
divholder.id = flashcopier;
document.body.appendChild(divholder);
}
document.getElementById(flashcopier).innerHTML = '';
var divinfo = '<embed src="clipboard.swf" FlashVars="clipboard=' + text2copy + '"
width="0" height="0" type="application/x-shockwave-flash"></embed>';
document.getElementById(flashcopier).innerHTML = divinfo;}
评论:这个方案是一个最流行的方法,著名的Clipboard Copy解决方案 利用一个clipboard.swf作为桥梁,复制内容到剪贴板。原理是:创建一个隐藏的flash文件,同时给给flash的变量FlashVars 赋值“clipboard=..”,通过这个赋值flash就会把复制的内容放到剪贴板。这个方法兼容IE、Firefox、Opera、chrome、 Safari,真可谓“万能”的解决方案。浏览器Flash的安装率非常高,这几乎是一个完美的解决方案。
clipboard.swf 的下载地址:http://watch-life.googlecode.com/files/clipboard.swf。
但是,世界上有完美的事么?这个方法只支持flash 9 ,不支持最新的flash 10。因为flash10中规定了只有在swf上进行了真实的操作(比如鼠标点击)才能访问剪切板,而上述方法只是使用了一个隐藏的swf文件,通过 JavaScript操作flash的剪贴板,用户并没有对swf文件进行真实的操作,因此这个方法也就失效了。
那么如何解决这个“真实操作”的问题呢?可以使用一个JavaScript库:Zero Clipboard, 利用这个js库可以支持利用flash 10 实现复制到剪贴板。这个方法原理是在一个透明的flash(对用户来说是不可见的)上覆盖一个dom元素比如button或div,当点击这个dom时, 实际点击的是flash,从而访问flash的剪贴板。真够曲折的。:-)
具体的实现详见如下链接:
DEMO页面 : http://bowser.macminicolo.net/~jhuckaby/zeroclipboard/
Zero Clipboard项目主页: http://code.google.com/p/zeroclipboard/
支持浏览器:Firefox1.5 firefox2.0 firefox3.0 IE5.5 IE6.0 IE 7.0 opera 8 opera 9 chorme 1.0 chorme 2.0 safari 3
Mikel