2011年8月17日星期三

Javascript 中的 json与对象的转化

简单的说json是一种数据交换格式。具体说明请见官方网站中文站

将后台程序(如php)发送过来的json数据转化为javascript的数组或者对象的方法十分简单,代码如下

//假设后台发送的json数据为 '{a:2,b:1}' 存储于str中
var data = eval( '(' + str + ')' );


然而想将一个javascript对象转化为json格式的字符串却并不那么简单,特别是对象的属性值递归包含一个对象时(如 var obj={a:[2,3],b:{m:[3,4],n:2} } ),那么有没有什么方法将obj转化为json格式的字符串呢?

当然你可以自己写一个函数,递归遍历一个对象并将其转化为json格式的字符串,对于大部分人来说这有些困难并容易出错。
幸好已经有人做好了这件事情,你只用包含一段javascript代码即可。
打开官方网站http://www.json.org/json-zh.html ,找到Javascript分类下的 json2.js链接并打开,然后下载文件并解压,在你的网页中包含json2.js文件即可。

使用方法:










------------------------------------------------------------
补充:貌似现在新版的浏览器都原生支持JSON.stringify函数了。请见此文介绍:JSON对象和字符串之间的相互转换

Javascript 中的编码与解码

1.encodeURI/decodeURI 用于编码/解码整个带参数的URI,比如用函数新打开一个网址 注意参数为整个(或编码后的)url字符串

var url="http://grow.sinaapp.com/?test=a&str='a b+c 编码'";
var out= encodeURI(url);
alert(out);

运行以上代码

2.encodeURIComponent/decodeURIComponent 用于编码解码一个URI组件(url请求参数),比如ajax请求时的参数 注意参数为URL请求参数的一部分

var arg="http://grow.sinaapp.com/?test=a&str='a b+c 编码'";
var out= encodeURIComponent(arg);
alert(out);

运行以上代码

3.escape/unescape 对字符串进行编码/解码,用于html文档内部,比如对于文档dom的操作

var str="http://grow.sinaapp.com/?test=a&str='a b+c 编码'";
var out= escape(str);
alert(out);

运行以上代码

Javascript 中的引用与复制

1.当在javascript中执行下列语句后将改变什么

var b = a;

要根据不同情况而论

2.javascript中的变量类型分为基本类型和对象类型,除基本类型(bool, number, string)外其他皆为对象类型。当然基本类型也为简单对象,我们这里为了叙述方便加以区分。
除基本类型外,一切赋值皆为引用。看下面代码

var a={m:2};
var b = a;
b.m = 3;

上面a为对象{m:2}的引用,b也为此对象的引用。它们指向完全相同的对象。当执行第三行(b.m = 3;)后它们指向的对象变为{m:3},也就是说a.m === b.m ===3;
修改a的属性或者b的属性时也就是修改它们指向的对象的属性。

3. 赋新值后引用对象改变

var a={m:2};
var b = a;
b = {n:3};

执行上述第二行(var b = a;)后a和b指向相同的对象{m:2},但当执行第三行(b = {n:3};)后b引用了新的对象{n:3},a仍然引用之前的对象{m:2}。此时修改a或b时对彼此没有影响。

4. 判断赋值操作是否会影响到之前的对象
由上面分析可知,当对一个变量赋予新值时,这个变量解除之前的引用,指向新的对象。但当操作一个对象的属性时,会影响到所有指向这个对象的变量。

5.如果复制一个对象,而不是引用它,需要将该对象所有属性进行递归深度复制

2011年8月12日星期五

CSS框模型:一切皆为框 -- 从行框说起

1.行框 看图说话
[caption id="attachment_685" align="alignnone" width="355" caption="css 行框 各部分详解"]css 行框[/caption]

上图代表了框模型中的行框。line-height 属性设置行间的距离(行高)。该属性会影响行框的布局。在应用到一个块级元素时,它定义了该元素中基线之间的最小距离而不是最大距离。

line-height 与 font-size 的计算值之差(在 CSS 中成为“行间距”)分为两半,分别加到一个文本行内容的顶部和底部。可以包含这些内容的最小框就是行框。[来源]

2.框模型 继续看图
css 框模型

