原生选择器   充分利用 bind(this)绑定

<div id="box">
<ul>
<li >111 </li>
<li class="lione">2222</li>
<li class="lione">3333</li>
</ul> </div> <div id="box2">
<p>我是AAAA</p>
<p>我是BBBB</p>
</div>

  

//选择器的实现
var element = document.querySelector('selectors');
var elementList = document.querySelectorAll('selectors'); var $=query = document.querySelector.bind(document);
var queryAll = document.querySelectorAll.bind(document); //这个是最牛逼的 细细体会就会发现
var fromId = document.getElementById.bind(document);
var fromClass = document.getElementsByClassName.bind(document);
var fromTag = document.getElementsByTagName.bind(document); //调用
var box=$('#box');
var lioneall=queryAll('li');
var lione=$('.lione');
console.log(box.innerHTML); //
console.log(lioneall[2].innerHTML); //333 box.addEventListener('click',function(){
console.log('click lione'+lione.innerHTML); //click lione 2222
});

 另一个不错的  https://github.com/snandy/zchain/blob/master/%24/selector.js

/**
* JavaScript Selector
* Copyright (c) 2010 snandy
* Blog: http://snandy.cnglogs.com
* QQ群: 34580561
*
* $ 获取元素, 在DOM中使用频繁的,根据2/8原则只实现最常用的四种
*
* @param {Object} selector
* @param {Object} context
*
* 1, 通过id获取,该元素是唯一的
* $('#id')
*
* 2, 通过className获取
* $('.cls') 获取文档中所有className为cls的元素
* $('.cls', el)
* $('.cls', '#id')
* $('span.cls') 获取文档中所有className为cls的span元素
* $('span.cls', el) 获取指定元素中className为cls的元素, el为HTMLElement (不推荐)
* $('span.cls', '#id') 获取指定id的元素中className为cls的元素
*
* 3, 通过tagName获取
* $('span') 获取文档中所有的span元素
* $('span', el) 获取指定元素中的span元素, el为HTMLElement (不推荐)
* $('span', '#id') 获取指定id的元素中的span元素
*
* 4, 通过attribute获取
* $('[name]') 获取文档中具有属性name的元素
* $('[name]', el)
* $('[name]', '#id')
* $('[name=uname]') 获取文档中所有属性name=uname的元素
* $('[name=uname]', el)
* $('[name=uname]', '#id')
* $('input[name=uname]') 获取文档中所有属性name=uname的input元素
* $('input[name=uname]', el)
* $('input[name=uname]', '#id')
*/
~function(win, doc, undefined) { // Save a reference to core methods
var slice = Array.prototype.slice // selector regular expression
var rId = /^#[\w\-]+/
var rTag = /^([\w\*]+)$/
var rCls = /^([\w\-]+)?\.([\w\-]+)/
var rAttr = /^([\w]+)?\[([\w]+-?[\w]+?)(=(\w+))?\]/ // For IE9/Firefox/Safari/Chrome/Opera
var makeArray = function(obj) {
return slice.call(obj, 0)
}
// For IE6/7/8
try{
slice.call(doc.documentElement.childNodes, 0)[0].nodeType
} catch(e) {
makeArray = function(obj) {
var result = []
for (var i = 0, len = obj.length; i < len; i++) {
result[i] = obj[i]
}
return result
}
} function byId(id) {
return doc.getElementById(id)
}
function check(attr, val, node) {
var reg = RegExp('(?:^|\\s+)' + val + '(?:\\s+|$)')
var attribute = attr === 'className'
? node.className
: node.getAttribute(attr)
if (attribute) {
if (val) {
if (reg.test(attribute)) return true
} else {
return true
}
}
return false
}
function filter(all, attr, val) {
var el, result = []
var i = 0, r = 0
while ( (el = all[i++]) ) {
if ( check(attr, val, el) ) {
result[r++] = el
}
}
return result
} function query(selector, context) {
var s = selector, arr = []
var context = context === undefined
? doc
: typeof context === 'string' ? query(context)[0] : context if (!selector) return arr // id和tagName 直接使用 getElementById 和 getElementsByTagName // id
if ( rId.test(s) ) {
arr[0] = byId( s.substr(1, s.length) )
return arr
} // Tag name
if ( rTag.test(s) ) {
return makeArray(context.getElementsByTagName(s))
} // 优先使用querySelector,现代浏览器都实现它了
if (context.querySelectorAll) {
if (context.nodeType === 1) {
var old = context.id, id = context.id = '__ZZ__'
try {
return context.querySelectorAll('#' + id + ' ' + s)
} catch(e) {
throw new Error('querySelectorAll: ' + e)
} finally {
old ? context.id = old : context.removeAttribute('id')
}
}
return makeArray(context.querySelectorAll(s))
} // ClassName
if ( rCls.test(s) ) {
var ary = s.split('.')
var tag = ary[0]
var cls = ary[1]
if (context.getElementsByClassName) {
var elems = context.getElementsByClassName(cls)
if (tag) {
for (var i = 0, len = elems.length; i < len; i++) {
var el = elems[i]
el.tagName.toLowerCase() === tag && arr.push(el)
}
return arr
} else {
return makeArray(elems)
}
} else {
var all = context.getElementsByTagName(tag || '*')
return filter(all, 'className', cls)
}
} // Attribute
if ( rAttr.test(s) ) {
var result = rAttr.exec(s)
var all = context.getElementsByTagName(result[1] || '*')
return filter(all, result[2], result[4])
}
} win.query = win.$ = query
}(this, document);

  

