js 小贴士一星期合集


Posted in Javascript onApril 07, 2010

1.今天聊聊自定义事件
事件大家都知道,但在很多的框架中都有自定义事件的实现,我写了个简单的,跟大家分享一下,

<script> 
var cusEvent = function(){ 
var cache = {}; 
return { 
addEvent:function(type,fn){ 
cache[type]?cache[type].push(fn):(cache[type]=[fn]); 
}, 
removeEvent:function(type,fn){ 
if(cache[type]){ 
if(fn){ 
for(var i=0,ci;ci=cache[type][i];i++){ 
ci===fn&&cache[type].splice(i,1); 
} 
}else{ 
delete cache[type]; 
} 
} 
}, 
//e可以是个自定义的对象,也可以是字符串 
fire:function(e){ 
if(typeof e =='string'){ 
e = {type:e} 
}; 
var t = cache[e.type]; 
if(t){ 
for(var i=0,ci;ci=t[i];i++){ 
//e可以有自己的target,没有就用this代替 
ci.call(e.target||this,e) 
} 
} 
} 
} 
}() 
//使用 
cusEvent.addEvent('start',function(e){alert(e.type)}) 
cusEvent.addEvent('start',function(e){alert(e.type+"1")}) 
cusEvent.fire('start') 
cusEvent.removeEvent('start') 
</script>

2. innerHTML大家都用过,肥肠好使,但在ie下有些时候却不行,比如select如果你想在select上用option就是不行的,因为select的innerHTML是只读的,当然除了这个还有像tr,table等等,我写了个小方法,来兼容innerHTML在ie下对这些元素的使用,希望给大家 点启示
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<html> 
<head> 
<title>Untitled</title> 
</head> 
<body> 
Hello World! 
<select id="aa"><option>sdfsdf</option><option>sdfsdf</option></select> 
<input onclick="html(document.getElementById('aa'),'<option>change1</option><option>change</option>')" type="button" value="use innerHTML"/> 
</body> 
</html> 
<script> 
var html = function(){ 
var div = document.createElement('div'); 
return document.all?function(pN,h){ 
div.innerHTML = '<select>'+h+'</select>'; 
for(var i=0,ci;ci=pN.firstChild;) pN.removeChild(ci) 
debugger; 
for(;ci=div.firstChild.firstChild;) pN.appendChild(ci); 
}:function(pN,h){ 
pN.innerHTML = h; 
} 
}() 
</script>

原理就是在ie中,我用个临时元素div来跳过innerHTML不能用的问题,可以再写点负载点,就是判断传进来的是tr,table的话用相应的元素套用,
这个方法也可以解决select中option不好添加修改的问题
3.
在js中全局g-add变量是恶魔,是绝对建议不要使用的,但有的时候,可能要写个静态变量,随着函数的执行而累计比如
var a = 1; 
function fn(){ 
alert(++a); 
} 
fn()

fn()
想随着函数的执行而改变
好的写法可以这样
<script> 
var fn = function(){ 
var a = 1; 
return function(){ 
alert(++a); 
} 
}() 
fn(); 
fn(); 
</script>

a作为闭包,可以被内部的function访问到,但在全局中却没有产生一个全局的a
当然如果你想直接修改a也可以
<script> 
var fn = function(){ 
var a = 1; 
return function(p){ 
a = p===undefined?a+1:p; 
alert(a); 
} 
}() 
fn(); 
fn(0); 
</script>

4.
传统的方式一般是用el.offsetParent,el.offsetLeft遍历去取得
但其实又跟好的跟容易的方式那就是 getBoundingClientRect
代码如下
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<html> 
<head> 
<title>Untitled</title> 
</head> 
<body> 
<div id="aa" style="position:absolute;width:200px;height:200px;left:200px;top:1000px;border:1px solid #ccc" onclick=offset(this) ></div> 
<div id="bb" style="position:absolute;width:200px;height:200px;border:1px solid red"></div> 
</body> 
</html> 
<script> 
var offset = function (o){ 
var d = document,m = Math.max,bl = m(d.body.clientLeft,d.documentElement.clientLeft),st,sl, 
bt = m(d.body.clientTop,d.documentElement.clientTop),b,bb = document.getElementById('bb'); 
return function(o){ 
b = o.getBoundingClientRect(); 
st = m(d.body.scrollTop,d.documentElement.scrollTop),sl = m(d.body.scrollLeft,d.documentElement.scrollLeft); 
bb.style.cssText +=";top:"+(b.top+st-bt)+'px;left:'+(b.left+sl-bl)+"px"; 
} 
}() 
</script>