上图代表了CSS中的框,每个框有高度(height)、宽度(width)、内边距(padding)、边框(border)、外边距(margin)等属性。

3.css中元素的分类

元素是文档结构的基础,在CSS中,每个元素生成了一个包含了元素内容的框(box,也译为“盒子”)。但是不同的元素显示的方式会有所不同,例如<div>和<span>就不同,而<strong>和<p>也不一样。在文档类型定义(DTD)中对不同的元素规定了不同的类型,这也是DTD对文档之所以重要的原因之一。[来源]

i. 替换和不可替换元素

从元素本身的特点来讲,可以分为替换和非替换元素。

a) 替换元素

替换元素就是浏览器根据元素的标签和属性,来决定元素的具体显示内容。

例如浏览器会根据<img>标签的src属性的值来读取图片信息并显示出来,而如果查看(X)HTML代码,则看不到图片的实际内容;又例如根据<input>标签的type属性来决定是显示输入框,还是单选按钮等。

(X)HTML中的<img>、<input>、<textarea>、<select>、<object>都是替换元素。这些元素往往没有实际的内容,即是一个空元素,例如:




浏览器会根据元素的标签类型和属性来显示这些元素。可替换元素也在其显示中生成了框。

b) 非替换元素

(X)HTML 的大多数元素是不可替换元素,即其内容直接表现给用户端(例如浏览器)。例如:

非替换元素

段落<p>是一个不可替换元素,文字“段落的内容”全被显示。

ii. 显示元素 块级元素和行内元素

除了可替换元素和不可替换元素的分类方式外,CSS 2.1中元素还有另外的分类方式:块级元素(block-level)和行内元素(inline-level,也译作“内联”元素)。

a) 块级元素

在视觉上被格式化为块的元素,最明显的特征就是它默认在横向充满其父元素的内容区域,而且在其左右两边没有其他元素,即块级元素默认是独占一行的。

典型的块级元素有:<div>、<p>、<h1>到<h6>,等等。

通过CSS设定了浮动(float属性,可向左浮动或向右浮动)以及设定显示(display)属性为“block”或“list-item”的元素都是块级元素。

但是浮动元素比较特殊,由于浮动,其旁边可能会有其他元素的存在。而“list-item”(列表项<li>),会在其前面生成圆点符号,或者数字序号。

b) 行内元素
行内元素不形成新内容块,即在其左右可以有其他元素,例如<a>、<span>、<strong>等,都是典型的行内级元素。

display属性等于“inline”的元素都是行内元素。几乎所有的可替换元素都是行内元素,例如<img>、<input>等等。

不过元素的类型也不是固定的,通过设定CSS 的display属性,可以使行内元素变为块级元素,也可以让块级元素变为行内元素。

4.回到行框

平时块状元素用得比较多,也比较熟悉,可对于行内元素才是真正包含文字数据的地方,也是重点需要修饰的地方。

一般的行内元素(span,img,input)具有框模型中规定的边框背景等css属性,但一些属性对于行内元素来说可能是没有效果的。

height/width 属性设置元素内容区的高度和宽度,在内容区外面可以增加内边距、边框和外边距。

行内非替换元素(如span)会忽略这两个属性。

『关注』真实的印度,在成见之外

『关注』真实的印度,在成见之外人口红利高峰在中国渐渐退去,但正在印度强劲到来。印度会超过中国吗?这是一个无法避开的话题。印度,这个一直因其“肮脏混乱”被轻视和取笑的国家,似乎正在奔向与中国匹敌的地位。在我们观察印度的时候,遗漏了什么?印度蕴含了什么能量,还为我们所不了解?印度的脚步声逼近之际,已经到了我们抛弃成见、重新观察印度的时候。

“印度是一个乱七八糟的国家。”把生命奉献给印度独立运动的圣雄甘地曾这么说自己的祖国。

“你知道Delhi Belly这个词吗?”英国广播公司(BBC)摄影记者马尔科斯一脸坏笑地问本报记者—这是一个“印度造英语”单词,可以翻译成“德里腹泻”。马尔科斯正准备前往印度进行一个主题拍摄。和很多对印度有一知半解的旅行者一样,他已经做好了腹泻一周的打算。2010年英联邦运动会在德里举行时,曾被称为“肮脏运动会”。连久离故土的印度游子也难以适应故土,诺贝尔文学奖获得者、印度裔英国作家奈保尔在首访印度的时候,曾惊讶于祖国的肮脏无序、混乱不堪,惊讶于农村普遍存在的各种陋习和近乎蒙昧的状态,以至于他在游记中含讥带讽地写下了“(在印度)大便是一种社交活动”这样的语句。

