上一篇基本实现了框架结构,但是与真正能用上的项目框架比较还是存在很多不足,在这又做了些加强与优化

 (function ( window, undefined ) {

 var arr = [],
push = arr.push,
slice = arr.slice,
concat = arr.concat; // 构造函数
var YY = function YY ( selector ) {
return new YY.fn.init( selector );
};
// 核心原型
YY.fn = YY.prototype = {
constructor: YY,//让原型结构保持不变
selector: null,//给其添加一个属性
length: 0,//原型中提供的属性,原型中不改值得情况下是共享的,修改后自己再次创建一个
// init 的参数可以有以下几种情况
// 1> null, "", undefined
// 2> fn
// 3> string (已经实现)
// 4> DOM 数组
// 5> DOM 对象
// 6> YY 对象
init: function ( selector ) { if ( !selector ) return this; // 兼容字符串: 选择器, html
if ( YY.isString( selector ) ) {
if ( selector.charAt( 0 ) === '<' ) {
// this.elements = parseHTML( selector );//在对象中直接绑定个属性,来储存数据,方法与其并列,方法与数据分离,维护简单,管理简单,但是在基于它的开发显得繁琐,简化elements:将数据直接储存在this中,即将YY当作伪数组
YY.push.apply( this, parseHTML( selector ) );
} else {
// this.elements = select( selector );
YY.push.apply( this, select( selector ) );
this.selector = selector;//放在其他地方创建的对象没有此属性,那么可以去原型判断
}
//this.length = 0;//当没有搜索到元素时,无须给其添加length,直接共享原型中的属性,原型中添加length属性比较优,两者没有实质的差别
return this;
} // 兼容DOM 对象
if ( YY.isDOM( selector ) ) {
this[ 0 ] = selector;//当前对象的一个元素
this.length = 1;
return this;
} // 兼容YY 对象
if ( YY.isYY( selector ) ) {
return selector;
} // 兼容DOM 数组(最后判断)
if ( YY.isLikeArray( selector ) ) {
YY.push.apply( this, selector );//每个元素放在当前对象中 return this;
}
},
 //each 方法
each: function (callback){
YY.each(this,callback);//当前每个元素(dom对象)都被回调函数作用
return this;
} };
YY.fn.init.prototype = YY.prototype; // 可扩展
YY.extend = YY.fn.extend = function ( obj ) {
// 将 obj 的成员加到 this 上
var k;
for ( k in obj ) {
this[ k ] = obj[ k ];
}
}; var select = function ( selector ) {
var first = selector.charAt( 0 ), arr = [],node;
if ( first === '#' ) {//如果没有搜索到元素,空也加进了数组,所以要对其进行判断
//arr.push.call( arr, document.getElementById( selector.slice( 1 ) ) )
node = document.getElementById( selector.slice( 1 ) );
if ( node ) {
arr.push.call( arr, node ); // [ null ]
} else {
return null;
}
} else if ( first === '.' ) {
arr.push.apply( arr, document.getElementsByClassName( selector.slice( 1 ) ) )
} else {
arr.push.apply( arr, document.getElementsByTagName( selector ) );
}
return arr;
}; var parseHTML = function ( html ) {
var div = document.createElement( 'div' ),
arr = [], i;
div.innerHTML = html;
for ( i = 0; i < div.childNodes.length; i++ ) {
arr.push( div.childNodes[ i ] );
}
return arr;
}; // 基本的工具方法
YY.extend({
each: function ( arr, fn ) {
var i, l = arr.length,
isArray = YY.isLikeArray( arr );
if ( isArray ) {
// 数组
for ( i = 0; i < l; i++ ) {
if ( fn.call( arr[ i ], i, arr[ i ] ) === false ) {
break;
}
}
} else {
// 对象
for ( i in arr ) {
if ( fn.call( arr[ i ], i, arr[ i ] ) === false ) {
break;
}
}
}
return arr;
},
push: push
});
YY.extend({
firstChild: function (dom){
var node,i,l = dom.childNodes.length;
for(i = 0;i < 1;i++){
node = dom.childNodes[i];
if(node.nodeType === 1){
return node;
}
}
}
}); // 判断类型的方法
YY.extend({
isFunction: function ( obj ) {
return typeof obj === 'function';
},
isString: function ( obj ) {
return typeof obj === 'string';
},
isLikeArray: function ( obj ) {
return obj && obj.length && obj.length >= 0;
},
isYY: function ( obj ) {
return 'selector' in obj;//判断对象原型中有无此属性来判断是否为YY对象
// 'selector' in obj
// obj.hasOwnProperty( 'selector' )
// return obj.constructor.name === 'YY';
},
isDOM: function ( obj ) {
return !!obj.nodeType;
}
}); // 基本的 DOM 操作
YY.fn.extend({
appendTo: function ( selector ) {
var objs = YY( selector ),
i, j,
len1 = objs.length,
len2 = this.length,
arr = [],node;
// 将 this 加到 objs 中
for ( i = 0; i < len1; i++ ) {
for ( j = 0; j < len2; j++ ) {
node = i === len1 - 1 ?
this[ j ] :
this[ j ].cloneNode( true );
arr.push(node);
objs[ i ].appendChild( );
}
}
return YY(arr);//注意返回的对象
}, append: function (selector){
YY(selector).appendTo(this);
return this;
},
prependTo: function(selector){
//insertBefore(新元素,参考元素) var objs = YY(selector),
i,j,
len1 = this.length;
len2 = objs.lenght;
for(i = 0;i < len2;i++){
for(j = 0;j < len1;j++){
objs[i].insertBefore(i ===len2 - 1?
this[j]:
this[j].cloneNode(true),
YY.firstChild);
}
}
return this;
},
remove: function(){}
}); // 对外公开
window.I = window.YY = YY; })( window );

