需要写一个函数,要求是传入参数为object,判断如果是HTMLDom则执行后续流程,否则抛异常。
如果不考虑过时的ie6,7等浏览器,可以直接用 xx instanceof HTMLElement
来判断。不过我还是想考虑更通用的做法,在低版本ie上也能跑。实际上完全可以做到,办法是使用id这个特殊属性,通过 document.getElementById
获取后判断是否是同一个对象,是则证明为HTMLDom。
<meta charset='utf-8'>
<body>
<script>
function isHtmlDom(anything){
// 判断是否为空
// 因为老版本ie的Dom instanceof Object会取出false,所以这里不能用instanceof运算
if(!anything)throw 'not an object';
// 是否页面上有这个对象
var hasId=function(id){
return document.getElementById(id);
};
// 是否本身具备id属性
var has=Object.prototype.hasOwnProperty.call(anything,'id'); // 老版本的ie没有hasOwnProperty
try{
has=has || anything.hasOwnProperty(id);// 现代浏览器使用hasOwnProperty来检查
}catch(e){}
// 保留旧id,之后还要变回来的
var oldid=[
has,
anything.id //旧id
];
// 若没有则随机产生一个
if(!anything.id){
var id;
for(var i=0;;i++){
id=[i,'_',Math.random()*999999|0];
if(!hasId(id))break;
}
anything.id=id;
}
// 是否能用id获取到这个对象
// 情况1,已在dom树中,可以直接取到
var exists=hasId(anything.id)===anything;
// 情况2,没有在dom树中,所以需要添加一次后才可以获取
if(!exists){
try{
document.body.appendChild(anything);
exists=hasId(anything.id)===anything;
document.body.removeChild(anything);
}catch(e){
exists=false;
}
}
// 还原
if(oldid[0])anything.id=oldid[1];
else delete anything[id];
return exists;
}
// 为了演示低版本上的效果,所以这段代码用for的语法来写
var list=[document,document.body,{id:'xx'},null];
for(var i=0;i<list.length;i++){
try{
isHtmlDom(list[i]);
list[i]=[i,true];
}catch(e){
list[i]=[i,false,e];
}
}
alert(list.join('\n'));
</script>
</body>
相关文档
暂无
随便看看
畅言模块加载中