『关注』真实的印度,在成见之外混乱肮脏的印度,还是闪光的?在一贯以政府效率、基础设施和工业现代化进展著称的中国,普通民众看待印度时,难免产生优越感。中国网络上流传的一个笑话说,在印度洗淋浴的时候,千万不能唱歌,否则就会闹肚子。印度的传统葬礼仪式照片,被中国网民以“恒河浮尸”的惊悚标题广为传播。信息时代的猎奇者,依然能搜集到足够的图片和见闻,来支持外界对印度的传统想象,如糟糕的卫生、肮脏的环境、过于密集的人口、残酷的种姓制度等等。在甘地去世63年之后,中国现代国际关系研究院的印度问题专家马加力教授依然承认:“中国的多数人认为,印度是一个非常保守、混乱和落后的国家。”右图:在印度东部丛林地区,村民开始使用太阳能,传统生活方式有所改变

但是,旅行者的图片和文字构建的印度形象,与一个数字和概念构建的印度形象却不甚相容。猎奇游客的惊鸿一瞥,并不妨碍观察家们作出一些闪光的评价:“印度是世界上人口最多的民主国家”,“印度是世界上经济发展最快的国家之一”,“印度要当世界的办公室”、“全球外包中心”,“印度宝莱坞是仅次于美国好莱坞的第二大电影工业基地”……而在过去十多年里,后者是全球各大媒体和评估机构最着迷的题目,尤其是因为它们与印度混乱的表象同时存在。

据国际货币基金组织(IMF)的统计,在过去20年中,印度的年均GDP增速高达5.8%,在发展中国家当中名列前茅。目前,它已经是世界上第十大经济体。要是按照购买力评价(PPP)来计算的话,印度是世界上第四大经济体。印度总理曼莫汉·辛格(经济学家,印度的“改革之父”)在2010年雄心勃勃地宣称:“印度经济增长率有望在未来两年达到10%,与中国相媲美。”这并非不切实际的话—在中国刚刚通过的“十二五规划”当中,下一个5年里GDP的平均增速被设定为7%。印度的GDP增速要超过中国,看来在短期之内就能够实现。虽然印度表面并不闪闪发光,其内核竞争力之强劲却是毋庸置疑的。

『关注』真实的印度,在成见之外中国人,走近些
中国人对印度的情感微妙复杂,因为印度与中国有很多相似之处,使得它们之间的竞争颇似两个表亲之间的较劲:同样是数千年文明,同样拥有十多亿人口(并且比中国人口年轻),同样拥有核武器和不断壮大的海军,同样经济高速发展,同样被认定为“新兴市场国家”,同属“金砖五国”之一—这个国家恰好又跟中国在并不久远的现代史中有过一场失败的战争,有着漫长的边界和大面积的领土争端,并扼守在中国能源进口通道南线的印度洋之上。它们曾经是不结盟运动的合作者,又曾在大国外交当中满怀猜忌:中国和“印度的宿敌”巴基斯坦维持“全天候的友好关系”,印度则选择与俄罗斯保持“特殊利益的安全关系”,彼此之间进行牵制。直到世纪之交,两国的外交关系才走向现实。2005年,中印双方宣布建立“战略合作伙伴关系”。第一条新德里到北京的直飞航线,是在2006年才正式开通的。右图:印度古吉拉特邦的妇女身着传统服装,坐在家里打手机

正因如此,不少中国人对印度的判断依然很容易失之轻率和表面化,无论是对习俗、文化、国际关系还是国内体制。不过,这些判断在更深一层的接触和观察之后,就会改变。