对以上函数封装为dom.js文件

1、验证appendTo方法代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
#login {
width: 540px;
height: 340px;
background-color: gray;
margin: 80px auto;
padding: 30px;
}
</style>
<script src="dom.js"></script>
<script> onload = function () {
I( '#loginBtn' )[ 0 ].onclick = function ( e ) {
if ( I( '#login' ).length > 0 ) return; // alert( e );
// 弹出一个登录窗口
var ilogin = I( '<div id="login"></div>' );
ilogin.appendTo( 'body' );
// 设计内部的结构
I( '<input type="text" id="uid"/><br />' +
'<input type="password" id="pwd"/><br />' +
'<input type="button" value="登 录" id="btn"/><br />' +
'<input type="button" value="取消" id="cancel"/>'
).appendTo( ilogin ); I('#cancel')[ 0 ].onclick = function () {
var node = I( '#login' )[ 0 ];
node.parentNode.removeChild( node );
};
};
};
</script>
</head>
<body>
<input type="button" value="登录" id="loginBtn" />
</body>
</html>

2、验证append方法代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
#login {
width: 540px;
height: 340px;
background-color: gray;
margin: 80px auto;
padding: 30px;
} </style>
<script src="dom.js"></script>
<script>
onload = function () {
I( '#loginBtn' )[ 0 ].onclick = function ( e ) {
if ( I( '#login' ).length > 0 ) return; // alert( e );
// 弹出一个登录窗口
var ilogin = I( '<div id="login"></div>' ); I( 'body' ).append( ilogin );
// 设计内部的结构
ilogin.append( '<input type="text" id="uid"/><br />' +
'<input type="password" id="pwd"/><br />' +
'<input type="button" value="登 录" id="btn"/><br />' +
'<input type="button" value="取消" id="cancel"/>'
); I('#cancel')[ 0 ].onclick = function () {
var node = I( '#login' )[ 0 ];
node.parentNode.removeChild( node );
};
};
};
</script>
</head>
<body>
<input type="button" value="登录" id="loginBtn" />
</body>
</html>

3、验证prependTo方法代码

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style>
#login {
width: 540px;
height: 340px;
background-color: gray;
margin: 80px auto;
padding: 30px;
}
</style>
<script src="dom.js"></script>
<script>
onload = function () {
I( '<p>YY</p>' ).prependTo( 'div' );
};
</script>
</head>
<body>
<div>
<p>hellow world</p>
<p>hellow YY</p>
</div>
<div>
<p>hellow world</p>
<p>hellow YY</p>
</div>
</body>
</html>

方法待续,感谢您的查阅