原生js实现jQuery的offset函数

var myOffest=function (obj){
var top=0,left=0;
if(obj){
while(obj.offsetParent){
top += obj.offsetTop;
left += obj.offsetLeft;
obj = obj.offsetParent;
}
} return{
top : top,
left : left
}
}

  

var jqtop=jQuery('#box2').offset().top;
console.log('jQuery offsetTop 值'+jqtop); // jQuery offsetTop 值274 var jstop=document.getElementById("box2");
console.log('js offsetTop 值'+myOffest(jstop).top); // js offsetTop 值274

 

利用数组 forEach的实现

var unboundForEach = Array.prototype.forEach,forEach = Function.prototype.call.bind(unboundForEach);
<div id="box3">
<p class="klasses">one</p>
<p class="klasses">two</p>
<p class="klasses">three</p>
</div> <script>
var unboundForEach = Array.prototype.forEach,forEach = Function.prototype.call.bind(unboundForEach); var box3=document.getElementById("box3");
var klasses=document.querySelectorAll('.klasses')
forEach(klasses, function (el) {
el.addEventListener('click', function(){
alert('点击我的序号'+this.innerHTML); //点击我的序号 one
});
}); </script>

jquery的静态方法 $.each

function jQueryEach(object, callback, args) {
var name,
i = 0,
length = object.length;
if (args) {
if (length == undefined) {
for (name in object) {
if (callback.apply(object[name], args) === false) {
break
}
}
} else {
for (; i < length;) {
if (callback.apply(object[i++], args) === false) {
break
}
}
}
} else {
if (length == undefined) {
for (name in object) {
if (callback.call(object[name], name, object[name]) === false) {
break
}
}
} else {
for (var value = object[0]; i < length && callback.call(value, i, value) !== false; value = object[++i]) {}
}
}
return object
};

 

var arr1 = [ "one", "two", "three", "four", "five" ];
jQueryEach(arr1, function(index){
console.log(arr1[index]);
// alert(this)
}); var obj = { one:'张珊', two:'李四', three:3, four:4, five:'王五' };
jQueryEach(obj, function(key, val) {
console.log('val'+obj[key]);
});

  

 

	Array.prototype.forEach2=function(fun,context){
var len=this.length;
var context=arguments[1]; //即使为undefined,call函数也正常运行。
if(typeof fun !=="function"){
throw "输入正确函数!";
}
for(var i=0;i<len;i++){
fun.apply(context,[i,this[i],this]);
//fun.call(context,i,this[i],this);
}
};
var arr2=[5,6,7];
//arr.forEach2(function(item,index,arr){
//console.log(item,index,arr);
//});