印度是一个有着多元宗教的国度,习惯“大一统”的中国人是难以想象的。著名的印度裔诺贝尔经济学奖得主阿玛蒂亚·森在《善于争鸣的印度人》一书中提到,印度有印度教、伊斯兰教、基督教、佛教、锡克教、耆那教、琐罗亚斯德教(即拜火教)和犹太教等多重宗教信仰,仅在印度教当中,信仰的神祇就多达3.3亿(印度超过80%的人口是印度教信徒)。此外,这个国家还有23种官方语言。要保留和尊重这么多的宗教和信仰,就必须保留和尊重长久以来的一些习俗,即便它们看上去与现代社会格格不入。对于前述中文网络上广为传播的“恒河浮尸”,在北京外国语大学任教的印度人B·辛格先生向本报记者解释说:“我的祖父去世之后,骨灰撒入恒河。这是我们的习俗。”另一方面,印度博大精深的文化在中国有大批的拥趸,如在过去几年中,印度大师克里希那提关于修行的经典书籍在中国城市里流行,让人想起1990年代瑜伽在中国的风行。今年5月,北京将举办庆祝印度诗人泰戈尔诞辰150周年的纪念活动。历经高速城市化的中国人开始重新看待印度的宗教,中国一位著名记者在印度旅行了一个月之后,对本报记者总结道:“这是一个有信仰的国度,对比中国社会的喧嚣和浮躁,印度人的心态十分平和。”

『关注』真实的印度,在成见之外看待地缘政治时,中印双方依然都存在“零和游戏”(一方所得正是另一方所失)的思维习惯,这是冷战的遗产。中国《环球时报》2011年4月份报道印度的时候,用“印(度)……将(中国)区域互动当做战略威胁”的措辞,批评印度对于中国的戒心。印度前驻华记者艾蓓(Pallvi Aiyar)对本报记者说:“能源问题导致的印中竞争是‘结构性’的,何况两国还存在领土争端。”右图:2011年4月7日,一位象夫坐在象背上,在新德里马路边的停车区休息

但“零和游戏”远非中印之间唯一的关系。中国媒体和网络上,批评印度联合美国(或者日本)制衡中国的声音不绝于耳。印度驻华大使苏杰生在接受本报记者采访时,认为“印度和中国既有竞争也有合作”,他用一句简单的话总结了网上流行的冷战思维:A和B联手针对C,或者B和C联手针对A,这种合纵连横的战略手腕如今“都是一些老套的思路”。在2009年年底召开的联合国气候变化会上,中国就和印度携手合作,组成了独立于西方世界之外的“基础四国”,致力于改变西方国家在气候变化问题上制订的不利于发展中国家的游戏规则。在海南三亚刚刚结束的“金砖五国”峰会上,中印共同提出改革全球治理机制、改革国际货币体系的呼吁。艾蓓对于目前中印关系的总结更加清晰:“我觉得,现在世界发展的趋势是松散化。你可以在这个领域跟此方结盟,然后在那个领域跟它竞争。”

『关注』真实的印度,在成见之外对印度看似“十分混乱”的民主制度,中国人也逐渐意识到它自有其规律。在马加力教授的著作《崛起中的巨象》里,观察了2009年印度大选:选举持续了一个月,7.14亿印度选民冒着40℃的高温投票,1000多个政党参选。有600万工作人员为选举提供服务—它并没有乱成一团,反而进行得越来越好。北京大学印度研究中心副主任姜景奎教授认为:“印度的政治是稳定的,其根本在于它有民主制度。”正是这个制度,保证了一个有数亿神祇、23种官方语言和11亿人口的国家20多年持续发展,而且早在1947年独立之后,就历史性地消除了本国的饥荒问题。这个制度并非在印度凭空产生。B·辛格先生认为,英国人留下的民主制度、文官制度以及英语,是印度至今维持稳定和发展的根本原因。有一个例子让人颇感意外:1965年,印度南方因为语言问题发生骚乱。当地人宁可使用英语作为自己的官方语言,也不肯承认印地语的官方语言地位,并声称要脱离印度。最后解决问题的方式,竟是延长了英语作为官方语言的时限,这次分裂危机就此暂时渡过。虽然英语是一种“外来语”,殖民史也已经过去很久,但它依然能在印度政治中起到粘合剂的作用。右图:印度宝莱坞号称“世界最大电影生产基地”,每年大约生产900部电影。图为宝莱坞影片在孟买上映