关于js封装框架类库之DOM操作模块(二)的更多相关文章

  1. 关于js封装框架类库之DOM操作模块(一)

    在前端开发的过程中,javascript极为重要的一个功能就是对DOM对象的操作,而对其封装就是为了更好地进行DOM操作,提高浏览器的支持效率 现在给出一个案例:页面创建三个div,然后给其添加样式 ...

  2. 关于js封装框架类库之样式操作

    在js中,对样式的操作我们并不感到陌生,在很多框架中都是用极少的代码,实现更强大的功能,在这做出一些的总结.存在不足还望指出! 1.封装一个添加css的方法(这篇引用了前面的框架结构) 在 js 中 ...

  3. 关于js封装框架类库之属性操作

    在对DOM对象操作时,往往都要涉及到其属性的操作,为了提高开发效率,同时兼顾浏览器的性能,在这简单的封装了几个常见的属性.因为是模块化,在这只是引入了部分代码,其他代码在前几篇模块封装中有写.如有不足 ...

  4. 关于js封装框架类库之选择器引擎(二)

    在上篇介绍了选择器的获取标签.id.类名的方法,现在我们在上篇基础上继续升级 1.问题描述:上篇get('选择器')已经实现,如果get方法里是一个选择器的父元素,父元素是DOM对象,那么如何获取元素 ...

  5. 关于js封装框架类库之事件模块

    在触发DOM上的某个事件时,会产生一个事件对象event.这个对象中包含着所有与事件有关的信息.包括导致事件的元素,事件的类型以及其他与特定事件相关的信息. 例如: 鼠标操作点击事件时,事件对象中会获 ...

  6. 关于js封装框架类库之选择器引擎(一)

    选择器模块之传统做法 var tag = function (tag){ return document.getElementsByTagName(tag); } var id = function ...

  7. JS/jQuery--iframe框架内外元素的操作(转)

    JS/jQuery--iframe框架内外元素的操作 原创 2017年12月07日 14:23:09 标签: js / iframe 28 两个问题: 如何在父页面操作iframe框架内的元素? 如何 ...

  8. jQuery 源码分析(二十) DOM操作模块 插入元素 详解

    jQuery的DOM操作模块封装了DOM模型的insertBefore().appendChild().removeChild().cloneNode().replaceChild()等原生方法.分为 ...

  9. jQuery 源码解析(二十四) DOM操作模块 包裹元素 详解

    本节说一下DOM操作模块里的包裹元素子模块,该模块可将当前匹配的元素替换指定的DOM元素,有如下方法: wrap(html)               ;在每个匹配元素的外层添加一层DOM元素   ...

随机推荐

  1. JSP中的Attribute和InitParameter

    属性:Attribute类型:应用/上下文,请求,会话(ServletContext,HttpServletRequest/ServletRequest,HttpSession)设置方法:setAtt ...

  2. 有关文件夹与文件的查找,删除等功能 在 os 模块中实现

    最近在写的程序频繁地与文件操作打交道,这块比较弱,还好在百度上找到一篇不错的文章,这是原文传送门,我对原文稍做了些改动. 有关文件夹与文件的查找,删除等功能 在 os 模块中实现.使用时需先导入这个模 ...

  3. Siverlight+WCF+Nhibernate 开发之旅(一)

    最近正在开发sl程序,考虑了很久,参考了一些框架,令人头疼的数据访问层最终选择wcf+nhibernate,至于为什么选择wcf和nh,个人参考了其他的框架感觉这两者结合从开发效率和便捷性方面比其他的 ...

  4. C#动态编译、执行代码

    在开始之前,先熟悉几个类及部分属性.方法:CSharpCodeProvider.ICodeCompiler.CompilerParameters.CompilerResults.Assembly. 一 ...

  5. codechef Chef and The Right Triangles 题解

    Chef and The Right Triangles The Chef is given a list of N triangles. Each triangle is identfied by ...

  6. makefile之cmake入门

    cmake是一款生成makefile的软件:在生成makefile之前,首先是写一个CMakeLists.txt文件: 以下为典型例子: 先看目录tree, 在test文件夹中有:include目录, ...

  7. JavaScript之面向对象学九(原型式继承和寄生式继承)

    一.原型式继承 该继承模式是由道格拉斯*克罗克福德在2006年提出的实现继承的方法. 模式的基本思路:借助原型可以基于已有的对象创建新的对象,同时还不必因此创建自定义类型. 代码如下: functio ...

  8. SQL类型转换以及自动在前面补0满足10位工号标示法

    1,自动在前面补0满足10位工号标示法 SELECT rtrim(ltrim(right(cast('00000000'+rtrim(CAST(数值 as int)) as varchar(20)), ...

  9. ViEmu for VS2013-3.2.1 破解(转)

    ViEmuVS2013-3.2.1 破解   VS升级到2013后,作为一个Vimer,自然需要更新最新的ViEmu插件,因为现在离了Vim,写代码已经寸步难行了. ViEmu 3.2.1的破解其实和 ...

  10. 微信支付java版V3验证数据合法性

    [TOC] 1. 微信支付java版V3验证数据合法性 概要:使用微信支付接口时,微信会返回或回调给商户XML数据,开发者需要验证微信返回的数据是否合法. 特别提醒:商户系统对于支付结果通知的内容一定 ...