当你点击最下边的灰色的div时,上边的红色的会跟灰色的完全重叠
5.
ie下的outerHTML大家都用过吧,肥肠好用,在你不仅仅只想返回某个元素下的html,还想返回这个元素的html
但是这个属性只能用在ie下,别的浏览器没有这个属性,怎么办呢,
js小贴士帮你解决这个问题
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<html> 
<head> 
<title>Untitled</title> 
</head> 
<body> 
<div > 
<div id="aa" ksjfkls="sdf" style=""> 
<p>sdf</p> 
<p djkfjd="df"></p> 
</div> 
<div id="bb" sdfksf=333 > 
</div> 
</div> 
</body> 
</html> 
<script> 
var html = function(){ 
var d = document,div = d.createElement('div'); 
return function(id){ 
var o = d.getElementById(id); 
if(o.outerHTML) 
return o.outerHTML; 
else{ 
div.innerHTML = '' 
var h = ''; 
div.appendChild(o.cloneNode(true)); 
return div.innerHTML 
} 
} 
}() 
alert(html('aa')) 
alert(html('bb')) 
</script>
Javascript 相关文章推荐
使用javascript访问XML数据的实例
Dec 27 Javascript
actionscript与javascript的区别
May 25 Javascript
jquery $.ajax相关用法分享
Mar 16 Javascript
用js实现小球的自由移动代码
Apr 22 Javascript
jQuery Ajax()方法使用指南
Nov 19 Javascript
Flow之一个新的Javascript静态类型检查器
Dec 21 Javascript
jQuery插件uploadify实现ajax效果的图片上传
Jun 18 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
Jul 04 Javascript
Node.js下自定义错误类型详解
Oct 17 Javascript
Element-ui table中过滤条件变更表格内容的方法
Mar 02 Javascript
jQuery实现动态加载select下拉列表项功能示例
May 31 jQuery
JS实现点餐自动选择框(案例分析)
Dec 10 Javascript
Javascript 实用小技巧
Apr 07 #Javascript
javascript 函数使用说明
Apr 07 #Javascript
js下获取div中的数据的原理分析
Apr 07 #Javascript
Exjs 入门篇
Apr 07 #Javascript
javascript window.opener的用法分析
Apr 07 #Javascript
JS的反射问题
Apr 07 #Javascript
Extjs在exlipse中设置自动提示的方法
Apr 07 #Javascript
You might like
制作美丽的拉花
2021/03/03 冲泡冲煮
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
php中AES加密解密的例子小结
2014/02/18 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
用脚本调用样式的几种方法
2006/12/09 Javascript
javascript标签在页面中的位置探讨
2013/04/11 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
AngularJS的$location使用方法详解
2017/10/19 Javascript
使用JavaScript中的lodash编写双色球效果
2018/06/24 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
webpack4+react多页面架构的实现
2018/10/25 Javascript
js blob类型url的视频下载问题的解决
2019/11/29 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
关于Python 3中print函数的换行详解
2017/08/08 Python
Python解析Excle文件中的数据方法
2018/10/23 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
python3.7 利用函数os pandas利用excel对文件名进行归类
2019/09/29 Python
Python使用socketServer包搭建简易服务器过程详解
2020/06/12 Python
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
介绍Ibatis的核心类
2013/11/18 面试题
银行会计职员个人的自我评价
2013/09/29 职场文书
应届毕业生自我评价分享
2013/12/15 职场文书
演讲主持词
2014/03/18 职场文书
解除劳动合同协议书范本
2014/04/14 职场文书
社区党建工作汇报材料
2014/08/14 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
财务工作失职检讨书
2014/11/21 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang
AngularJS实现多级下拉框
2022/03/25 Javascript