当然,印度人也要忍受民主的软肋和弱势政府的表现。《印度斯坦时报》驻华记者帕蒂尔在清华大学演讲时,说了一个笑话:“新德里和北京都是堵车严重的国家首都。北京堵车是因为汽车过多,而新德里堵车却是因为示威游行的民众太多。”1989年到1999年期间,印度的政坛动荡导致9次政府更迭。自1990年代起,因为印度教教派主义运动的兴起,一度引发了印度教教徒和穆斯林之间的冲突。官僚机构效率低下,令外来者难以忍受。但印度人依旧为民主制度感到骄傲,不愿为了效率将其牺牲。1970年代,当英迪拉·甘地试图建立国大党的威权专制时,她被选民所抛弃,直到她改变选举方针,才在1980年重新当选印度总理。

『关注』真实的印度,在成见之外当中国人朝印度走近些,他们的看法自然就会分化。2011年,北京大学的学生做了一个调查—“中印青年对对方国家的看法”,据姜景奎教授告诉本报记者,北大和印度德里大学的受调查者当中,都有“百分之十几”的人认为两国互为竞争对手。另外一所中国大学西安交大的被调查者当中,却有“百分之四五十”的人认为印度是中国的竞争对手。“在同一个国家里,对外国的认知也是有差别的。如何看印度,是一个视角取舍的问题。”姜景奎教授总结说。他认为,不能用别人的尺度来衡量中印关系,中国现在对于印度的认识,“建立于西方认知的基础之上”:以所谓中印之争是“龙象之争”为例,其实印度人崇拜的偶像是孟加拉虎,“大象”这个象征是西方世界加给它的,归根结底,“龙象之争”是部分英语精英提出的,但在普遍意义上,这不为印度人所接受。右图:印度公立小学的学生享用免费午餐。“Mid Day Meal”计划旨在使所有学生免于饥饿,增加入学率,降低缺课率,增进不同种姓学生的交流

矛盾的印度和镜子和许多发展中国家一样,印度依然充满难以想象的矛盾。

虽然它解决了饥荒问题,却仍有4亿印度人营养不良。它在孟买建起了现代化的大都市,却在市郊存在世界上最大的贫民窟。印度以自己作为“世界的办公室”、承接大量美国外包产业而自豪,但庞大的乡村却停留在农业时代。曾在印度卡纳特卡邦农村调研的人民大学博士研究生石嫣告诉本报记者,在村子里,除了向导没人会说英语,手机普及率几乎为零,只有村长家里才有手机和电话。“整个村庄还沉睡在封建时代当中,年轻人跑到城市里去了。”石嫣说。在美国中央情报局(CIA)的Factbook数据统计中,2011年印度的识字率是71%,虽然已较刚独立时有了极大提升,但知识阶层和普通民众之间仍存在知识鸿沟。

中国的学界也一度发现印度民主制度之中的矛盾—它实际上是民主制度之下的“一党专政”。B·辛格先生认为,这是印度的民主特色,而并非“专政”。在印度独立后的64年间,尼赫鲁-甘地家族领导的国大党执政时间长达52年。北大从事印度研究的硕士生张忞煜从另一个角度提到了以尼赫鲁为代表的印度北方政治集团:“当年尼赫鲁和国大党政治斗争的失败,在于他们仅仅了解德里那个小英语圈子的媒体在说什么,并且以为那就是印度人的想法。”印度的英语精英和印度普通阶层之间,存在巨大的差异。

城乡差异,南北文化和政治差异,阶层差异,这三种差异使印度的不少精英也为之焦虑。艾蓓在中国的7年时间里,一直为此感慨:“印度的城乡贫富差距和现代化差距……甚至比中国城乡之间的差距还要大很多。农村的落后不仅体现在基础设施和生活设备上,更体现在精神层面上。”当中国人观察印度的时候,他们的看法往往比印度本国人更加尖锐。“现在的年轻人……因为中国发展太快,在看印度的时候会带上一点轻视,甚至是蔑视。”马加力教授说。这种带有自我优越感的眼光,并不能让人客观地认识印度。

