api.js源码阅读学习笔记
来源:互联网 发布:java 余弦相似度算法 编辑:程序博客网 时间:2024/05/16 15:20
//api.js源码/* * APICloud JavaScript Library * Copyright (c) 2014 apicloud.com */(function(window){ var u = {}; var isAndroid = (/android/gi).test(navigator.appVersion); var uzStorage = function(){ var ls = window.localStorage; if(isAndroid){ ls = os.localStorage(); } return ls; }; function parseArguments(url, data, fnSuc, dataType) { if (typeof(data) == 'function') { dataType = fnSuc; fnSuc = data; data = undefined; } if (typeof(fnSuc) != 'function') { dataType = fnSuc; fnSuc = undefined; } return { url: url, data: data, fnSuc: fnSuc, dataType: dataType }; } u.trim = function(str){ if(String.prototype.trim){ return str == null ? "" : String.prototype.trim.call(str); }else{ return str.replace(/(^\s*)|(\s*$)/g, ""); } }; u.trimAll = function(str){ return str.replace(/\s*/g,''); }; u.isElement = function(obj){ return !!(obj && obj.nodeType == 1); }; u.isArray = function(obj){ if(Array.isArray){ return Array.isArray(obj); }else{ return obj instanceof Array; } }; u.isEmptyObject = function(obj){ if(JSON.stringify(obj) === '{}'){ return true; } return false; }; u.addEvt = function(el, name, fn, useCapture){ if(!u.isElement(el)){ console.warn('$api.addEvt Function need el param, el param must be DOM Element'); return; } useCapture = useCapture || false; if(el.addEventListener) { el.addEventListener(name, fn, useCapture); } }; u.rmEvt = function(el, name, fn, useCapture){ if(!u.isElement(el)){ console.warn('$api.rmEvt Function need el param, el param must be DOM Element'); return; } useCapture = useCapture || false; if (el.removeEventListener) { el.removeEventListener(name, fn, useCapture); } }; u.one = function(el, name, fn, useCapture){ if(!u.isElement(el)){ console.warn('$api.one Function need el param, el param must be DOM Element'); return; } useCapture = useCapture || false; var that = this; var cb = function(){ fn && fn(); that.rmEvt(el, name, cb, useCapture); }; that.addEvt(el, name, cb, useCapture); }; u.dom = function(el, selector){ if(arguments.length === 1 && typeof arguments[0] == 'string'){ if(document.querySelector){ return document.querySelector(arguments[0]); } }else if(arguments.length === 2){ if(el.querySelector){ return el.querySelector(selector); } } }; u.domAll = function(el, selector){ if(arguments.length === 1 && typeof arguments[0] == 'string'){ if(document.querySelectorAll){ return document.querySelectorAll(arguments[0]); } }else if(arguments.length === 2){ if(el.querySelectorAll){ return el.querySelectorAll(selector); } } }; u.byId = function(id){ return document.getElementById(id); }; u.first = function(el, selector){ if(arguments.length === 1){ if(!u.isElement(el)){ console.warn('$api.first Function need el param, el param must be DOM Element'); return; } return el.children[0]; } if(arguments.length === 2){ return this.dom(el, selector+':first-child'); } }; u.last = function(el, selector){ if(arguments.length === 1){ if(!u.isElement(el)){ console.warn('$api.last Function need el param, el param must be DOM Element'); return; } var children = el.children; return children[children.length - 1]; } if(arguments.length === 2){ return this.dom(el, selector+':last-child'); } }; u.eq = function(el, index){ return this.dom(el, ':nth-child('+ index +')'); }; u.not = function(el, selector){ return this.domAll(el, ':not('+ selector +')'); }; u.prev = function(el){ if(!u.isElement(el)){ console.warn('$api.prev Function need el param, el param must be DOM Element'); return; } var node = el.previousSibling; if(node.nodeType && node.nodeType === 3){ node = node.previousSibling; return node; } }; u.next = function(el){ if(!u.isElement(el)){ console.warn('$api.next Function need el param, el param must be DOM Element'); return; } var node = el.nextSibling; if(node.nodeType && node.nodeType === 3){ node = node.nextSibling; return node; } }; u.closest = function(el, selector){ if(!u.isElement(el)){ console.warn('$api.closest Function need el param, el param must be DOM Element'); return; } var doms, targetDom; var isSame = function(doms, el){ var i = 0, len = doms.length; for(i; i<len; i++){ if(doms[i].isEqualNode(el)){ return doms[i]; } } return false; }; var traversal = function(el, selector){ doms = u.domAll(el.parentNode, selector); targetDom = isSame(doms, el); while(!targetDom){ el = el.parentNode; if(el != null && el.nodeType == el.DOCUMENT_NODE){ return false; } traversal(el, selector); } return targetDom; }; return traversal(el, selector); }; u.contains = function(parent,el){ var mark = false; if(el === parent){ mark = true; return mark; }else{ do{ el = el.parentNode; if(el === parent){ mark = true; return mark; } }while(el === document.body || el === document.documentElement); return mark; } }; u.remove = function(el){ if(el && el.parentNode){ el.parentNode.removeChild(el); } }; u.attr = function(el, name, value){ if(!u.isElement(el)){ console.warn('$api.attr Function need el param, el param must be DOM Element'); return; } if(arguments.length == 2){ return el.getAttribute(name); }else if(arguments.length == 3){ el.setAttribute(name, value); return el; } }; u.removeAttr = function(el, name){ if(!u.isElement(el)){ console.warn('$api.removeAttr Function need el param, el param must be DOM Element'); return; } if(arguments.length === 2){ el.removeAttribute(name); } }; u.hasCls = function(el, cls){ if(!u.isElement(el)){ console.warn('$api.hasCls Function need el param, el param must be DOM Element'); return; } if(el.className.indexOf(cls) > -1){ return true; }else{ return false; } }; u.addCls = function(el, cls){ if(!u.isElement(el)){ console.warn('$api.addCls Function need el param, el param must be DOM Element'); return; } if('classList' in el){ el.classList.add(cls); }else{ var preCls = el.className; var newCls = preCls +' '+ cls; el.className = newCls; } return el; }; u.removeCls = function(el, cls){ if(!u.isElement(el)){ console.warn('$api.removeCls Function need el param, el param must be DOM Element'); return; } if('classList' in el){ el.classList.remove(cls); }else{ var preCls = el.className; var newCls = preCls.replace(cls, ''); el.className = newCls; } return el; }; u.toggleCls = function(el, cls){ if(!u.isElement(el)){ console.warn('$api.toggleCls Function need el param, el param must be DOM Element'); return; } if('classList' in el){ el.classList.toggle(cls); }else{ if(u.hasCls(el, cls)){ u.removeCls(el, cls); }else{ u.addCls(el, cls); } } return el; }; u.val = function(el, val){ if(!u.isElement(el)){ console.warn('$api.val Function need el param, el param must be DOM Element'); return; } if(arguments.length === 1){ switch(el.tagName){ case 'SELECT': var value = el.options[el.selectedIndex].value; return value; break; case 'INPUT': return el.value; break; case 'TEXTAREA': return el.value; break; } } if(arguments.length === 2){ switch(el.tagName){ case 'SELECT': el.options[el.selectedIndex].value = val; return el; break; case 'INPUT': el.value = val; return el; break; case 'TEXTAREA': el.value = val; return el; break; } } }; u.prepend = function(el, html){ if(!u.isElement(el)){ console.warn('$api.prepend Function need el param, el param must be DOM Element'); return; } el.insertAdjacentHTML('afterbegin', html); return el; }; u.append = function(el, html){ if(!u.isElement(el)){ console.warn('$api.append Function need el param, el param must be DOM Element'); return; } el.insertAdjacentHTML('beforeend', html); return el; }; u.before = function(el, html){ if(!u.isElement(el)){ console.warn('$api.before Function need el param, el param must be DOM Element'); return; } el.insertAdjacentHTML('beforebegin', html); return el; }; u.after = function(el, html){ if(!u.isElement(el)){ console.warn('$api.after Function need el param, el param must be DOM Element'); return; } el.insertAdjacentHTML('afterend', html); return el; }; u.html = function(el, html){ if(!u.isElement(el)){ console.warn('$api.html Function need el param, el param must be DOM Element'); return; } if(arguments.length === 1){ return el.innerHTML; }else if(arguments.length === 2){ el.innerHTML = html; return el; } }; u.text = function(el, txt){ if(!u.isElement(el)){ console.warn('$api.text Function need el param, el param must be DOM Element'); return; } if(arguments.length === 1){ return el.textContent; }else if(arguments.length === 2){ el.textContent = txt; return el; } }; u.offset = function(el){ if(!u.isElement(el)){ console.warn('$api.offset Function need el param, el param must be DOM Element'); return; } var sl = Math.max(document.documentElement.scrollLeft, document.body.scrollLeft); var st = Math.max(document.documentElement.scrollTop, document.body.scrollTop); var rect = el.getBoundingClientRect(); return { l: rect.left + sl, t: rect.top + st, w: el.offsetWidth, h: el.offsetHeight }; }; u.css = function(el, css){ if(!u.isElement(el)){ console.warn('$api.css Function need el param, el param must be DOM Element'); return; } if(typeof css == 'string' && css.indexOf(':') > 0){ el.style && (el.style.cssText += ';' + css); } }; u.cssVal = function(el, prop){ if(!u.isElement(el)){ console.warn('$api.cssVal Function need el param, el param must be DOM Element'); return; } if(arguments.length === 2){ var computedStyle = window.getComputedStyle(el, null); return computedStyle.getPropertyValue(prop); } }; u.jsonToStr = function(json){ if(typeof json === 'object'){ return JSON && JSON.stringify(json); } }; u.strToJson = function(str){ if(typeof str === 'string'){ return JSON && JSON.parse(str); } }; u.setStorage = function(key, value){ if(arguments.length === 2){ var v = value; if(typeof v == 'object'){ v = JSON.stringify(v); v = 'obj-'+ v; }else{ v = 'str-'+ v; } var ls = uzStorage(); if(ls){ ls.setItem(key, v); } } }; u.getStorage = function(key){ var ls = uzStorage(); if(ls){ var v = ls.getItem(key); if(!v){return;} if(v.indexOf('obj-') === 0){ v = v.slice(4); return JSON.parse(v); }else if(v.indexOf('str-') === 0){ return v.slice(4); } } }; u.rmStorage = function(key){ var ls = uzStorage(); if(ls && key){ ls.removeItem(key); } }; u.clearStorage = function(){ var ls = uzStorage(); if(ls){ ls.clear(); } }; /*by king*/ u.fixIos7Bar = function(el){ if(!u.isElement(el)){ console.warn('$api.fixIos7Bar Function need el param, el param must be DOM Element'); return; } var strDM = api.systemType; if (strDM == 'ios') { var strSV = api.systemVersion; var numSV = parseInt(strSV,10); var fullScreen = api.fullScreen; var iOS7StatusBarAppearance = api.iOS7StatusBarAppearance; if (numSV >= 7 && !fullScreen && iOS7StatusBarAppearance) { el.style.paddingTop = '20px'; } } }; u.fixStatusBar = function(el){ if(!u.isElement(el)){ console.warn('$api.fixStatusBar Function need el param, el param must be DOM Element'); return; } var sysType = api.systemType; if(sysType == 'ios'){ u.fixIos7Bar(el); }else if(sysType == 'android'){ var ver = api.systemVersion; ver = parseFloat(ver); if(ver >= 4.4){ el.style.paddingTop = '25px'; } } }; u.toast = function(title, text, time){ var opts = {}; var show = function(opts, time){ api.showProgress(opts); setTimeout(function(){ api.hideProgress(); },time); }; if(arguments.length === 1){ var time = time || 500; if(typeof title === 'number'){ time = title; }else{ opts.title = title+''; } show(opts, time); }else if(arguments.length === 2){ var time = time || 500; var text = text; if(typeof text === "number"){ var tmp = text; time = tmp; text = null; } if(title){ opts.title = title; } if(text){ opts.text = text; } show(opts, time); } if(title){ opts.title = title; } if(text){ opts.text = text; } time = time || 500; show(opts, time); }; u.post = function(/*url,data,fnSuc,dataType*/){ var argsToJson = parseArguments.apply(null, arguments); var json = {}; var fnSuc = argsToJson.fnSuc; argsToJson.url && (json.url = argsToJson.url); argsToJson.data && (json.data = argsToJson.data); if(argsToJson.dataType){ var type = argsToJson.dataType.toLowerCase(); if (type == 'text'||type == 'json') { json.dataType = type; } }else{ json.dataType = 'json'; } json.method = 'post'; api.ajax(json, function(ret,err){ if (ret) { fnSuc && fnSuc(ret); } } ); }; u.get = function(/*url,fnSuc,dataType*/){ var argsToJson = parseArguments.apply(null, arguments); var json = {}; var fnSuc = argsToJson.fnSuc; argsToJson.url && (json.url = argsToJson.url); //argsToJson.data && (json.data = argsToJson.data); if(argsToJson.dataType){ var type = argsToJson.dataType.toLowerCase(); if (type == 'text'||type == 'json') { json.dataType = type; } }else{ json.dataType = 'text'; } json.method = 'get'; api.ajax(json, function(ret,err){ if (ret) { fnSuc && fnSuc(ret); } } ); };/*end*/ window.$api = u;})(window);
其中源码中使用到很多少见但很实用的原生javascript属性及方法
1.nodeType
nodeType属性可返回节点的类型
最重要的节点类型是
元素类型 节点类型
元素element 1
属性attr 2
文本text 3
注释comments 8
文档document 9
补充:
值-元素类型
1-ELEMENT
2-ATTRIBUTE
3-TEXT
4-CDATA
5-ENTITY REFERENCE
6-ENTITY
7-PI (processing instruction)
8-COMMENT
9-DOCUMENT
10-DOCUMENT TYPE
11-DOCUMENT FRAGMENT
12-NOTATION
由此引申出nodeName nodeValue
nodeName 属性含有某个节点的名称
元素节点的nodeName是标签名称
属性节点的nodeName是属性名称
文本节点的nodeName永远是#text
文档节点的nodeName永远是#document
注释:nodeName所包含的XML元素的标签名称永远是大写
nodeValue
对于文本节点,nodeValue属性包含文本
对于属性节点,nodeValue属性包含属性值
nodeValue属性对于文档节点和元素节点是不可用的
2、JSON.stringify()方法 与 JSON.parse()方法
作用:这个函数的作用是为了系列化对象
也就是说把原来对象的类型转换成字符串类型(或者更确切的说是json类型的)。
语法:
JSON.stringify(value [, replacer] [, space])
value:是必须要的字段。就是你输入的对象,比如数组啊,类啊等等。
replacer:这个是可选的。它又分为2种方式,一种是方法,第二种是数组。
情况一:我们先说数据,通过我们后面的实验可以知道,它是和第一个有关系的。一般来说,我们系列化后的结果是通过键值对来进行表示的。
比如说:
name:"lan",age:25
这种形式。
所以,如果这种形式的话,如果第二个的值在第一个存在,那么的话就以第二个的值做key,第一个值为value进行表示,如果不存在,sorry,忽略。【是不是有点抽象,我也这么觉得,不过你等一下看实验 就OK了。。呼呼。】
情况二:如果是方法,那很简单,就是说把系列化后的每一个对象(记住 是每一个)传进方法里面进行处理。
space:很好理解,用什么来做分隔符的。
1.如果省略的话,那么显示出来的值 就没有分隔符。直接输出来
2.如果是一个数字的话,那么它就定义缩进几个字符,当然 如果大于10 ,则最大值为10.
3.如果是一些转义字符,比如“\t”,表示回车,那么它每行一个回车。
4.如果仅仅是字符串,OK,就在每行输出值的时候把这些字符串附加上去就OK。当然,最大长度也是10个字符。
开始用实例说明;
1.只有一个参数的情况下:
var student = new Object();
student.name = "Lanny";
student.age = "25";
student.location = "China";
var json = JSON.stringify(student);
alert(student);
结果如下:
有些人可能会怀疑JSON.stringify的作用,OK。那假如,我们不要这个函数。代码下面的样子:
var student = new Object();
student.name = "Lanny";
student.age = "25";
student.location = "China";
// var json = JSON.stringify(student);
alert(student);
恭喜你 得到的结果是:
没骗你吧,继续。
2.第二个参数存在,并且第二个参数还是function的时候
var students = new Array() ;
students[0] = "Lanny";
students[1] = "dong";
students[2] = "I love you";
var json = JSON.stringify(students,switchUpper);
function switchUpper(key, value) {
return value.toString().toUpperCase();
}
alert(json);
//var json = JSON.stringify(students, function (key,value) {
//return value.toString().toUpperCase();
//});
上面的方法也可以换成下面的,2个都是一样,只是写法有那么一点点的不一样而已。
得到结果如下:
3.第二个参数存在,并且第二个参数不是function,而是数组的时候。
3.1 【误区】如果第一个参数是数组,第二个参数也是数组的话,只显示第一个参数的值。
比如:
var students = new Array() ;
students[0] = "Lanny";
students[1] = "dong";
students[2] = "I love you";
var stu = new Array();
stu[0] = "1";
stu[1] = "2";
var json = JSON.stringify(students,stu);
alert(json);
sorry 得到的结果就是:
第二个被忽略了,只是第一个被系列化了。
3.2 如果第一个是对象(这里说的对象就像在C#里面可以进行new的),第二个是数组的。
那么如果第二个的value在第一个存在,那么的话就以第二个的值做key,第一个值为value进行表示
var student = new Object();
student.qq = "5485891512";
student.name = "Lanny";
student.age = 25;
var stu = new Array();
stu[0] = "qq";
stu[1] = "age";
stu[2] = "Hi";//这个student对象里不存在。
var json = JSON.stringify(student,stu);
alert(json);
得到的结果如下:
因为stu[2] = "Hi";这个Hi 在第一个找不到,所以就不进行显示了。
4.第三个参数
4.1.如果省略的话,那么显示出来的值 就没有分隔符。直接输出来
比如:
var student = new Object();
student.qq = "5485891512";
student.name = "Lanny";
student.age = 25;
var stu = new Array();
stu[0] = "qq";
stu[1] = "age";
stu[2] = "Hi";
var json = JSON.stringify(student,stu);
alert(json);
输出的就是:
4.2.如果是一个数字的话,那么它就定义缩进几个字符,当然 如果大于10 ,则最大值为10.
var student = new Object();
student.qq = "5485891512";
student.name = "Lanny";
student.age = 25;
var stu = new Array();
stu[0] = "qq";
stu[1] = "age";
stu[2] = "Hi";
var json = JSON.stringify(student,stu,100);//注意这里的100
alert(json);
那么得到的是:
空开来了10个字符。
4.3.如果是一些转义字符,比如“\t”,表示回车,那么它每行一个回车。
也是一样。
4.4.如果仅仅是字符串,OK,就在每行输出值的时候把这些字符串附加上去就OK。当然,最大长度也是10个字符。
如果是var json = JSON.stringify(student,stu,“HaiKou”);//
3、querySelector
querySelector() 方法返回文档中匹配指定 CSS 选择器的一个元素。
注意: querySelector() 方法仅仅返回匹配指定选择器的第一个元素。如果你需要返回所有的元素,请使用 querySelectorAll() 方法替代。
实例:获取文档中 class="example" 的第一个 <p> 元素:
docment.querySelector("p.example");
获取文档中class='example' 的第一个元素;
document.querySelector('.example');
获取文档中有“target”属性的第一个<a>元素:
document.querySelector('a[target]');
以下实例演示了多个选择器的使用方法。
假定你选择了两个选择器: <h2> 和 <h3> 元素。
以下代码将为文档的第一个 <h2> 元素添加背景颜色:
<h2>A h2 element</h2>
<h3>A h3 element</h3>document.querySelector("h2, h3").style.backgroundColor = "red";
但是,如果文档中 <h3> 元素位于 <h2> 元素之前,<h3> 元素将会被设置指定的背景颜色。
<h3>A h3 element</h3>
<h2>A h2 element</h2>
document.querySelector("h2, h3").style.backgroundColor = "red";
querySelectorAll:return a NodeList containing all of the matching Element nodes within the node’s subtrees, in document order. If there are no such nodes, the method must return an empty NodeList. (按文档顺序返回指定元素节点的子树中匹配选择器的元素集合,如果没有匹配返回空集合)
从定义可以看到Document和Element都实现了NodeSelector接口。即这三种类型的元素都拥有这两个方法。querySelector和querySelectorAll的参数是CSS选择器字符串。区别在于querySelector返回的是一个第一个匹配元素,querySelectorAll返回的一个所有匹配元素集合(NodeList)。
在 document 中选取 class 为 test 的 div 的子元素 p 的第一个子元素,当然这很拗口,但是用本文的新方法来选择这个元素,比用言语来描述它还要简单。
document.querySelector(
"div.test>p:first-child"
);
document.querySelectorAll(
"div.test>p:first-child"
)[0];
document.querySelector(
"div.test>p:first-child"
);
这是原生方法,比起jquery速度快,缺点是IE6、7不支持。
4、previousSibling属性
定义和用法
previousSibling 属性返回选定节点的上一个同级节点(在相同树层级中的前一个节点)。
如果不存在这样的节点,则该属性返回 null。
(比如换行字符),而 Mozilla 不这么做。
nextSibling属性
5、isEqualNode()
定义和用法
isEqualNode() 方法检查两个节点是否相等。
如果下例条件为 true,则两个节点相等:
- 节点类型相同
- 拥有相同的 nodeName、NodeValue、localName、nameSpaceURI 以及前缀
- 所有后代均为相同的子节点
- 拥有相同的属性和属性值(属性次序不必一致)
提示:请使用 isSameNode() 方法来检测两节点是否是相同节点。
6、parentNode属性
parentNode 属性以 Node 对象的形式返回指定节点的父节点。
如果指定节点没有父节点,则返回 null。
7、removeChild()方法
removechild 函数可以删除父元素的指定子元素。
如果此函数删除子节点成功,则返回被删除的节点,否则返回null。
语法结构:
fatherObj.removeChild(childrenObj)
参数解释:
1.fatherObj:要删除子元素的元素对象。
2.childrenObj:要被删除的子元素对象。
特别说明:
在火狐、谷歌和IE8以上浏览器中,空白也算是一个文本节点,但是在IE8和IE8以下浏览器中会忽略空白文本节点,具体可以参阅javascript如何获取元素的子节点和父节点 一章节。
8、getAttribute() 与 setAttribute()方法
setAttribute() 方法添加指定的属性,并为其赋指定的值。
如果这个指定的属性已存在,则仅设置/更改值。
所有主流浏览器均支持 setAttribute() 方法。
注释:Internet Explorer 8 以及更早的版本不支持此方法。
设置 input 元素的 type 属性:
document.getElementsByTagName("INPUT")[0].setAttribute("type","button");
getAttribute() 方法返回指定属性名的属性值。
提示:如果您希望以 Attr 对象返回属性,请使用 getAttributeNode。
HTML DOM 节点
在 HTML DOM(文档对象模型)中,每个部分都是节点:
文档本身是文档节点
所有的HTML元素是元素节点
所有的HTML属性是属性节点
HTML 元素内的文本是文本节点
注释是注释节点
Attr对象
在HTML DOM中,attr对象表示HTML属性
HTML属性始终属于HTML元素
9、classList属性与className属性
如果指定的类名已存在,则不会添加 /td>contains(class)返回布尔值,判断指定的类名是否存在。
可能值:
- true - 元素包已经包含了该类名
- false - 元素中不存在该类名
如果索引值在区间范围外则返回 nullremove(class1, class2, ...)移除元素中一个或多个类名。
注意: 移除不存在的类名,不会报错。toggle(class, true|false)在元素中切换类名。
第一个参数为要在元素中移除的类名,并返回 false。
如果该类名不存在则会在元素中添加类名,并返回 true。
第二个是可选参数,是个布尔值用于设置元素是否强制添加或移除类,不管该类名是否存在。例如:
移除一个 class: element.classList.toggle("classToRemove", false);
添加一个 class: element.classList.toggle("classToAdd", true);
注意: Internet Explorer 或 Opera 12 及其更早版本不支持第二个参数。
classList.add()
classList.remove()
className.indexOf()
10、selectedIndex属性
selectedIndex属性可设置或返回下拉列表中被选选项的索引号
注释:若允许多重选择,则仅会返回第一个被选选项的索引号
11、insertAdjacentHTML()与 insertAdjcentText()
其调用方式为elem.insertAdjacentHTML( position, htmlStr )
elem 向哪个DOM的标签出插入字符串
position 有四个选项 "beforeBegin" "afterEnd" "afterBegin" "beforeEnd"分别指在elem的开始标签之前、结束标签之后、开始标签之后、结束标签之前插入htmlStr
12、innerHTML 与 textContent13、window.getComputedStyle()
window.getComputedStyle().getPropertyValue()
我们都用过jQuery的CSS()
方法,其底层运作就应用了getComputedStyle以及getPropertyValue方法。
对于那些只想混口饭吃的人来讲,晓得CSS()
如何使用就足够了。对于希望在JS道路上越走越远的来人说,简单了解一些JS库底层实现对自己的学习很有帮助。可能谈不上信手拈来的使用,至少对创造一些创意新颖的新技术拓宽了思路。
- api.js源码阅读学习笔记
- Three.js源码阅读笔记
- async.js源码阅读笔记
- jsPlumb.js(连线器)API阅读笔记
- jsPlumb.js(连线器)API阅读笔记
- Underscore.js API 学习笔记
- gtk学习笔记 - vim + ctags 阅读源码
- opnstack学习笔记---源码阅读(一)
- Java框架类源码阅读学习笔记
- Tensorflow object detection API 源码阅读笔记:架构
- Tensorflow object detection API 源码阅读笔记:RPN
- Tensorflow object detection API 源码阅读笔记:Mask R-CNN
- Tensorflow object detection API 源码阅读笔记:Fast r-cnn
- Tensorflow object detection API 源码阅读笔记:RFCN
- 【 js 基础 】【 源码学习 】backbone 源码阅读(三)
- Vue.js 源码学习笔记
- Java API源码阅读邀请
- node.js常用API 学习笔记
- Android设计模式之观察者模式
- Oracle中激活scott账号
- Eclipse webservice client 调用 .net接口
- [POJ1804]Brainman
- 谁占用了我的Buffer Pool?
- api.js源码阅读学习笔记
- 关于mysql 一系列操作
- 标准模板库1(STL)——基本概念
- 在HTMl文档中使用CSS
- Oracle学习第二记
- Functions
- js事件的分类和阻止冒泡事件
- linux 遇到的问题
- 用一个for循环实现矩阵的转置