hover 方法

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
</head> <body> 运行以下代码,正好就是jquery的hover方法
<div id="dd" style="width:100px; height:100px; border:1px solid #3d3d3d; position:relative;">
<div id="dd2" style="width:50px; height:50px; overflow:hidden; background-color:#cccccc; position:absolute; left:30px; top:30px;"></div>
</div> <script language="javascript"> function bind(elem,ev,callback)
{
if(document.all)
{
elem.attachEvent("on"+ev,callback);
}else{
elem.addEventListener(ev,callback,false);
}
}
function unbind(elem,ev,callback)
{
if(typeof(callback)=="function")
{
if(document.all)
{
elem.detachEvent("on"+ev,callback);
}else{
elem.removeEventListener(ev,callback,false);
}
}else{
if(document.all)
{
elem.detachEvent("on"+ev);
}else{
elem.removeEventListener(ev,false);
}
}
}
function hover(elem,overCallback,outCallback){//实现hover事件
var isHover=false;//判断是否悬浮在上方
var preOvTime=new Date().getTime();//上次悬浮时间 function over(e){
var curOvTime=new Date().getTime();
isHover=true;//处于over状态
if(curOvTime-preOvTime>10)
{//时间间隔超过10毫秒,认为鼠标完成了mouseout事件
overCallback(e,elem);
}
preOvTime=curOvTime;
} function out(e)
{
var curOvTime=new Date().getTime();
preOvTime=curOvTime;
isHover=false;
setTimeout(function(){
if(!isHover)
{
outCallback(e,elem);
}
},10);
}
bind(elem,"mouseover",over);
bind(elem,"mouseout",out);
}; hover(document.getElementById("dd"),
function(){console.log("进来1"); document.getElementById("dd2").innerHTML="进来了";},
function(){ console.log("出来2"); document.getElementById("dd2").innerHTML="出来了"; }
); </script> </body>
</html>

  

  

获取文档高度

//获取文档完整的高度
var getScrollHeight=function () {
return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
} console.log('jquery文档高度'+jQuery(document).height()); //jquery文档高度1739
console.log('js文档高度'+getScrollHeight()); // js文档高度1739

 样式操作 

// jQuery
$('.el').addClass('class');
$('.el').removeClass('class');
$('.el').toggleClass('class'); // 原生方法
document.querySelector('.el').classList.add('class');
document.querySelector('.el').classList.remove('class');
document.querySelector('.el').classList.toggle('class'); // 原生方法 扩展添加多个
DOMTokenList.prototype.adds = function(tokens) {
tokens.split(" ").forEach(function(token) {
this.add(token);
}.bind(this));
return this;
}; // adds 添加多个
document.querySelector(".el").classList.adds("child1 child2 child3");
function hasClass(ele, cls) {
return ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'));
}
function addClass(ele, cls) {
if (!this.hasClass(ele, cls)) ele.className += " " + cls;
}
function removeClass(ele, cls) {
if (hasClass(ele, cls)) {
var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)');
ele.className = ele.className.replace(reg, ' ');
}
}

获取jsonp

function getJSONP2(url,success,jsonpCallback,jsonp){
var jsonp=jsonp||"callback",
cn=jsonpCallback||"jsonpCallback",
url=url.toString(),
dataString = url.indexOf('?') == -1? '?': '&',
s=document.createElement("script"),
head=document.head||document.getElementsByTagName("head")[0];
s.type="text/javascript";
s.charset="UTF-8";s.src=url+dataString+"_="+(+new Date)+"&"+jsonp+"="+cn; head.insertBefore(s,head.firstChild);
console.log("src",s.src);
setTimeout(function(){
window[cn]=function(data){ try{s.onload=s.onreadystatechange=function(){
var that=this;
if((!that.readyState||that.readyState==="loaded"||that.readyState==="complete")){
success&&success(data);
s.onload=s.onreadystatechange=null;if(head&&s.parentNode){
head.removeChild(s)}}}}catch(e){}finally{window[cn]=null}}
},0)};
   var url44="http://api.map.baidu.com/geocoder/v2/?sa=1&location=30.290466116991468,120.00192773949404&output=json&pois=1&latest_admin=1&ak=ABq5yEuwLp5Z4yWlRDGX3vEhxxjGDu8L";