但不论是以优越感、西方尺度还是冷战思维看待印度,印度的崛起已经是不可阻挡的事实。“不管你愿不愿意,印度是个大国,你必须和它交往。”姜景奎教授说。他认为,印度将来的发展会超过俄罗斯。即使不能完全摒弃西方尺度和冷战思维,也要跳出这些习以为常的思维模式,正视印度作为发展中大国的角色,客观评判它在国际舞台上的各种表现。从这个意义上来说,我们对于印度的认识才刚刚起步。对中国和中国人而言,印度不仅是竞争对手与合作伙伴,也可以是一个充满混乱和生机的灵感,一面镜子—在这当中,我们既能看到我们的优点,也能看到自身惆怅的缺失。

『周末画报』撰文 吴梦启

原文链接:http://m.metroer.com/post/964/

php 用header下载文件

你希望客户要填完一份表格,然后就将网址指到该文件,这样客户才能下载,但如果你想做一个关于"网上购物"的电子商务网站,考虑安全问题,你不想用户直接复制网址下载该文件,笔者建议你使用PHP直接读取该实际文件然后下载的方法去做。程序如下:

一 下载当前服务器文件


$file_name = "info_check.exe";
$file_dir = "/public/www/download/";
if (!file_exists($file_dir . $file_name)) { //检查文件是否存在
echo "文件找不到";
exit;
} else {
$file = fopen($file_dir . $file_name,"r"); // 打开文件
// 输入文件标签
Header("Content-type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Accept-Length: ".filesize($file_dir . $file_name));
Header("Content-Disposition: attachment; filename=" . $file_name);
// 输出文件内容
echo fread($file,filesize($file_dir . $file_name));
fclose($file);
exit;}


二 下载远程文件
而如果文件路径是"http" 或者 "ftp" 网址的话,则源代码会有少许改变,程序如下:

$file_name = "info_check.exe";
$file_dir = "http://www.easycn.net/";
$file = @ fopen($file_dir . $file_name,"r");
if (!$file) {
echo "文件找不到";
} else {
Header("Content-type: application/octet-stream");
Header("Content-Disposition: attachment; filename=" . $file_name);
while (!feof ($file)) {
echo fread($file,50000);
}
fclose ($file);
}


这样就可以用PHP直接输出文件了。

三 一般情况只需要三条语句即可

header ('Content-type: application/'.$file_ext);
header ("Expires: 0");//可选
header ("Pragma: no-cache"); //可选
header ('Content-Disposition: attachment; filename='.$file_name.'');
header ("Content-Length: ".$file_size); //可选
readfile ($file_name);


原文链接:http://lhdeyx.blog.163.com/.../31819697200983010224884/

2011年8月11日星期四

基于web的城镇报发布程序

1. 类 WebCzb 用于整体管理
2. 创建对象 var app = new WebCzb(option); 所有选项以单独的js文件保存
3. 动态生成html代码 $('#new-czb').append(app.getUIHtml());
4. app.lastForcast 存储上一次的预报 并转化为本次预报(自动偏移时次)
5. app.nowForcast 存储本次预报并动态更新
6. app.postForcast 上传预报至省FTP和后台数据库
7. app.curForcastSpan 存储目前用户编辑的时段
8. 当用户切换时段时自动保存当前时段数据
9. json2.js将预报以json方式存储于后台
10.mysql数据库的创建
#创建数据库
CREATE DATABASE IF NOT EXISTS onlineWork;
USE onlineWork

/*
创建表
*/
CREATE TABLE IF NOT EXISTS
czbEdit (
postTime DATETIME NOT NULL PRIMARY KEY,
forcastBegin DATETIME NOT NULL,
forcastType ENUM('first','second','third','forth') NOT NULL,
forcastJson TEXT NOT NULL,
forcastText TEXT NOT NULL,
editName VARCHAR(20) );

---------------------------------------------------------
will do:

1. 切换日期时进行偏移处理[√]
2. 添加保存按钮仅保存不发布预报
3. 预报发布后重新请求最新的预报以供继续制作另一时次预报
4. 在页面右侧增加一些有用信息 气温风速降水历史平均状况注意事项等
5. 增加备注功能 对某一时次进行备注和提醒
6. 压缩JS代码
7. 美化页面UI 字体 margin等
8. 发布的同时提交个人预报 返还更清晰的成功或错误报告
9. 地图式编辑 多选式编辑
10. 切换时次后 返还上次信息前 应当处于不可编辑状态