function placeholderSupport() { return 'placeholder' in document.createElement('input'); }
<script type="text/html" id="T-pcList"> //这里面是你要放的html代码,例如放一个div的内容 </script>
把上面的js动态加入到页面中:javascript
$(function(){ var s=$("#T-pcList").html();//得到js的html内容 $(".picScroll-left .bd").html(s);//把s的内容放到class为bd内 thisstyle();//执行某个函数 });
$(document).bind("click",function(e){ var target = $(e.target); if(target.closest(".city_box,#city_select a.selected").length == 0){ $(".city_box").hide(); } })
更全的方式:css
$(document).click(function(e){ var _con = $(' 目标区域 '); // 设置目标区域 if(!_con.is(e.target) && _con.has(e.target).length === 0){ // Mark 1 some code... // 功能代码 } }); /* Mark 1 的原理: 判断点击事件发生在区域外的条件是: 1. 点击事件的对象不是目标区域自己 2. 事件对象同时也不是目标区域的子元素 */
方法一:html
<body ontouchmove="event.preventDefault()" >
方法二:前端
document.addEventListener('touchmove', function(event) { event.preventDefault(); })
<input type="file" id="browsefile" style="visibility:hidden" onchange="filepath.value=this.value"> <input type="button" id="filebutton" value="" onclick="browsefile.click()"> <input type="textfield" id="filepath">
function addCSS(cssText){ var style = document.createElement('style'); var head = document.head || document.getElementsByTagName('head')[0]; style.type = 'text/css'; if(style.styleSheet){ //IE var func = function(){ try{ //防止IE中stylesheet数量超过限制而发生错误 style.styleSheet.cssText = cssText; }catch(e){ } } //若是当前styleSheet还不能用,则放到异步中则行 if(style.styleSheet.disabled){ setTimeout(func,10); }else{ func(); } }else{ //w3c //w3c浏览器中只要建立文本节点插入到style元素中就好了 var textNode = document.createTextNode(cssText); style.appendChild(textNode); } //把建立的style元素插入到head中 head.appendChild(style); } //使用 addCSS('#demo{ height: 30px; background:#f00;}');
在IE8以及其低版本浏览器下,IE独有属性styleSheet.cssText。因此通常的兼容简单写法:vue
var style = document.createElement('style'); style.type = "text/css"; if (style.styleSheet) { //IE style.styleSheet.cssText = '/*..css content here..*/'; } else { //w3c style.innerHTML = '/*..css content here..*/'; } document.getElementsByTagName('head')[0].appendChild(style);
var image=new Image(); imgae.onload = funtion; imgae.src = 'url'
js内部是按顺序逐行执行的,能够认为是同步的。
给imgae赋值src时,去加载图片这个过程是异步的,这个异步过程完成后,若是有onload,则执行onload。java
若是先赋值src,那么这个异步过程可能在你赋值onload以前就完成了(好比图片缓存,或者是js因为某些缘由被阻塞了),那么onload就不会执行。
反之,js同步执行肯定onload赋值完成后才会赋值src,能够保证这个异步过程在onload赋值完成后才开始进行,也就保证了onload必定会被执行到node
DOM里还有一个insertBefore方法用于再节点前面附件内容,经过insertBefore和appendChild咱们能够实现本身的insertAfter函数:jquery
// 'Target'是DOM里已经存在的元素 // 'Bullet'是要插入的新元素 function insertAfter(target, bullet) { target.nextSibling ? target.parentNode.insertBefore(bullet, target.nextSibling) : target.parentNode.appendChild(bullet); } // 使用了3目表达式: // 格式:条件?条件为true时的表达式:条件为false时的表达式
上面的函数首先检查target元素的同级下一个节点是否存在,若是存在就在该节点前面添加bullet节点,若是不存在,就说明target是最后一个节点了,直接在后面append新节点就能够了。DOM API没有给提供insertAfter是由于真的不必了——咱们能够本身建立。linux
IE中有这样一个方法:removeNode(),这个方法在IE下是好使的,可是在Firefox等标准浏览器中就会报错了 removeNode is not defined,可是在核心JS中有一个操做DOM节点的方法叫:removeChild()。
咱们能够先去找到要删除节点的父节点,而后在父节点中运用removeChild来移除咱们想移除的节点。咱们能够定义一个方法叫removeElement:android
function removeElement(_element){ var _parentElement = _element.parentNode; if(_parentElement){ _parentElement.removeChild(_element); } }
HTML代码:
<div><input onclick="removeElement(this)" type="text" value="点击移除该输入框" /></div>
if(top.location!=self.location){ //有父窗口 top.location = "https://www.baidu.com"; }else{ //没有父窗口 window.location.href = "https://www.baidu.com"; }
用console.time
和console.timeEnd
中间代码执行时长来测试间隔时间。
console.time('console');
console.log('test'); console.timeEnd('console');
function Printpart(id_str){ //id-str内容中的id var el = document.getElementById(id_str); var iframe = document.createElement('IFRAME'); var doc = null; iframe.setAttribute('style', 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;'); document.body.appendChild(iframe); doc = iframe.contentWindow.document; doc.write('<div>' + el.innerHTML + '</div>'); doc.close(); iframe.contentWindow.focus(); iframe.contentWindow.print(); if (navigator.userAgent.indexOf("MSIE") > 0){ document.body.removeChild(iframe); } }
参考地址:
reload 方法
该方法强迫浏览器刷新当前页面。
语法:
location.reload([bForceGet])
参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前页。true, 则以 GET 方式,从服务端取最新的页面, 至关于客户端点击 F5("刷新")
replace 方法
该方法经过指定URL替换当前缓存在历史里(客户端)的项目,所以当使用replace方法以后,你不能经过“前进”和“后退”来访问已经被替换的URL。
语法:
location.replace(URL)
在实际应用的时候,从新刷新页面的时候,咱们一般使用: location.reload() 或者是 history.go(0) 来作。由于这种作法就像是客户端点F5刷新页面,因此页面的method="post"的时候,会出现“网页过时”的提示。那是由于Session的安全保护机制。能够想到: 当调用 location.reload() 方法的时候, aspx页面此时在服务端内存里已经存在, 所以一定是 IsPostback 的。若是有这种应用: 咱们须要从新加载该页面,也就是说咱们指望页面可以在服务端从新被建立, 咱们指望是 Not IsPostback 的。这里,location.replace() 就能够完成此任务。被replace的页面每次都在服务端从新生成。你能够这么写:location.replace(location.href)
IE对盒模型的渲染在 Standards Mode和Quirks Mode是有很大差异的,在Standards Mode下对于盒模型的解释和其余的标准浏览器是同样,但在Quirks Mode模式下则有很大差异,而在不声明Doctype的状况下,IE默认又是Quirks Mode。因此为兼容性考虑,咱们可能须要获取当前的文档渲染方式。
document.compatMode正好派上用场,它有两种可能的返回值:BackCompat和CSS1Compat。
BackCompat:标准兼容模式关闭。浏览器客户区宽度是document.body.clientWidth;
CSS1Compat:标准兼容模式开启。 浏览器客户区宽度是document.documentElement.clientWidth。
例如:
function getViewport(){ if (document.compatMode == "BackCompat"){ return { width: document.body.clientWidth, height: document.body.clientHeight } }else{ return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight } } }
window.location 对象所包含的属性
属性 | 描述 |
---|---|
hash | 从井号 (#) 开始的 URL(锚) |
host | 主机名和当前 URL 的端口号 |
hostname | 当前 URL 的主机名 |
href | 完整的 URL |
pathname | 当前 URL 的路径部分 |
port | 当前 URL 的端口号 |
protocol | 当前 URL 的协议 |
search | 从问号 (?) 开始的 URL(查询部分) |
protocol 属性是一个可读可写的字符串,可设置或返回当前 URL 的协议。
语法:
location.protocol=path
实例:假设当前的 URL 是: http://example.com:1234/test.htm#part2:
document.write(location.protocol); //输出:http:
Navigator 对象包含有关浏览器的信息。
注释:没有应用于 navigator 对象的公开标准,不过全部浏览器都支持该对象。
Navigator 对象属性:
属性 | 描写 |
---|---|
appCodeName | 返回浏览器的代码名。 |
appMinorVersion | 返回浏览器的次级版本。 |
appName |
返回浏览器的名称。 |
appVersion | 返回浏览器的平台和版本信息。 |
browserLanguage | 返回当前浏览器的语言。 |
cookieEnabled | 返回指明浏览器中是否启用 cookie 的布尔值。 |
cpuClass | 返回浏览器系统的 CPU 等级。 |
onLine | 返回指明系统是否处于脱机模式的布尔值。 |
platform | 返回运行浏览器的操做系统平台。 |
systemLanguage | 返回 OS 使用的默认语言。 |
userAgent |
返回由客户机发送服务器的 user-agent 头部的值。 |
userLanguage | 返回 OS 的天然语言设置。 |
在谷歌浏览器中打印Navigator对象,如图所示:
//跨浏览器添加事件 function addEvent(obj,type,fn){ if(obj.addEventListener){ obj.addEventListener(type,fn,false); }else if(obj.attachEvent){//IE obj.attchEvent('on'+type,fn); } }
//跨浏览器移除事件 function removeEvent(obj,type,fn){ if(obj.removeEventListener){ obj.removeEventListener(type,fn,false); }else if(obj.detachEvent){//兼容IE obj.detachEvent('on'+type,fn); } }
//跨浏览器阻止默认行为 function preDef(ev){ var e = ev || window.event; if(e.preventDefault){ e.preventDefault(); }else{ e.returnValue =false; } }
function stopPro(evt) { var e = evt || window.event; window.event ? e.cancelBubble = true : e.stopPropagation(); }
//跨浏览器获取目标对象 function getTarget(ev){ if(ev.target){//w3c return ev.target; }else if(window.event.srcElement){//IE return window.event.srcElement; } }
//跨浏览器获取滚动条位置 function getSP(){ return{ top: document.documentElement.scrollTop || document.body.scrollTop, left : document.documentElement.scrollLeft || document.body.scrollLeft; } }
//跨浏览器获取可视窗口大小 function getWindow () { if(typeof window.innerWidth !='undefined') { //IE8及如下undefined return{ width : window.innerWidth, height : window.innerHeight } }else{ return { width : document.documentElement.clientWidth, height : document.documentElement.clientHeight } } }
function getStyle(element, attr) { if (typeof window.getComputedStyle != 'undefined') {//W3C return window.getComputedStyle(element, null)[attr]; } else if (typeof element.currentStyle != 'undeinfed') {//IE return element.currentStyle[attr]; } }
function getMousePos(event) { var e = event || window.event; var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; var scrollY = document.documentElement.scrollTop || document.body.scrollTop; var x = e.pageX || e.clientX + scrollX; var y = e.pageY || e.clientY + scrollY; //alert('x: ' + x + '\ny: ' + y); return { 'x': x, 'y': y }; }
<!doctype html> <html lang="zn-CN"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title></title> <style type="text/css"> #login{ height: 100px; width: 100px; border: 1px solid black; position: relative; top:200px; left: 200px; background: red; } </style> </head> <body> <div id="login"></div> <script type="text/javascript"> var oDiv = document.getElementById("login"); oDiv.onmousedown = function(e){ var e = e || window.event;//window.event兼容IE,当事件发生时有效 var diffX = e.clientX - oDiv.offsetLeft;//获取鼠标点击的位置到所选对象的边框的水平距离 var diffY = e.clientY - oDiv.offsetTop; document.onmousemove = function(e){ //需设为document对象才能做用于整个文档 var e = e||window.event; oDiv.style.left = e.clientX - diffX + 'px';//style.left表示所选对象的边框到浏览器左侧距离 oDiv.style.top = e.clientY -diffY + 'px'; }; document.onmouseup = function(){ document.onmousemove = null;//清除鼠标释放时的对象移动方法 document.onmouseup = null; } } </script> </body> </html>
offsetTop 返回的是数字,而 style.top 返回的是字符串,除了数字外还带有单位:px。
当咱们右击网页的时候,会自动出现 windows 自带的菜单。那么咱们可使用 contextmenu 事件来修改咱们指定的菜单,但前提是把右击的默认行为取消掉。
function addEvent(obj, type, fn) { //添加事件兼容 if (obj.addEventListener) { obj.addEventListener(type, fn); } else if (obj.attachEvent) { obj.attachEvent('on' + type, fn); } } function removeEvent(obj, type, fn) { //移除事件兼容 if (obj.removeEventListener) { ob j.removeEventListener(type, fn); } else if (obj.detachEvent) { obj.detachEvent('on' + type, fn); } } addEvent(window, 'load', function () { var text = document.getElementById('text'); addEvent(text, 'contextmenu', function (evt) { var e = evt || window.event; preDef(e); var menu = document.getElementById('menu'); menu.style.left = e.clientX + 'px'; menu.style.top = e.clientY + 'px'; menu.style.visibility = 'visible'; addEvent(document, 'click', function () { document.getElementById('myMenu').style.visibility = 'hidden'; }); }); });
<body class="container"> <table id="table"> <tr><td>咱们是@IT·平头哥联盟</td><td>,我是首席填坑官</td><td>苏南</td><td>前端开发</td><td>优秀</td></tr> <tr><td>咱们是@IT·平头哥联盟</td><td>,我是首席填坑官</td><td>苏南</td><td>前端开发</td><td>优秀</td></tr> <tr><td>咱们是@IT·平头哥联盟</td><td>,我是首席填坑官</td><td>苏南</td><td>前端开发</td><td>优秀</td></tr> ………… </table> <script> let table =document.querySelector("#table"); table.addEventListener("click",(e)=>{ let {nodeName} = e.target; if(nodeName.toUpperCase() === "TD"){ console.log(e.target);//<td>N</td> } },false); </script> </body>
let isObject = {};
console.log(JSON.stringify(isObject) == '{}');
let listObject = { a: 1, b: 3, c: 4 };
function isEmptyObject() { for(let key in listObject) { return false; } return true; } console.log(isEmptyObject());
function isEmptyObject2(obj) { return Object.keys(obj).length == 0; } console.log(isEmptyObject2(isObject));
对这个对象中必定存在的属性进行判断
console.log(isObject.id == null);
var inventory = [ {name: 'apples', quantity: 2}, {name: 'bananas', quantity: 0}, {name: 'cherries', quantity: 5} ]; function findCherries(fruit) { return function(value){ return value.name == fruit } } console.log(inventory.find(findCherries('cherries'))); // { name: 'cherries', quantity: 5 }
Object.values()
方法返回一个给定对象自身的全部可枚举属性值的数组,值的顺序与使用for...in
循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。
var obj = { foo: 'bar', baz: 42 }; console.log(Object.values(obj)); // ['bar', 42] // array like object var obj = { 0: 'a', 1: 'b', 2: 'c' }; console.log(Object.values(obj)); // ['a', 'b', 'c'] // array like object with random key ordering // when we use numeric keys, the value returned in a numerical order according to the keys var an_obj = { 100: 'a', 2: 'b', 7: 'c' }; console.log(Object.values(an_obj)); // ['b', 'c', 'a'] // getFoo is property which isn't enumerable var my_obj = Object.create({}, { getFoo: { value: function() { return this.foo; } } }); my_obj.foo = 'bar'; console.log(Object.values(my_obj)); // ['bar'] // non-object argument will be coerced to an object console.log(Object.values('foo')); // ['f', 'o', 'o']
Object.values()详细参考地址:《MDN:Object.values(obj)
》
/* 该方法能够将类数组对象转换为数组,所谓类数组对象,就是含 length 和索引属性的对象 * 返回的数组长度取决于对象 length 属性的值,而且非索引属性的值或索引大于 length 的值都不会被返回到数组中 * Array.prototype.slice.call(obj,start,end) start:方法中slice截取的开始位置,end终止位置,默认从0开始 * */ let testObject = { 0: 'a', 1: 'b', 2: 'c', name: 'admin', length: 3, }; /* 对象中必须定义length,且属性值不能为非数字,非数字没法返回 */ console.log(Array.prototype.slice.call(testObject)); /* 或者简写为[].slice.call(testObject) */ console.log([].slice.call(testObject));
/* Array、Set、Map 和字符串都是可迭代对象(WeakMap/WeakSet 并非可迭代对象) * 这些对象都有默认的迭代器,即具备 Symbol.iterator 属性 * 全部经过生成器建立的迭代器都是可迭代对象 * 能够用 for of 循环 * */ let testObject2 = { 0: 'a', 1: 'b', 2: 'c', name: 'admin', length: 3, }; console.log(Array.from(testObject2));
let temporaryArray3 = [1,2,1,2,3];
console.log(temporaryArray3 instanceof Array); console.log(temporaryArray3.constructor == Array); console.log(Array.isArray(temporaryArray3)); console.log(Object.prototype.toString.call(temporaryArray3) === "[object Array]");
let transformObject = Object.assign({}, temporaryArray3);
console.log(transformObject);
let transformObject2 = {...temporaryArray3}; console.log(transformObject2);
较经常使用的对象深拷贝方法:
let copyObject = JSON.parse(JSON.stringify(obj));
Object.assign
let temporaryObject2 = {a: 1, d: {e: 3}};
let temporaryObject3 = {b: 1,a: 2}; let mergeObject = Object.assign({}, temporaryObject2, temporaryObject3); console.log(mergeObject); /* mergeObject.d.e不会改变temporaryObject2里a的值,但会改变temporaryObject2里e的值 */ mergeObject.a = 5; mergeObject.d.e = 5; console.log(mergeObject);
数组slice浅拷贝
let copyArray1 = copyArray.slice(0);
数组concat浅拷贝
let copyArray2 = copyArray.concat();
...扩展运算符
const a1 = [1, 2];
// 写法一 const a2 = [...a1]; // 写法二 const [...a2] = a1;
上面的两种写法,a2
都是a1
的克隆。
const genNumArr = (length, limit) =>
Array.from({ length }, _ => Math.floor(Math.random() * limit)); genNumArr(10, 100);
data.forEach(ele => {
let parentId = ele.parentId; if (parentId === 0) { //是根元素的hua ,不作任何操做,若是是正常的for-i循环,能够直接continue. } else { //若是ele是子元素的话 ,把ele扔到他的父亲的child数组中. data.forEach(d => { if (d.id === parentId) { let childArray = d.child; if (!childArray) { childArray = [] } childArray.push(ele); d.child = childArray; } }) } }); //去除重复元素 data = data.filter(ele => ele.parentId === 0); console.log('最终等到的tree结构数据: ', data);
/**数组根据数组对象中的某个属性值进行排序的方法 * 使用例子:newArray.sort(sortBy('number',false)) //表示根据number属性降序排列;若第二个参数不传递,默认表示升序排序 * @param attr 排序的属性 如number属性 * @param rev true表示升序排列,false降序排序 * */ sortBy: function(attr,rev){ //第二个参数没有传递 默认升序排列 if(rev == undefined){ rev = 1; }else{ rev = (rev) ? 1 : -1; } return function(a,b){ a = a[attr]; b = b[attr]; if(a < b){ return rev * -1; } if(a > b){ return rev * 1; } return 0; } }
没有 Object.create、Object.setPrototypeOf 的早期版本中,new 运算是惟一一个能够指定 [[prototype]] 的方法(当时的 mozilla 提供了私有属性 __proto__,可是多数环境并不支持),因此,当时已经有人试图用它来代替后来的 Object.create,咱们甚至能够用它来实现一个 Object.create 的不完整的 polyfill,见如下代码:
Object.create = function(prototype){ function F(){}; F.prototype = prototype; return new F(); }
这段代码建立了一个空的构造函数做为类,并把传入的原型挂在了它的 prototype,最后建立了一个它的实例,根据 new 的行为,这将产生一个以传入的第一个参数为原型的对象。
注:这个函数没法作到与原生的 Object.create 一致,一个是不支持第二个参数,另外一个是不支持 null 做为原型,因此放到今天意义已经不大了。
var calculateDate = function(){ var date = newDate(); var weeks = ["日","一","二","三","四","五","六"]; return date.getFullYear()+"年"+(date.getMonth()+1)+"月"+ date.getDate()+"日 星期"+weeks[date.getDay()]; } $(function(){ $("#dateSpan").html(calculateDate()); })
functioncountdown(){
var endtime = newDate("Jan 18, 2015 23:50:00"); var nowtime = newDate(); if (nowtime >= endtime) { document.getElementById("_lefttime").innerHTML = "倒计时间结束"; return; } var leftsecond = parseInt((endtime.getTime() - nowtime.getTime()) / 1000); if (leftsecond < 0) { leftsecond = 0; } __d = parseInt(leftsecond / 3600 / 24); __h = parseInt((leftsecond / 3600) % 24); __m = parseInt((leftsecond / 60) % 60); __s = parseInt(leftsecond % 60); document.getElementById("_lefttime").innerHTML = __d + "天" + __h + "小时" + __m + "分" + __s + "秒"; } countdown(); setInterval(countdown, 1000);
function time(y,m){ var tempTime = newDate(y,m,0); var time = newDate(); var saturday = newArray(); var sunday = newArray(); for(var i=1;i<=tempTime.getDate();i++){ time.setFullYear(y,m-1,i); var day = time.getDay(); if(day == 6){ saturday.push(i); }elseif(day == 0){ sunday.push(i); } } var text = y+"年"+m+"月份"+"<br />" +"周六:"+saturday.toString()+"<br />" +"周日:"+sunday.toString(); document.getElementById("text").innerHTML = text; } time(2014,7);
function selectFrom(lower, upper) { var sum = upper - lower + 1; //总数-第一个数+1 return Math.floor(Math.random() * sum + lower); };
var objt = { name:' aaaa 这是一个空格多的标签 这是一个空格多的标签' } objt.name = objt.name.replace(/\s/g,' '); console.log(objt.name);
用firebug查看结果:
简单替换字符:string.replace("a","b"); (把 a 替换成 b)
全局替换字符:string.replace(/a/g,"b");(全局把a替换成b)
可是若是是全局替换一个变量内容,以下,给一个电话号码中间加*号:
var phone = "15512345678"; var sliceNumber = phone.slice(3,phone.length - 3); var newPhone = phone.replace(new RegExp(sliceNumber,'g'),'****'); console.log(newPhone); //155****678
RegExp
是javascript
中的一个内置对象。为正则表达式。RegExp.$1
是RegExp的一个属性,指的是与正则表达式匹配的第一个子匹配(以括号为标志)字符串,以此类推,RegExp.2, RegExp.3, ..RegExp.$99总共能够有99个匹配。
例如:
var r= /^(\d{4})-(\d{1,2})-(\d{1,2})$/; //正则表达式 匹配出生日期(简单匹配) r.exec('1985-10-15'); s1=RegExp.$1; s2=RegExp.$2; s3=RegExp.$3; console.log(s1+" "+s2+" "+s3)//结果为1985 10 15
//方法1: var separator=(num)=>{ if(!num){ return '0.00'; }; let str = parseFloat(num).toFixed(2); return str && str .toString() .replace(/(\d)(?=(\d{3})+\.)/g, function($0, $1) { return $1 + ","; }); } separator(386485473.88) //"386,485,473.88" //方法2: (386485473.88).toLocaleString('en-US') // "386,485,473.88" 由 (sRect)补充
var m=3; var n=5; var sum=m+n; var result = sum.toString(2); console.log(result); //1000
二进制输出:toString
函数
观察者模式(Observer mode)指的是函数自动观察数据对象,一旦对象有变化,函数就会自动执行。
const person = observable({
name: '张三', age: 20 }); function print() { console.log(`${person.name}, ${person.age}`) } observe(print); person.name = '李四'; // 输出 // 李四, 20
上面代码中,数据对象person
是观察目标,函数print
是观察者。一旦数据对象发生变化,print
就会自动执行。
下面,使用 Proxy 写一个观察者模式的最简单实现,即实现observable
和observe
这两个函数。思路是observable
函数返回一个原始对象的 Proxy 代理,拦截赋值操做,触发充当观察者的各个函数。
const queuedObservers = new Set(); const observe = fn => queuedObservers.add(fn); const observable = obj => new Proxy(obj, {set}); function set(target, key, value, receiver) { const result = Reflect.set(target, key, value, receiver); queuedObservers.forEach(observer => observer()); return result; }
上面代码中,先定义了一个Set
集合,全部观察者函数都放进这个集合。而后,observable
函数返回原始对象的代理,拦截赋值操做。拦截函数set
之中,会自动执行全部观察者。
function A( name ){ this.name = name; } function ObjectFactory(){ var obj = {}, Constructor = Array.prototype.shift.call( arguments ); obj.__proto__ = typeof Constructor.prototype === 'number' ? Object.prototype : Constructor.prototype; var ret = Constructor.apply( obj, arguments ); return typeof ret === 'object' ? ret : obj; } var a = ObjectFactory( A, 'mr mo' ); console.log ( a.name ); //mr mo
<form name="form" method="post" action="XXXX" accept-charset="utf-8" onsubmit="document.charset='utf-8';"> //内容 </form>
Javascript:
JQuery:
$(document).ready(function(){ alert($(window).height()); //浏览器当前窗口可视区域高度 alert($(document).height()); //浏览器当前窗口文档的高度 alert($(document.body).height());//浏览器当前窗口文档body的高度 alert($(document.body).outerHeight(true));//浏览器当前窗口文档body的总高度 包括border padding margin alert($(window).width()); //浏览器当前窗口可视区域宽度 alert($(document).width());//浏览器当前窗口文档对象宽度 alert($(document.body).width());//浏览器当前窗口文档body的宽度 alert($(document.body).outerWidth(true));//浏览器当前窗口文档body的总宽度 包括border padding margin })
jquery获取select选择的文本、值、索引:
//获取select 选中的 text : $("#ddlregtype").find("option:selected").text(); //获取select选中的 value: $("#ddlregtype ").val(); //获取select选中的索引: $("#ddlregtype ").get(0).selectedindex;
设置select选中的索引、选中的value:
//设置select 选中的索引: $("#ddlregtype ").get(0).selectedindex=index;//index为索引值 //设置select 选中的value: $("#ddlregtype ").attr("value","normal“); $("#ddlregtype ").val("normal"); $("#ddlregtype ").get(0).value = value;
jquery得到select中option的索引实例:
html代码:
<select class="select-green"> <option value="0">高级客户经理</option> <option value="1">中级客户经理</option> </select>
jquery代码:
$(".select-green").change(function(){ var _indx = $(this).get(0).selectedIndex; $(".selectall .selectCon").hide(); $(".selectall .selectCon").eq(_indx).fadeIn(); });
注:其中(this).get(0)与(this)[0]等价
带命名空间的事件(namespaced events)在jQuery 1.2就被加入了,可是没有几我的用,举例:
$('a').on('click', function() { // Handler 1 }); $('a').on('click', function() { // Handler 2 });
若是咱们想要移除第二个handler, 使用$(‘a’).off(‘click’)确会把两个handler都移除掉!
可是若是使用带命名空间的事件,就能够搞定:
$('a').on('click.namespace1', function() { //Handler 1 }); $('a').on('click.namespace2', function() { //Handler 2 });
使用以下代码移除:
$('a').off('click.namespace2');
$('input').removeAttr('Readonly');
$('input').attr('Readonly','true');
<script>
// Bind an event to window.orientationchange that, when the device is turned, // gets the orientation and displays it to on screen. $( window ).on( "orientationchange", function( event ) { //alert (event.orientation ) if (event.orientation=='portrait') { $('body').css('transform', 'rotate(90deg)'); } else { $('body').css('transform', 'rotate(0deg)'); } }); // You can also manually force this event to fire. $( window ).orientationchange(); </script>
var browser = { versions:function(){ var u = navigator.userAgent.toLowerCase(); return { trident: u.indexOf('trident') > -1, presto: u.indexOf('presto') > -1, isChrome: u.indexOf("chrome") > -1 && u.indexOf("safari") > -1 && !(u.indexOf("qqbrowser") > -1), qqbrowser: u.indexOf("qqbrowser") > -1, isFirefox: u.indexOf('firefox') > -1, isSafari: !(u.indexOf("chrome") > -1) && (/webkit|khtml/).test(u) && u.indexOf('safari') > -1, webKit: u.indexOf('applewebkit') > -1, gecko: u.indexOf('gecko') > -1 && u.indexOf('khtml') == -1, mobile: !!u.match(/applewebkit.*mobile.*/), ios: !!u.match(/\(i[^;]+;( u;)? cpu.+mac os x/), android: u.indexOf('android') > -1 || u.indexOf('linux') > -1, iPhone: u.indexOf('iphone') > -1, iPad: u.indexOf('ipad') > -1, iWinPhone: u.indexOf('windows phone') > -1, isWeiXin:!!u.match(/MicroMessenger/i) } } } if(browser.versions.mobile || browser.versions.iWinPhone){ console.log('手机'); }else{ console.log('pc'); }
通常若是变量经过var声明,可是并未初始化的时候,变量的值为undefined,而未定义的变量则须要经过 "typeof 变量"的形式来判断,不然会发生错误。
实际应用:
variable有的页面咱们不定义,但有的页面定义了,就能够须要这样的判断方法,没有定义的就不执行。
if("undefined" != typeof variable){ if(variable=="abc"){ console.log('成功'); } }
function addFavorite(title, url) { url = encodeURI(url); try { window.external.addFavorite(url, title); } catch (e) { try { window.sidebar.addPanel(title, url, ""); } catch (e) { alert("加入收藏失败,Ctrl+D进行添加"); } } } addFavorite(document.title,window.location);
html代码:
<input type="file" id="filePath" onchange="getFileSize(this)"/>
js代码:
//兼容IE9低版本获取文件的大小 function getFileSize(obj){ var filesize; if(obj.files){ filesize = obj.files[0].size; }else{ try{ var path,fso; path = document.getElementById('filePath').value; fso = new ActiveXObject("Scripting.FileSystemObject"); filesize = fso.GetFile(path).size; } catch(e){ //在IE9及低版本浏览器,若是不允许ActiveX控件与页面交互,点击了否,就没法获取size console.log(e.message); //Automation 服务器不能建立对象 filesize = 'error'; //没法获取 } } return filesize; }
若是是高版本浏览器,通常在HTML代码中写就能实现,如:
<input type="file" name="filePath" accept=".jpg,.jpeg,.doc,.docxs,.pdf">
若是限制上传文件为图片类型,以下:
<input type="file" class="file" value="上传" accept="image/*"/>
可是在其它低版本浏览器就无论用了,须要js来判断。
html代码:
<input type="file" id="filePath" onchange="limitTypes()"/>
js代码:
/* 经过扩展名,检验文件格式。 *@parma filePath{string} 文件路径 *@parma acceptFormat{Array} 容许的文件类型 *@result 返回值{Boolen}:true or false */ function checkFormat(filePath,acceptFormat){ var resultBool= false, ex = filePath.substring(filePath.lastIndexOf('.') + 1); ex = ex.toLowerCase(); for(var i = 0; i < acceptFormat.length; i++){ if(acceptFormat[i] == ex){ resultBool = true; break; } } return resultBool; }; function limitTypes(){ var obj = document.getElementById('filePath'); var path = obj.value; var result = checkFormat(path,['bmp','jpg','jpeg','png']); if(!result){ alert('上传类型错误,请从新上传'); obj.value = ''; } }
异步加载也叫非阻塞模式加载,浏览器在下载js
的同时,同时还会执行后续的页面处理。
在script
标签内,用js
建立一个script
元素并插入到document
中,这种就是异步加载js
文件了:
(function() { var s = document.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = 'http://yourdomain.com/script.js'; var x = document.getElementsByTagName('script')[0]; x.parentNode.insertBefore(s, x); })();
同步加载,日常默认用的都是同步加载。如:
<script src="http://yourdomain.com/script.js"></script>
同步模式又称阻塞模式,会阻止流览器的后续处理。中止了后续的文件的解析,执行,如图像的渲染。浏览器之因此会采用同步模式,是由于加载的js
文件中有对dom
的操做,重定向,输出document
等默认行为,因此同步才是最安全的。
一般会把要加载的js
放到body
结束标签以前,使得js
可在页面最后加载,尽可能减小阻塞页面的渲染。这样能够先让页面显示出来。
同步加载流程是瀑布模型,异步加载流程是并发模型。
首先了解下浏览器的同源策略
同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,若是缺乏了同源策略,浏览器很容易受到XSS、CSRF等攻击。所谓同源是指"协议+域名+端口"三者相同,即使两个不一样的域名指向同一个ip地址,也非同源。
那么怎样解决跨域问题的呢?
1 经过jsonp跨域
1.)原生实现: <script> var script = document.createElement('script'); script.type = 'text/javascript'; // 传参并指定回调执行函数为onBack script.src = 'http://www.....:8080/login?user=admin&callback=onBack'; document.head.appendChild(script); // 回调执行函数 function onBack(res) { alert(JSON.stringify(res)); } </script> 二、 document.domain + iframe跨域 此方案仅限主域相同,子域不一样的跨域应用场景。 1.)父窗口:(http://www.domain.com/a.html) <iframe id="iframe" src="http://child.domain.com/b.html"></iframe> <script> document.domain = 'domain.com'; var user = 'admin'; </script> 2.)子窗口:(http://child.domain.com/b.html) <script> document.domain = 'domain.com'; // 获取父窗口中变量 alert('get js data from parent ---> ' + window.parent.user); </script> 弊端:请看下面渲染加载优化 3、 nginx代理跨域 4、 nodejs中间件代理跨域 五、 后端在头部信息里面设置安全域名
更多跨域的具体内容请看《跨域详解》
var reader = new FileReader(); reader.onload = function (event) { // event.target.result就是文件文本内容 // 而后你就能够随心所欲了 // 例如若是是JSON数据能够解析 // 若是是HTML数据,能够直接插入到页面中 // 甚至字幕文件,各类滤镜,自定义文件格式,均可以…… }; reader.readAsText(file);
详细参考地址:小tips: 纯前端JS读取与解析本地文本类文件
先看下网上一个简单的代码片断:
let blob = new Blob([res], { type: `application / pdf` //word文档为msword,pdf文档为pdf }); let objectUrl = URL.createObjectURL(blob); let link = document.createElement("a"); let fname = `个人文档`; //下载文件的名字 link.href = objectUrl; link.setAttribute("download", fname); document.body.appendChild(link); link.click();
全面:
/** * @param {String} resource 文件流 * @param {String} fileType 文件类型 * @param {String} fileName 文件名 * */ var downloadBlob=function(resource,fileType,fileName){ var data = new Blob([resource],{ type:fileType }); if('download' in document.createElement('a')){ //非IE var downloadUrl = window.URL.createObjectURL(data); var anchor = document.createElement("a"); anchor.href = downloadUrl; anchor.download = fileName; anchor.style.display = 'none'; document.body.appendChild(anchor); anchor.click(); window.URL.revokeObjectURL(anchor.href); document.body.removeChild(anchor); }else{ //IE10+下载 navigator.msSaveBlob(data, fileName); } }
调用方式:
downloadBlob(res,'application/pdf','文档名称')
html2canvas官网:http://html2canvas.hertzen.com/
<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script> <script type="text/javascript" src="js/html2canvas.min.js"></script> <script type="text/javascript"> $(function(){ $('#button').on('click',function(){ html2canvas(document.querySelector("#capture")).then(canvas => { document.body.appendChild(canvas); let base64 = canvas.toDataURL('images/png'); let a = document.createElement('a'); a.href = base64; a.download = 'download'; a.click(); }); }) }) </script>
/** * 文本聚焦位置添加新文本 * @param {Object} myField聚焦的DOM对象 * @param {String} myValue文本框初始值 * @result {String} 返回文本框的value值 * */ function insertTextFromFocus(myField,myValue){ //IE 浏览器 if (document.selection) { myField.focus(); var sel = document.selection.createRange(); sel.text = myValue; sel.select(); } //FireFox、Chrome等 else if (myField.selectionStart || myField.selectionStart == '0') { var startPos = myField.selectionStart; var endPos = myField.selectionEnd; // 保存滚动条 var restoreTop = myField.scrollTop; myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length); if (restoreTop > 0) { myField.scrollTop = restoreTop; } myField.focus(); myField.selectionStart = startPos + myValue.length; myField.selectionEnd = startPos + myValue.length; } else { myField.value += myValue; myField.focus(); } return myField.value }
调用方式:
this.dialogRepTemp.content = insertTextFromFocus(this.$refs.content.$el.children[0],data.variable)
删除线:~~ ~~
包裹的文字会显示删除线 删除线
200:OK 请求成功。通常用于GET与POST请求
204:No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的状况下,可确保浏览器继续显示当前文档
304:Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端一般会缓存访问过的资源,经过提供一个头信息指出客户端但愿只返回在指定日期以后修改的资源
400:Bad Request 客户端请求的语法错误,服务器没法理解
403:Forbidden 服务器理解请求客户端的请求,可是拒绝执行此请求
404:Not Found 服务器没法根据客户端的请求找到资源(网页)。经过此代码,网站设计人员可设置"您所请求的资源没法找到"的个性页面