getJSONP2(url44,function(data){
var data=data;
data.regeocode=data.result;
//var address = data.regeocode.formatted_address; console.log(data,"结果" , data.regeocode.formatted_address); })

//document.addEventListener('click',function(){
getJSONP("https://api.github.com/repos/HubSpot/pace?callback=",function(json){
alert('success!'+ json.data.id+'获取到的'+json.data.name);
document.getElementById("testText").innerHTML='回调函数获取到了'+json.data.name;
document.getElementById("testText").style.cssText='color:red;font-size:22px; border:1px solid #666'
});

清楚字符串空格

function trimStr(str){return str.replace(/(^\s*)|(\s*$)/g,"");}

function TrimAll(str,is_global){ //删除全部空格
var result;
result = str.replace(/(^\s+)|(\s+$)/g,"");
if(is_global.toLowerCase()=="g")
{
result = result.replace(/\s/g,"");
}
return result;
}
tring.prototype.trim = function() {
return this.replace(/(^\s*)|(\s*$)/g, "");
};
String.prototype.ltrim = function() {
return this.replace(/(^\s*)/g, "");
};
String.prototype.rtrim = function() {
return this.replace(/(\s*$)/g, "");
};
String.prototype.trimAll = function () {
return this.replace(/\s+/g, "");
}

  

 cookie的操作

function addCookie(objName,objValue,objHours){
var str = objName + "=" + escape(objValue);
if(objHours > 0){
var date = new Date();
var ms = objHours*3600*1000;
date.setTime(date.getTime() + ms);
str += "; expires=" + date.toGMTString();
}
str += "; path=/";
document.cookie = str; }; function getCookie (objName){
var arrStr = document.cookie.split("; ");
for(var i = 0;i < arrStr.length;i ++){
var temp = arrStr[i].split("=");
if(temp[0] == objName) return unescape(temp[1]);
}
};

原生ajax的操作

/**
* ajax封装
* var xmlhttp = new YAjax();
* xmlhttp.request({
* url : "./demo.php", // get请求时 可以这样写 "./demo.php?name=zhangsan"
* method : "POST",
* data : "name=李四", // 支持json传值 {"name":"zhangsan"} get时不用该参数
* receiveType : "html", // json html or xml
* timeout : 3000, // 3秒
async : true, //默认true 可省略
* beforeSend:function(){}, //请求之前回调函数 就得 这边beforesent s小写 beforesend
* success : function(d) {alert(d);},
* error : function(xmlhttp){alert('timeout');}
* });
*/

  

function YAjax() {
this._self = this;
this.xmlhttp = this.init()
}
YAjax.prototype = {
constructor: YAjax,
init: function() {
var xmlhttp = null;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
if (xmlhttp.overrideMimeType) {
xmlhttp.overrideMimeType("text/xml")
}
} else {
if (window.ActiveXObject) {
var activexName = ["MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
for (var i = 0; i < activexName.length; i++) {
try {
xmlhttp = new ActiveXObject(activexName[i]);
break
} catch(e) {}
}
}
}
return xmlhttp
},
extend: function(destination, source, override) {
if (undefined == override) {
override = true
}
if (typeof destination != "object" && typeof destination != "function") {
if (!override) {
return destination
} else {
destination = {}
}
}
var property = "";
for (property in source) {
if (override || !(property in destination)) {
destination[property] = source[property]
}
}
return destination
},
json2String: function(jsonData) {
var strArr = [];
for (var k in jsonData) {
strArr.push(k + "=" + jsonData[k])
}
return strArr.join("&")
},
request: function(opt) {
var _self = this,
isTimeout = false,
timeFlag = 0,
options = {
url: "",
data: "",
method: "POST",
receiveType: "html",
timeout: 7000,
async: opt.async || true,
beforeSend: function() {},
success: function() {
alert("define your success function")
},
error: function(xmlhttp) {}
};
if ("data" in opt) {
if (typeof opt.data == "string") {} else {
opt.data = this.json2String(opt.data)
}
}
options = this.extend(options, opt);
this.xmlhttp.onreadystatechange = function() {
if (_self.xmlhttp.readyState == 2) {
options.beforeSend && options.beforeSend.apply(_self.xmlhttp, arguments)
}
if (_self.xmlhttp.readyState == 4) {
if (!isTimeout && _self.xmlhttp.status == 200) {
clearTimeout(timeFlag);
var t = options.receiveType.toLowerCase();
if (t == "html") {
options.success(_self.xmlhttp.responseText)
} else {
if (t == "xml") {
options.success(_self.xmlhttp.responseXML)
} else {
if (t == "json") {
try {
var obj = JSON.parse(_self.xmlhttp.responseText);
options.success(obj)
} catch(e) {
var str = "(" + _self.xmlhttp.responseText + ")";
options.success(JSON.parse(str))
}
} else {}
}
}
} else {
clearTimeout(timeFlag);
options.error(_self.xmlhttp)
}
}
};
clearTimeout(timeFlag);
timeFlag = setTimeout(function() {
if (_self.xmlhttp.readyState != 4) {
isTimeout = true;
_self.xmlhttp.abort();
clearTimeout(timeFlag)
}
},
options.timeout);
this.xmlhttp.open(options.method.toUpperCase(), options.url, options.async);
if (options.method.toUpperCase() == "POST") {
this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
this.xmlhttp.send(options.data)
} else {
this.xmlhttp.send(null)
}
}
};

原生延迟加载插件

/*! echo.js v1.7.0 | (c) 2015 @toddmotto | https://github.com/toddmotto/echo */
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define(function() {
return factory(root);
});
} else if (typeof exports === 'object') {
module.exports = factory;
} else {
root.echo = factory(root);
}
})(this, function (root) { 'use strict'; var echo = {}; var callback = function () {}; var offset, poll, delay, useDebounce, unload,effectClass;
var classList= 'classList' in document.documentElement ?1:0;
var isHidden = function (element) {
return (element.offsetParent === null);
}; var inView = function (element, view) {
if (isHidden(element)) {
return false;
} var box = element.getBoundingClientRect();
return (box.right >= view.l && box.bottom >= view.t && box.left <= view.r && box.top <= view.b);
}; var debounceOrThrottle = function () {
if(!useDebounce && !!poll) {
return;
}
clearTimeout(poll);
poll = setTimeout(function(){
echo.render();
poll = null;
}, delay);
}; echo.init = function (opts) {
opts = opts || {};
var offsetAll = opts.offset || 0; var offsetVertical = opts.offsetVertical || offsetAll;
var offsetHorizontal = opts.offsetHorizontal || offsetAll;
var optionToInt = function (opt, fallback) {
return parseInt(opt || fallback, 10);
};
offset = {
t: optionToInt(opts.offsetTop, offsetVertical),
b: optionToInt(opts.offsetBottom, offsetVertical),
l: optionToInt(opts.offsetLeft, offsetHorizontal),
r: optionToInt(opts.offsetRight, offsetHorizontal)
};
delay = optionToInt(opts.throttle, 80);
useDebounce = opts.debounce !== false;
effectClass=opts.effectClass;
unload = !!opts.unload;
callback = opts.callback || callback;
echo.render();
if (document.addEventListener) {
root.addEventListener('scroll', debounceOrThrottle, false);
root.addEventListener('load', debounceOrThrottle, false);
} else {
root.attachEvent('onscroll', debounceOrThrottle);
root.attachEvent('onload', debounceOrThrottle);
}
}; echo.render = function () {
var nodes = document.querySelectorAll('img[data-echo], [data-echo-background]');
var length = nodes.length;
var src, elem;
var view = {
l: 0 - offset.l,
t: 0 - offset.t,
b: (root.innerHeight || document.documentElement.clientHeight) + offset.b,
r: (root.innerWidth || document.documentElement.clientWidth) + offset.r
};
for (var i = 0; i < length; i++) {
elem = nodes[i];
if (inView(elem, view)) { if (unload) {
elem.setAttribute('data-echo-placeholder', elem.src);
} if (elem.getAttribute('data-echo-background') !== null) {
elem.style.backgroundImage = "url(" + elem.getAttribute('data-echo-background') + ")"; }
else {
elem.src = elem.getAttribute('data-echo'); } if (!unload) {
if(effectClass){
if (classList){
elem.classList.add(effectClass);
}else{
elem.className += " " + effectClass;
}
}
elem.removeAttribute('data-echo');
elem.removeAttribute('data-echo-background');
} callback(elem, 'load');
}
else if (unload && !!(src = elem.getAttribute('data-echo-placeholder'))) { if (elem.getAttribute('data-echo-background') !== null) {
elem.style.backgroundImage = "url(" + src + ")";
}
else {
elem.src = src;
} elem.removeAttribute('data-echo-placeholder');
callback(elem, 'unload');
}
}
if (!length) {
echo.detach();
}
}; echo.detach = function () {
if (document.removeEventListener) {
root.removeEventListener('scroll', debounceOrThrottle);
} else {
root.detachEvent('onscroll', debounceOrThrottle);
}
clearTimeout(poll);
}; return echo; });

