Currently Browsing
前端
span元素固定宽度的解决办法
- 21 八月 //
- Posted in 前端 //
- Tags :
- No Comment
span设置width属性在ff和id中都无效,为啥呢?
通过查询资料,发现可以将其改成block性质的元素,并设置float来解决,但这样有时候会造成文字错位,下面的一行代码可以解决这个问题
span { display:-moz-inline-box; display:inline-block; width:150px;}
《WEB视觉设计》读书笔记
- 19 六月 //
- Posted in 前端 //
- Tags :
- No Comment
有关‘’帮助‘’
1 如果页面中已经具有良好的交互设计,用户可以很流畅地完成任务,那么臃肿而复杂的帮助系统其实是根本没有必要存在的,因为用户只有在遇到自己无法解决的问题时才会求助于帮助系统——在耗费掉用户耐性的同时,也说明我们做的并不优秀。所以,把精力放在网站的易用性改善上要更有意义
2 ‘’概率事件‘’与“可能性事件”
首先要甄别问题属于哪种事件,过多考虑可能性事件,一方面浪费了太多时间来处理比例非常小的特别情况,另一方面过多的信息反而对用户的思考产生干扰。由此,如果一个问题属于概率事件,那么它一定是需要改进的,让它的交互过程更完美甚至消失在概率事件列表中;而对于可能性事件,给出友好的提示引导它回到“正常”的信息格式上吧
Yahoo开发技术文章:Best Practices for Speeding Up Your Web Site(网站访问提速最佳实践)
- 5 一月 //
- Posted in 前端 //
- Tags : 网站性能优化, 网站访问速度, 网页加载速度
- No Comment
这个文章是俺开着金山词霸翻译的,有不妥之处请指正。。。
Best Practices for Speeding Up Your Web Site
网站访问提速最佳实践
The Exceptional Performance team has identified a number of best practices for making web pages fast. The list includes 34 best practices divided into 7 categories.
感谢我们最杰出的团队!他们已经总结出了很多关于网站访问提速的经验,这个列表分为7个类别,总共包括34条准则。
Filter by category: 按分类查看
- Content 内容
- Server 服务器
- Cookie cookie
- CSS CSS
- Javascript javascript脚本
- Images 图片
- Mobile 移动设备?
- All 所有
Continue Reading this Entry
《web开发中的可用性和用户体验》书摘
- 27 十二月 //
- Posted in 产品与项目, 前端 //
- Tags : accessible, serviceability, user experience, 可用性, 用户体验
- No Comment
这本书从图书馆借的,书非借不能读也。断断续续总算看完了,因为本书实在很不错,建议大家有银子的,都去买一本仔细读读,内容很丰富、语言很幽默,还有大量的插图保证你不会疲倦。我个人因为太穷,只能进行书摘,将来发财了,一定买一本,衷心的感谢作者——你对我的思维真的影响很大。
首先放出的是书摘,评论和笔记补充稍后再补充。
参与IxEdit汉化项目的一些记录
- 18 十二月 //
- Posted in 前端 //
- Tags : ixedit
- No Comment
“
实在没有什么语言,能表达我看到这个IxEdit JavaScript开发工具时的兴奋。举个例子来说就是:你已经在沙漠里徒步走了两三天了,中间没有喝任何水。就在你就要虚脱,以为自己快要完蛋的时候,突然看到一颗树,树下铺着一张绿色的地摊,地毯上躺着一个漂亮的裸女,裸女怀里抱着满满的一瓶水。而且还充满诱惑的想你招着手,如同路边美容院的小妞。
为了让你能体会到这种牛叉的感觉,我建议你下看一下这边的这段,我刚刚录制的一段视频。这段视频简单的讲解了,IxEdit是什么玩意,它能做什么,以及简单的教程。
”
我第一次看到这段话的时候,深深地为作者那牛叉的语言所迷惑,进而寻找他在捣鼓的这个工具——IxEdit。
不多说了,你们自己看他的原文吧,男人请屏住呼吸,女人请稳定情绪。
http://www.cnblogs.com/JustinYoung/archive/2009/11/18/ixedit.html
另有:IxEdit组:http://space.cnblogs.com/group/ixedit/
为了能够沾点这个作者的灵气,我以迅雷不及掩耳盗铃响叮当之势,有幸参加了这个IxEdit的一小小小小小部分汉化工作,记录如下,可做炫耀。
‘inputLabelResizableContainment’:'【t054】不超过父元素’,
‘inputLabelDragAxes’:'【t055】轴’,
‘inputLabelSortableRevert’:'【t056】插入时有动画效果’,
‘inputLabelAccordionAutoHeight’:'【t057】固定高度’,
‘inputLabelAccordionCollapsible’:'【t058】允许关闭全部’,
‘inputLabelTabsSelected’:'【t059】默认tab’,
‘inputLabelTabsSelectedAnnotation’:'【t060】(默认从1开始,0表示没有默认tab.)’,
‘inputLabelTabsFade’:'【t061】渐隐’,
‘inputLabelTabsSlide’:'【t062】滑动’,
‘inputLabelBlockSwitchFade’:'【t063】渐隐’,
‘inputLabelBlockSwitchSlide’:'【t064】滑动’,
‘inputLabelDatePickerFormat’:'【t065】格式’,
‘inputLabelDatePickerHasButton’:'【t066】包含日期选择按钮’,
‘inputLabelDatePickerShowMonthAfterYear’:'【t067】在年份后显示月份’,
‘inputLabelLoadURL’:'【t068】URL’,
‘inputLabelLoadURLAnnotation’:'【t069】注意: 您请求的远程文件必须和当前页面在同一个域下.’,
‘inputLabelDialogWidth’:'【t070】宽度’,
‘inputLabelDialogHeight’:'【t071】高度’,
‘inputLabelDialogLeft’:'【t072】距左边距离’,
‘inputLabelDialogTop’:'【t073】距顶部距离’,
‘inputLabelDialogDraggable’:'【t074】可拖动’,
‘inputLabelDialogButtons’:'【t075】包含按钮’,
‘inputLabelDialogLabel’:'【t076】标签’,
‘inputLabelDialogId’:'【t077】ID’,
‘inputLabelDialogLeftAnnotation’:'【t078】(空表示居中,负值表示距右边距离.)’,
‘inputLabelDialogTopAnnotation’:'【t079】(空表示居中,负值表示距底边距离.)’,
‘inputLabelJumpUrl’:'【t080】URL’,
‘eventLoad’:'【t081】页面加载’,
‘eventUnload’:'【t082】页面关闭’,
‘eventChange’:'【t083】状态变化’,
‘eventClick’:'【t084】点击’,
‘eventDblClick’:'【t085】双击’,
‘eventDrop’:'【t086】接收拖动’,
‘eventError’:'【t087】错误’,
‘eventFocus’:'【t088】得到焦点’,
‘eventFocusOut’:'【t089】失去焦点’,
‘eventKeyDown’:'【t090】键按下’,
‘eventKeyPress’:'【t091】按键’,
‘eventKeyUp’:'【t092】键弹起’,
‘eventMouseDown’:'【t093】鼠标被按下’,
‘eventMouseMove’:'【t094】鼠标移动’,
‘eventMouseOut’:'【t095】鼠标移出’,
‘eventMouseOver’:'【t096】鼠标滑过’,
‘eventMouseUp’:'【t097】鼠标弹起’,
‘eventResize’:'【t098】调整大小’,
‘eventScroll’:'【t099】滚动条滚动’,
‘eventSelect’:'【t100】选中’,
‘eventSubmit’:'【t101】提交’,
‘insertHTMLOverwrite’:'【t102】重写选中元素的内部HTML’,
‘insertHTMLInsideBottom’:'【t103】在选中元素内的底部插入HTML’,
‘insertHTMLInsideTop’:'【t104】在选中元素内的顶部插入HTML’,
‘insertHTMLAfter’:'【t105】在选中元素之前插入HTML’,
‘insertHTMLBefore’:'【t106】在选中元素之后插入HTML’,
‘dragAxesX’:'【t107】X’,
‘dragAxesY’:'【t108】Y’,
‘dragAxesXY’:'【t109】X 和 Y’,
‘mainButtonNew’:'【t111】新建’,
‘mainButtonDuplicate’:'【t112】复制’,
‘mainButtonDelete’:'【t113】删除’,
‘mainButtonReload’:'【t114】刷新’,
‘mainButtonEdit’:'【t115】编辑’,
‘mainButtonCancel’:'【t116】取消’,
‘mainButtonReset’:'【t117】撤销&还原’,
‘mainButtonDoneReload’:'【t118】完成并刷新’,
‘mainButtonDone’:'【t119】完成’,
‘mainButtonClose’:'【t120】关闭’,
‘mainButtonImport’:'【t121】导入’,
‘condTypeIf’:'【t122】匹配’,
‘condTypeIfNot’:'【t123】不匹配’,
‘of’:'【t124】of’,
‘listHeaderCheck’:'【t125】 ‘,
‘listHeaderEvent’:'【t126】动作事件’,
‘listHeaderTrigger’:'【t127】发出动作元素’,
‘listHeaderTarget’:'【t128】接受动作元素’,
‘listHeaderCommand’:'【t129】反馈命令’,
‘listHeaderComment’:'【t130】备注’,
‘utilityAbout’:'【t131】关于 ‘ + ixedit.appName,
‘utilityDeploy’:'【t132】部署’,
‘utilityExport’:'【t133】导出’,
‘utilityImport’:'【t134】导入’,
‘utilityShowJson’:'【t135】显示 JSON’,
‘utilityShowDb’:'【t136】显示数据库记录’,
‘utilityDiscardDb’:'【t137】放弃数据表.’,
‘commandHelp’:'【t138】命令帮助’,
‘messageNoCondition’:'【t139】当前没有条件. 点击 \"+\" 按钮增加一个.’,
‘messageCommndNotSupported’:'【t140】命令现在不可编辑.’,
‘none’:'【t141】无’,
‘normal’:'【t142】普通’,
‘linear’:'【t143】无’,
‘add’:'【t144】添加’,
‘remove’:'【t145】移除’,
‘alertDeletingItem1′:’【t146】你确定要删除此项?’,
‘alertDeletingItem2′:’【t147】你确定要删除所有 ‘,
‘alertDeletingItem3′:’【t148】 这些项?’,
‘alertloadDemo’:'【t149】某些交互已经被嵌入此页面,你确定要加载它们吗?’,
‘version’:'【t150】版本’,
使用cookies控制弹出窗口每ip只显示一次
- 14 十二月 //
- Posted in 前端 //
- Tags : cookie, 弹出窗口
- No Comment
<script type="text/javascript">
function getCookie(s){try{var v=”;var posName=document.cookie.indexOf(escape(s)+’=');if (posName==-1) return ”;var p=posName+(escape(s)+’=').length;var p1=document.cookie.indexOf(‘;’,p);return unescape(document.cookie.substring(p,(p1==-1)?99999:p1));}catch(e){}}
function setCookie(nm,vu,tm){var expires=new Date();expires.setTime(expires.getTime()+tm*1000);document.cookie=escape(nm)+’='+escape(vu)+’; expires=’+expires.toGMTString()+’; path=/;’;}
if(!getCookie(‘ip’)){setCookie(‘ip’,1,24*60*60);window.open("http://www.xxxxxx.com/announce.html","","width=600,height=400");}
</script>
(转)js数组的部分操作及示例
- 1 十二月 //
- Posted in 前端 //
- Tags : javascript 数组
- No Comment
本文介绍如下几个方面的内容:
1.如何创建数组
2.如何对数组进行操作(添加,删除,读取)
3.数组常见方法和属性
如何创建一个数组,一般地根据初始化设定简单分为3种:
1.单纯创建数组:
var arr=new Array();
要点:用new关键字创建数组对象Array(),Array()对象是一个本地类,可以用new创建一个对象后使用
2.创建数组的同时规定数组大小:
var arr=new Array(10);//这里就创建了一个初始化大小为10的数组
注意:当使用数组大小操作初始化大小时,数组会自动被撑大,不会像C语言那样发生错误.动态增长是js数组的一个性质.另外,js中支持最大数组长度为
4294967295
3.直接初始化:
var arr=new Array(”love”,”hate”,”pain”);//这里就直接初始化了数组
uchome的ajaxget函数传递中文值的问题及解决
- 1 十二月 //
- Posted in 前端 //
- Tags : uchome ajaxget
- No Comment
uchome中有一个方便的ajaxget函数,用于向某段php代码传递若干个值进行处理,然后将得到的结果显示到指定的html元素中。
类似:
ajaxget(‘custom.php?op=getinfo&countryname=’ + countryname, ‘tdprovinces’);
第一个参数(蓝色)是表示进行后台处理的url地址,第二个参数(红色)表示将处理返回结果显示到id=tdprovinces的元素中去(我这里是一个单元格)。
环境:
mysql 5.x.xx gbk
浏览器 firefox 3.5
现象是:当counrtryname的值是数字或者英文的时候,能够正常返回结果并显示到中去,但是一旦counrtryname的值为中文的时候,php运行没有报错,没有返回任何字符串。
首先排查是否代码错误(因为ajaxget这里如果代码错误是看不到报错的,只表现为无返回结果),于是单独提出这段查询代码运行(新写一个php 文件,手工给定变量的值$provincename = ‘北京’),运行能够得到结果,说明代码无错,是ajax传输过程中的字符编码问题。
先看看传递过来后变成什么样子了吧,于是在php页面里测试输出$_GET['countryname'],发现是一段%6E%…..类似的,汗(IE应该会显示一段utf-8版的乱码)
明白了,应该是sql语句中的 cname = {$countryname}这里,因为$countryname不是一个合法的gbk字符串(mysql能识别的GBK格式——’北京’),所以导致查找不到任何记录。
查资料,提示是需要将url进行编码,于是改成
ajaxget(encodeURI(encodeURI(’tigtag_custom.php?op=getschools&provincename=’ + provincename)), ‘tdschools’);
这次还是不行,测试输出仍然是一段代码“%5E%xxxxxx”,甚至用escape也不行,估计ajaxget函数已经把这个操作封装了。再进行一次是多此一举。
汗,最后想到,是不是需要在php代码里用iconv将ajax传递过来的字符串转换成gbk的呢?因为ajax好像默认是传递utf-8格式的。
好,加上一段 $provincename = iconv(”UTF-8″,”GBK”,$provincename); 试试看,强制地UTF-8转GBK
再次输出$provincename测试,已经是正常的汉字“北京”了。
同时mysql也能认出来并正常查询了,查询结果显示也没问题。
解决。看来ajax的编码的问题,要从几个地方考虑啊,1.来源地 2.url是否需要转码 3.数据库的编码 4……
====================================
最新补充:
我本地的测试环境是 WAMP;需要进行iconv,而在linux服务器下,反而无法输出$provincename,取消iconv操作后一切正常。
百思不得其解!
ajax入门——第一个范例
- 1 十二月 //
- Posted in 前端 //
- Tags : ajax 范例 入门
- No Comment
在写关于mssql数据自由调用插件的时候,需要用到选择一个数据库名,然后无刷新显示其下所有的数据表名,然后选择一个表名,又会显示其下所有的字段名。所以用ajax写了一个简单的范例,里面有些基础知识,记录下来分享一下。
前台静态页如下:
有一个选择数据库的<select>,已经初始了几个<option>,还有表选择框(暂时是空的)字段列表区域(暂时也是空的),以及一个选择排序字段的选择框,假设他们的格式如下:
【请选择数据库:】(当然这里可以使用模板技术中的loop来调用数组内容填充option)
<select name=”database” id=”database” onchange=”gettable()”>
<option value=”db1″>db1</option>
<option value=”db2″>db2</option>
<option value=”db3″>db3</option>
</select>
【请选择表:】
<select name=’table’ id=’table’ onChange=’getfield()’></select>
【字段列表】
<ul id=”showfield” style=”width:500px;”></ul>
【选择按哪个字段排序】/*注意这里使用的是div而没有默认加入<select>,是因为chekbox和select的格式不同所致,因为要用到js的innerHTML功能,我也不知道select表单元素是否有innerHTML功能(后来补记:select表单元素有使用js 动态添加option的功能,所以这里可以改进为更容易理解的方式)*/
<div id=”showorderby”></div>
好了,现在需要写函数来对应他们各自的动作了。
<script type=”text/javascript”>
//这里是初始化一个ajax对象
var xmlHttp = false;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
try {
xmlHttp = new ActiveXObject(”Msxml2.XMLHTTP”);
} catch (e) {
try {
xmlHttp = new ActiveXObject(”Microsoft.XMLHTTP”);
} catch (e2) {
xmlHttp = false;
}
}
@end @*/
if (!xmlHttp && typeof XMLHttpRequest != ‘undefined’) {
xmlHttp = new XMLHttpRequest();
}
/*绑定在数据库选择下拉框上的onchange()事件,获得所有表,其中mssql_getinfo.php是后台进行数据处理的文件,传递database的值给它,但它处理完数据后,调用updatetable函数进行下一步操作*/
function gettable() {
var database = document.getElementById(”database”).value;
if ((database == null) || (database == “”)) return;
var url = “http://localhost/bbs/plugins/mssql/mssql_getinfo.php?msdbname=” + escape(database);
//alert(url);
xmlHttp.open(”GET”, url, true);
xmlHttp.onreadystatechange = updatetable;
xmlHttp.send(null);
}
//绑定在表选择下拉框上的onchange()事件,获得所有字段信息,并将这些信息交给updatefield函数进行处理
function getfield() {
var table = document.getElementById(”table”).value;
if ((table == null) || (table == “”)) return;
var url = “http://localhost/bbs/plugins/mssql/mssql_getinfo.php?mstablename=” + escape(table);
//alert(url);
xmlHttp.open(”GET”, url, true);
xmlHttp.onreadystatechange = updatefield;
xmlHttp.send(null);
}
//对返回的所有表的信息进行处理,这里是调用filltable函数,对返回的responseText进行处理
function updatetable() {
if (xmlHttp.readyState == 4) {
var response = xmlHttp.responseText;
filltable(response);
}
}
//filetable函数,仔细看,这里涉及到动态向<select>元素添加<option>的方法
function filltable(string){
var tableArr = new Array();
//alert(string);
tableArr = string.split(”|”);//这里类似table1|table2|table3|table4……,将他们分割开来存入数组
for(i = 0; i<tableArr.length; i++){
with(document.formAddSql.table){
length = tableArr.length;
options[i].text = tableArr[i];
options[i].value = tableArr[i];
}
}
}
/* 对返回的所有字段的信息进行处理,这里进行了字符串分割等操作,主要是因为我们后台的php文件返回的数据是一个字符串形式的,而这里要分两种格式显示,一种是checkbox(选出的字段-多选),一种是option(选择排序的字段-单选),等下看看后台处理的php文件你就会理解了。*/
function updatefield() {
if (xmlHttp.readyState == 4) {
var response = xmlHttp.responseText;
res = new Array();
res = response.split(”|”);
document.getElementById(”showfield”).innerHTML = res[0];
strorderby = “<select name=’orderby’ onchange=’chooseorderby()’>” + res[1] + “</select>”;
document.getElementById(”showorderby”).innerHTML = strorderby;
}
}
</script>
好了,下面就是最重要的后台处理了,这里的几个数组$mssql_list_db、 $mssql_list_table、$mssql_list 是分别从几个缓存文件中读取的数组,表示“所有可用数据库名”、“所有可用数据库与其数据表的对应”、“数据库-数据表-字段的对应”,具体我就不写了,
$mssql_list_db = mssql_cache_read(”i”,DISCUZ_ROOT.’/forumdata/cache/mssql_list_db.cache.php’);
$mssql_list_table = mssql_cache_read(”i”,DISCUZ_ROOT.’/forumdata/cache/mssql_list_table.cache.php’);
$mssql_list = mssql_cache_read(”i”,DISCUZ_ROOT.’/forumdata/cache/mssql_list.cache.php’);
//返回某个数据库对应的所有数据表
if(!empty($_GET['msdbname'])){
$msdbname = $_GET['msdbname'];
foreach($mssql_list_table as $k=>$v){
if($msdbname == $k){
$string = “”;
foreach($mssql_list_table[$k] as $key=>$value){
$string .= “|$value”;
}
echo $string;
}
}
}
//通过循环读取表-字段对应表得到两个字符串,string1返回给多选的checkbox字段列表,string2返回给单选的<select><option>…..
if(!empty($_GET['mstablename'])){
$mstablename = $_GET['mstablename'];
foreach($mssql_list as $k=>$v){
foreach($v as $tk=>$tv){
if($mstablename == $tk){
$string = ”;
foreach($mssql_list[$k][$tk] as $key=>$value){
$string1 .= “<li><input name=fields type=checkbox value=$value>$value</input></li>”;
$string2 .= “<option value=$value>$value</option>”;
}
echo $string1.”|”.$string2.”|”;
}
}
}
}
写得有点乱,主要是因为涉及到了几个文件,还有因为数据库字段太多没有写出来,下次有时间整理一个简单点的数据库例子再修改一下这篇文章吧
(转)247条Web可用性指南
- 24 十一月 //
- Posted in 前端 //
- Tags : web可用性
- No Comment
247条Web可用性指南,你可能会觉得太多。但其实要实真正实现Web的可用性,仅仅通过247条简单的指引是远远不够的。但这些简单的一句话指导方针,可以更便于你的记忆,像便签一样随时提醒着你。
导航:
首页可用性设计
- 首页元素要清晰的关注用户的关键任务(避免“增加功能倾向(featuritis)”)
- 如果网站比较大,那么首页应包含搜索输入框
- 首页要十分清楚的提供产品(内容)分类
- 在首页或首页内一次点击展示有用的内容
- 信息展示时应当是简单的、自然的、符合逻辑顺序的
- 在首页展示真实网站内容的优秀示例
- 首页上的链接以最重要的关键词作为起始(例如:“Sun holidays”而不是“Holidays in the sun”)
- 在首页提供一个最近的特色项列表,并提供存档内容的链接
- 首页导航不要过度格式化(修饰),确保用户不会把它误认为广告
- 在首页清晰的声明价值取向(例如一个标志性的口号或欢迎语)
- 在首页包含有意义的图案设计,而非无关的剪贴画或绘画作品
- 导航选项按逻辑性或用户导向方式排序(把次要的公司信息放在底部)
- 首页标题(title)可以为诸如google等搜索引擎提供良好可见度
- 所有公司相关信息安排在一个显著区域(例如:“关于我们(About Us)”)
- 用户可以了解到价值取向
- 一看到首页,第一次访问的人就知道从何处开始
- 在首页展示出所有主要的操作选项
- 首页拥有一个易记的URL
- 首页需经过专业设计,以给用户良好的第一印象
- 首页的设计要能激发用户探索站点的兴趣
- 首页就要像一个首页,不能让用户把它与二级页面混淆


