阿当的博客











{十月 22, 2009}   [原创 js]自定义元素位置和大小

用YUI2做的一个小demo,实现了元素的drag和resize功能,自定义添加或减少元素,还可以将元素的位置,长宽等信息打印出来。

演示地址:www.adanghome.com/js_demo/1/

代码如下:

==========================================================
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN” “http://www.w3.org/TR/html4/strict.dtd”>
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title> 阿当制作</title>
<link type=”text/css” rel=”stylesheet” href=”http://assets.taobaocdn.com/app/tbs/css/public_1_0_0.css” />
<link type=”text/css” rel=”Stylesheet” href=”http://assets.taobaocdn.com/app/tbs/css/jf_express_1_0_0.css” />
<style type=”text/css”>
#wrapper{width:950px;margin:50px auto;}
#previewBox{float:left;display:inline;border:2px solid #666;width:750px;position:relative;height:420px;}
/*#previewBox .leftApp{filter:alpha(opacity=70); opacity: .7;}*/
#inputsWrapper{float:right;display:inline;width:140px;padding:10px;border:2px solid #e0e0de}
#inputsBox span,.leftApp{display:block;margin-top:5px;background:#f2f9ff;border:2px solid #98d6fd;height:22px;line-height:22px;text-align:center;color:#000;cursor:move;font-size:14px;}
p.leftApp,span.leftApp,div.leftApp{position:absolute;margin:0;width:136px;left:0;top:0}
.leftApp_closeBtn{position:absolute;right:15px;top:5px;cursor:pointer;}
#infoBox{padding:10px;margin-top:10px;border:3px solid #ccc;}
</style>
</head>
<body>
<div id=”wrapper”>
<div id=”previewBox”><p style=”width:200px;height:100px;left:50px;top:30px;” myname=”a”>发件人姓名</p><p myname=”b”>发件人地址</p></div>
<div id=”inputsWrapper”>
<h2>打印项 <img src=”http://assets.taobaocdn.com/app/tbs/img/jf_tip.gif” title=”拖动您需要打印的内容项放置到左侧模板中适合的位置。” /></h2>
<p id=”inputsBox”>
<span myname=”a”>发件人姓名</span>
<span myname=”b”>发件人电话</span>
<span myname=”c”>发件人公司</span>
<span myname=”d”>发件人地址</span>
<span myname=”e”>发件人邮编</span>
<span myname=”f”>收件人姓名</span>
<span myname=”g”>收件人电话</span>
<span myname=”h”>收件人地址</span>
<span myname=”i”>收件人邮编</span>
<span myname=”j”>货物清单</span>
<span myname=”k”>发货单号</span>
<span myname=”l”>自定义项</span>
</p>
</div>
<p><input type=”button” value=”显示模块信息” id=”btn” /><p>
<p id=”infoBox”></p>
</div>
<script type=”text/javascript” src=”http://assets.taobaocdn.com/yui/2.7.0/build/yuiloader/yuiloader-min.js”></script>
<script type=”text/javascript”>
var loader = new YAHOO.util.YUILoader({base:”http://assets.taobaocdn.com/yui/2.7.0/build/”});
loader.require(['dom', 'event', 'dragdrop','resize','animation']);
function init(){
var Y=YAHOO.lang,YE = YAHOO.util.Event,YD = YAHOO.util.Dom,YDC=YD.getElementsByClassName,YUC = YAHOO.util.Connect,JSON = YAHOO.lang.JSON,YR = YAHOO.util.Resize;
var CONFIG = {
leftAppContainer : “previewBox”,
rightAppContainer : “inputsBox”,
leftApp : “leftApp”
};

YAHOO.namespace(“express”);

//====================
// LeftApp类
//====================
YAHOO.express.LeftApp = function(id, config) {
this.manager = YD.get(config.manager);
this.el = YD.get(id);
this.el.mytext = this.el.innerHTML;
YAHOO.express.LeftApp.superclass.constructor.call(this, id, config);
YE.on(this.el,”click”,function(){
this.manager.maxAdd();
YD.setStyle(this.el,”zIndex”,this.manager.max);
},null,this);
this.Init();
};

YAHOO.extend(YAHOO.express.LeftApp, YR, {
Init : function(){
this.addCloseBtn();
},
addCloseBtn : function(){
var closeBtn = document.createElement(“img”);
closeBtn.src = “http://assets.taobaocdn.com/app/tbs/img/btn_del.gif”;
closeBtn.className=”leftApp_closeBtn”;
this.el.appendChild(closeBtn);
YE.on(closeBtn,”click”,function(){
this.el.parentNode.removeChild(this.el);
},null,this);
}
});

//=====================
//    LeftApp管理对象
//=====================
YAHOO.express.LeftAppManager = {
max:10,
init : function(){
var leftAppEls = YDC(“leftApp”,”*”,”previewBox”);
for(var i=0,n=leftAppEls.length;i<n;i++){
this.addMod(leftAppEls[i]);
}
},
addMod : function(el){
new YAHOO.express.LeftApp(el,{
handles: ‘all’,
knobHandles: true,
hover:true,
proxy: true,
draggable: true,
manager:this
});
},
maxAdd : function(){
this.max++;
},
getAppsInfo : function(imgInfo){
var leftAppEls = YDC(“leftApp”,”*”,”previewBox”) , wid = 750 , hei = 420 , info = [] , node;
for(var i=0,n=leftAppEls.length;i<n;i++){
node = leftAppEls[i];
info.push(‘{“width”:”‘+ Math.round((node.offsetWidth – 4)*100/wid) + ‘%”,”height”:”‘ + Math.round((node.offsetHeight – 4)*100/hei) + ‘%”,”left”:”‘ + (/%$/.test(YD.getStyle(node,”left”)) ? YD.getStyle(node,”left”) : Math.round(parseInt(YD.getStyle(node,”left”),10)*100/wid) + ‘%’) + ‘”,”top”:”‘ + (/%$/.test(YD.getStyle(node,”top”)) ? YD.getStyle(node,”top”) : Math.round(parseInt(YD.getStyle(node,”top”),10)*100/hei) + ‘%’) + ‘”,”name”:”‘+ (node.myname ? node.myname : node.getAttribute(“myname”))+’”,”text”:”‘+(node.mytext ? node.mytext : node.getAttribute(“mytext”))+’”}’);
}
info = info.join(“,”);
info = “[" + info + "]“;
return info;
}
}

//====================
// RightApp类
//====================
YAHOO.express.RightApp = function(id, sGroup, config) {
YAHOO.express.RightApp.superclass.constructor.call(this, id, sGroup, config);
var el = this.getDragEl();
YD.setStyle(el, “opacity”, 0.67);
};

YAHOO.extend(YAHOO.express.RightApp, YAHOO.util.DDProxy, {
startDrag: function(x, y) {
var dragEl = this.getDragEl();
var clickEl = this.getEl();
YD.setStyle(clickEl, “visibility”, “hidden”);
dragEl.innerHTML = clickEl.innerHTML;
YD.setStyle(dragEl, “color”, YD.getStyle(clickEl, “color”));
YD.setStyle(dragEl, “backgroundColor”, YD.getStyle(clickEl, “backgroundColor”));
YD.setStyle(dragEl, “fontSize”, YD.getStyle(clickEl, “fontSize”));
YD.setStyle(dragEl, “lineHeight”, YD.getStyle(clickEl, “lineHeight”));
YD.setStyle(dragEl, “textAlign”, YD.getStyle(clickEl, “textAlign”));
YD.setStyle(dragEl, “border”, “2px solid #98D6FD”);
},
endDrag: function(e) {
var srcEl = this.getEl();
var proxy = this.getDragEl();
YD.setStyle(proxy, “visibility”, “”);
if(YD.getRegion(CONFIG.leftAppContainer).contains(YD.getRegion(proxy))){
var newNode = document.createElement(“p”);
newNode.innerHTML = srcEl.innerHTML;
newNode.myname = srcEl.getAttribute(“myname”);
YD.get(CONFIG.leftAppContainer).appendChild(newNode);
YD.addClass(newNode,CONFIG.leftApp);
YD.setXY(newNode,YD.getXY(proxy));
YAHOO.express.LeftAppManager.addMod(newNode);
YD.setStyle(proxy, “visibility”, “hidden”);
YD.setStyle(srcEl, “visibility”, “”);
} else {
var a = new YAHOO.util.Motion(
proxy, {
points: {
to: YD.getXY(srcEl)
}
},
0.2,
YAHOO.util.Easing.easeOut
)
a.onComplete.subscribe(function() {
YD.setStyle(proxy, “visibility”, “hidden”);
YD.setStyle(srcEl, “visibility”, “”);
});
a.animate();
}
}
});

//=====================
//    RightApp管理对象
//=====================
YAHOO.express.RightAppManager = {
init : function(){
var rightAppEls = YD.get(CONFIG.rightAppContainer).getElementsByTagName(“span”);
for(var i=0,n=rightAppEls.length;i<n;i++){
new YAHOO.express.RightApp(rightAppEls[i],”right”);
}
}
}

//==================
//    程序初始化
//==================
function init(){
YAHOO.express.LeftAppManager.init();
YAHOO.express.RightAppManager.init();
YE.on(“btn”,”click”,function(){
YD.get(“infoBox”).innerHTML = YAHOO.express.LeftAppManager.getAppsInfo();
});
};
init();
}
</script>
<script type=”text/javascript”>
if(typeof init == “function”){
loader.onSuccess = init;
}
loader.insert();
</script>
</body>
</html>



{十月 22, 2009}   验证中英文,数字和下划线中划线

    遇到个正则的问题,要求验证中英文,数字和下划线中划线可以通过,其它字符不能通过。

     英文和数字好说,\w,下划线和中划线也好说,-_,然后是中文判断,\u0391-\uFFE5。于是我写了这个正则:

    if(/[^\w_-\u0391-\uFFE5]/.test(str)),结果发现英文数字下划线和中划线都可以通过,唯独中文不能通过!很奇怪。

    换了下顺序,将中文的判断放在了前面,如下if(/[^\u0391-\uFFE5\w_-]/.test(str)就正常了。奇怪了。



{十月 14, 2009}   转同事博客一则,随感
还在雅虎时的同事,张克军,个性非常好的一个人,低调、害羞、专注、技术牛人,人格魅力巨大,要命的是居然还帅气得要死——老天太不公平了。今天又再翻了下他之前的一篇博客,地址如下:hikejun.com/blog/ 非常有感触,推荐各位前端同行也都看一下。

前端工程师,别人眼里写javascript,切页面和写css的人。在国内的职业生命力不强,我敢说在大部分公司干这行超过三十的太少了,多数人会提前往后端转或往管理转。并且在大部分公司里干这行的收入都偏低,属于撅屁股干活的。

以上事实我想大家都认同。这样的环境对前端工程师的流动是致命的,公司对这个职位的定级就是几千块钱,你干不干,不干,别的公司也一样。干,要提薪 就得往管理上爬。操!往往几年下来想想你积累到什么了,学到什么了,公司不成了还得考虑找工作。是继续干这行,还是改行,这时候是最痛苦的。刚毕业的,可 以挥霍几年,最终还是会面对这样的问题。

说得非常对。我自己也做过服务器端开发,我很清楚前端和服务器端的侧重点在哪儿。前端因为不用考虑数据库,而且没有跨页面的通信,所以基本上不需要服务器端那么重的“框架”的概念和大局观,基本上前端的应用是一个一个非常零散的,门槛很低,加上web早期设计编程不分的“网页设计师”的职位,让前端更像是一个打杂的!事实上,随着web2.0的兴起,前端的重要性越来越突出,css布局只是一小部分,更重要的是前端“框架”概念的产生,以及DHTML将编程的“创意”发挥到极致!前端开发已经绝不仅仅是“打杂”了,仍然报着“网页设计师”的角度去看待前端,对于前端开发工程师们来说,是非常不公平的.事实上,一些复杂的前端应用,比如web game和mashup,整个技术方案其实都是前端提供出来的,服务器端更多的只是进行着数据持久性的工作,在数据库中保存和读取数据,至于数据如何展现,从前端到服务器端的数据流向是如何的,全都是前端工程师的任务。

大型网站,大型前端应用,团队合作是非常重要的,前端的可维护性已经不容忽视!前端也需要和服务器端一样,建立起分层的概念,底层,公平组件层,应用层,css和js都需要进行分层。前端框架对于可维护性,对于开发和维护的成本起着至关重要的作用!还把我们当“网页设计师”,谁能在这样的不理解中一直高高兴兴地干下去?“这样的环境对前端工程师的流动是致命的”!

我很反感那些自认为牛逼的人,因为技术是不断向前发展的,不关注技术趋势,两三年后,你掌握的那些玩意就彻底过时了,或者误入歧途还在自淫自乐,最后发现自己研究的那些玩意没有任何价值。

我也讨厌,动辄犀牛书前犀牛书后的,楞是死钻一些生僻的知识点,然后自以为牛逼,对于可维护性,对于快速开发这些真正有用的东西却不去进行深入研究,只知道卖弄小技巧,无异于会写五种“茴”字的孔乙己!”读…读书人的事“,读你的书去吧。

这么多年了,我本可以混个小经理干干,发号施令安排安排工作,可这样一点技术含量没有,我打心里不愿意这样,有什么劲。但在国内好像不是管理者,你的意见就得不到重视。

这点最他妈操蛋了!国内环境就他妈知道重管理不重技术,说是管理和技术两条线发展,可绝大多数国内公司其实并不真正重视技术,尊重技术,这样的环境怎么培养科学家?怎么培养专心攻技术的人才?不然怎么说国内不像国外那样,有十几二十年开发经验的工程师呢,你能怪国内的工程师不争气吗?这样的环境能他妈让工程师做十几二十年吗?

在D2会传播最流行的前端技术和交流开发经验,来自各个公司的工程师聚在一起不只是相互寒暄,也不是制造个人影响力,回去之后都有责任在自己公司内部推广正确的技术和正确的工作方法。

这点也非常同意,现在搞个技术论坛也基本上没多少分享,不是做广告就是制造个人影响力,我们需要的是真正喜欢技术的人做一些分享,轻轻松松的一个party,不是广告,更不是一些喜欢制造个人影响力的舞台。我非常讨厌那种高调得不得了的人,我一直认为中国人最丑陋的一点就是论资排辈和拉帮结派,这是最扼杀人才也是最限制科技进步的做法!在中国这个以前一直重文轻理的国家,文人相轻已经是传统陋习了!文还是个比较抽象的东西,你忽悠也就忽悠吧,你说他好他就能好,说他不好就能不好,我一直以为现在我们重科技了,像技术这种东西,完全就不是可以忽悠的了,行就是行,不行就是不行,在这一行是不可能拉帮结派论资排辈了,可是工作几年下来,发现并不是这样。在技术这个行业,这个几乎不可能靠忽悠吃饭的领域,中国人的传统美德又再次渗入进来,我真是小看了国人的力量。在这一行里,依然有着传统陋习,理人相轻,拉帮结派。试问这样的一个环境,如何能够让中国的技术实力得到快速提高!中国的工程师们是在怎么一个恶劣的环境中生长啊,对于真正喜爱技术,又希望成长科学家式的技术人才的工程师,更是怎么一样折磨的环境!

来雅虎的时候,我跟hr说,我愿意等,等到大环境变好的那天。现在我仍然只能说,我愿意等,因为,我也只能等了。



{十月 13, 2009}   写的某个网站的脚本
记录一下,一些习惯用法已经不想改变了,直接拿出来copy,所以mark一下。

脚本地址:http://assets.taobaocdn.com/app/tbs/js/manage_1_0_7.js



{十月 10, 2009}   formEl.submit is not a function的原因

   今天遇到点小意外,在调用一个form节点的submit方法时,提示submit is not a function,检查了半天,实在想不出来是什么原因,最后我想,既然它不是function,那么好吧,你告诉我它是什么吧,把submit打印出来了,说是inputHTMLElement。。。

    原来是因为给submit按钮取了“submit”这个name,formEl.submit没有指向formEl的submit方法,而是指向了自己的表单项。。。汗,不要给你的表单项乱取名啊,搞不好就覆盖form节点的方法或属性了。。。




about

打造高品质的前端代码

pages
categories
archive
et cetera