使用方法

  <img src="img/blank.gif" alt="Photo" data-echo="img/photo.jpg">

  <script src="../echo.js"></script>
<script>
echo.init({
offset: 100,
throttle: 250,
unload: false,
callback: function (element, op) {
console.log(element, 'has been', op + 'ed')
}
});

domready(fn)

function Domready(readyFn) {
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", function() {
readyFn && readyFn()
}, false)
} else {
var bReady = false;
document.attachEvent("onreadystatechange", function() {
if (bReady) {
return
}
if (document.readyState == "complete" || document.readyState == "interactive") {
bReady = true;
readyFn && readyFn()
}
});
setTimeout(checkDoScroll, 1)
}
function checkDoScroll() {
try {
document.documentElement.doScroll("left");
if (bReady) {
return
}
bReady = true;
readyFn && readyFn()
} catch (e) {
setTimeout(checkDoScroll, 1)
}
}
};

为元素添加on方法

Element.prototype.on = Element.prototype.addEventListener;

为元素添加trigger方法

HTMLElement.prototype.trigger = function (type, data) {
var event = document.createEvent('HTMLEvents');
event.initEvent(type, true, true);
event.data = data || {};
event.eventName = type;
event.target = this;
this.dispatchEvent(event);
return this;
};

  

获取文档完整的高度

//获取文档完整的高度
var getScrollHeight=function () {
return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
}

 

获取当前可是范围的高度

//获取当前可是范围的高度
var getClientHeight=function () {
var clientHeight = 0;
if (document.body.clientHeight && document.documentElement.clientHeight) {
clientHeight = Math.min(document.body.clientHeight, document.documentElement.clientHeight);
}
else {
clientHeight = Math.max(document.body.clientHeight, document.documentElement.clientHeight);
}
return clientHeight;
}

  

 。。。。剩下的慢慢添加...

http://www.cnblogs.com/surfaces/

原生js实现 常见的jquery的功能的更多相关文章

  1. 利用原生JS实现类似浏览器查找高亮功能(转载)

    利用原生JS实现类似浏览器查找高亮功能 在完成 Navify 时,增加一个类似浏览器ctrl+f查找并该高亮的功能,在此进行一点总结: 需求 在.content中有许多.box,需要在.box中找出搜 ...

  2. 原生js使用forEach()与jquery使用each遍历数组,return false 的区别

    原生js使用forEach()与jquery使用each()遍历数组,return false 的区别: 1.使用each()遍历数组a,如下: var a=[20,21,22,23,24]; $.e ...

  3. 原生JS研究:学习jquery源码,收集整理常用JS函数

    原生JS研究:学习jquery源码,收集整理常用JS函数: 1. JS获取原生class(getElementsByClass) 转自:http://blog.csdn.net/kongjiea/ar ...

  4. jquery与原生JS实现增加、减小字号功能

    预览效果: 实现代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  5. AJAX初识(原生JS版AJAX和Jquery版AJAX)

    一.什么是JSON 1.介绍 JSON独立于语言,是一种与语言无关的数据格式. JSON指的是JavaScript对象表示法(JavaScript Object Notation) JSON是轻量级的 ...

  6. 原生JS的使用,包括jquery和原生JS获取节点、jquery和原生JS修改属性的比较

    一.前言 相比于JS这条直达终点.满是荆棘的小路,jquery无疑是康庄大道了,足够的简洁.易用给了它辉煌的地位.然而,毕竟是绕着道的插件,当小路走着走着变成大路的时候,曾经的大路也就失去了他自身的优 ...

  7. 原生js拖拽、jQuery拖拽、vue自定义指令拖拽

    原生js拖拽: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  8. 原生js实现ajax与jquery的ajax库,及json

    这是一篇笔记博客, Ajax: 和服务器进行数据交换(异步) 用js实现复杂的原理:用于发送请求的对象在不同的浏览器中是不同的 同源策略:ajax发送请求的url地址与服务器地址必须是同一域名,协议, ...

  9. 【JavaScript框架封装】使用原生js封装的类似于JQuery的框架及核心源码分享(多文件版本)

    这个版本的JQuery是对上一个版本的JQuery,使用了require.js进行了二次封装,基本上把前面的每一个框架封装成为一个单独的模块,最终的目录结构如下: 由于代码量和目录比较多,这个封装好的 ...

随机推荐

  1. html中滚动栏的样式

    DIV滚动栏设置 (CSS)2008/09/26 03:07div 中滚动栏的控制2008年01月06日 星期日 01:181)隐藏滚动栏<body style="overflow-x ...

  2. Unity多玩家网络游戏开发教程1章Unity带有网络功能

    Unity网络多玩家游戏开发教程第1章Unity自带网络功能 Unity拥有大量的第三方插件.专门提供了对网络功能的支持. 可是.大部分开发人员第一次接触到的还是Unity自带的网络功能.也就是大家常 ...

  3. Just like normal variables,

    Just like normal variables, pointers can be declared constant. There are two different ways that poi ...

  4. Excel阅读器NPOI

    什么是NPOI? NPOI 它是 POI 项目的 .NET 版本号. POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就能够在没有安装 Office ...

  5. Android学习笔记四十Preference使用

    Preference直译为偏好,博友建议翻译为首选项.一些配置数据,一些我们上次点击选择的内容,我们希望在下次应用调起的时候依旧有效,无须用户再一次进行配置或选择.Android提供preferenc ...

  6. 初识google多语言通信框架gRPC系列(二)编译gRPC

    目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 无论通过哪种语言调用gRPC,都必须要编译gRPC,因为生成proto访问类时,除了产生标准的数据定义类之外,还需要 ...

  7. Mongodb入门——安装与配置

    作者:zhanhailiang 日期:2014-11-07 1. 安装mongodb: [root@~/wade/nodejs/nodeclub]# yum search mongodb [root@ ...

  8. [视频解说]0基础课程-运营商-Java它J2se

    本节解说 运营商应用 Java 算被分成: 算术运算符 颂值运营商 逻辑运算符 位运算符 元运算符 这里录制了 视频解说这几大类运算符,并有练习题提供大家 面试题: 1. 最有效率的方式算出2乘以8等 ...

  9. 【UVA272】TEX Quotes

    A - TEX Quotes Time Limit:3000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu Submitcid=80 ...

  10. 如何更改Java括号中的默认对齐

    (1)在使用程序猿非常Java当大括号的排列有感就是它的不那么整齐! 很多人不知道为什么会这样: public class HelloWorld{ pulic static void main(Str ...