hakunamatata v0.0.1-security
此处为示例文字
每天成长一点点,距离成功不会远。
操作Cookie 和 操作class (2016-03-28)
今天公司要求做一个旧网站提示框,规则是一浏览器12小时谈一次提示框,于是对于超级水的我就开始长途跋涉的‘旅程’
首先分析需求:
1、12小时
1.1 实现这个我首先想到的是
Web Storage
,但是localStorage
我还不知道怎么给他设置时间让它失效。SO ,就默认选择了Cookie
。 要操作Cookie
的话,首先自己得封装几个方法:function setCookie(name, value, seconds) { //设置cookie seconds = seconds || 0; var expires = ""; if (seconds != 0) { var date = new Date(); date.setTime(date.getTime() + (seconds * 1000)); expires = "; expires=" + date.toGMTString(); } document.cookie = name + "=" + escape(value) + expires + "; path=/"; } function getCookie(name) { //取得cookie var nameEQ = name + "="; var ca = document.cookie.split(';'); for (var i = 0; i < ca.length; i++) { var c = ca[i]; while (c.charAt(0) == ' ') { c = c.substring(1, c.length); } if (c.indexOf(nameEQ) == 0) { return unescape(c.substring(nameEQ.length, c.length)); } } return false; } function clearCookie(name) { //清除cookie setCookie(name, "", -1); }
1.2 为了方便起见,还是全局封装下class的操作方法吧
'use strict'; function classReg(className) { return new RegExp("(^|\\s+)" + className + "(\\s+|$)"); } var hasClass, addClass, removeClass; if ('classList' in document.documentElement) { hasClass = function(elem, c) { return elem.classList.contains(c); }; addClass = function(elem, c) { elem.classList.add(c); }; removeClass = function(elem, c) { elem.classList.remove(c); }; } else { hasClass = function(elem, c) { return classReg(c).test(elem.className); }; addClass = function(elem, c) { if (!hasClass(elem, c)) { elem.className = elem.className + ' ' + c; } }; removeClass = function(elem, c) { elem.className = elem.className.replace(classReg(c), ' '); }; } function toggleClass(elem, c) { var fn = hasClass(elem, c) ? removeClass : addClass; fn(elem, c); } var classie = { // full names hasClass: hasClass, addClass: addClass, removeClass: removeClass, toggleClass: toggleClass, // short names has: hasClass, add: addClass, remove: removeClass, toggle: toggleClass }; // transport if (typeof define === 'function' && define.amd) { // AMD define(classie); } else { // browser global window.classie = classie; }
2、弹一次
2.1 辅助工作已经做好,现在就开始造起来 首先看一下HTML
<div class="md-modal md-effect-show" id="modal-popup"> //弹出框 <div class="md-content"> <div class="md-topbg"> <button class="md-close">Close me!</button> <!--注意这里有个图片的路径--> <img src="images/pop_upbg.png" alt=""> <p>视觉中国 — 中国领先的创意图片、编辑图片、视频音乐素材及视觉相关服务供应商</p> </div> <div class="md-conbody"> <p>尊敬的用户: <br> 视觉中国已经启用全新的版权交易平台 <a href="http://www.vcg.com">http://www.vcg.com</a> <br> 您可以保留原账户信息进行登录和使用,新网站将为您提供更为丰富的内容和更加便捷的使用体验。 <br> 旧版网站目前已经停止更新,并将在适当的时间迁移至新网址。 </p> </div> <div class="md-congoto"> <a href="" class="md-gotonew">进入新网站</a> </div> </div> </div> <div class="md-overlay"></div> //灰的背景层
主要CSS<br />
.md-modal { position: fixed; top: 50%; left: 50%; width: 780px; max-width: 780px; min-width: 320px; height: auto; z-index: 2000; visibility: hidden; -webkit-backface-visibility: hidden; -moz-backface-visibility: hidden; backface-visibility: hidden; -webkit-transform: translateX(-50%) translateY(-50%); -moz-transform: translateX(-50%) translateY(-50%); -ms-transform: translateX(-50%) translateY(-50%); transform: translateX(-50%) translateY(-50%); } .md-show { visibility: visible; } .md-overlay { position: fixed; width: 100%; height: 100%; visibility: hidden; top: 0; left: 0; z-index: 1000; opacity: 0; background: rgba(0,0,0,0.4); -webkit-transition: all 0.3s; -moz-transition: all 0.3s; transition: all 0.3s; } .md-show ~ .md-overlay { opacity: 1; visibility: visible; } //动画 .md-effect-show.md-modal { -webkit-perspective: 1300px; -moz-perspective: 1300px; perspective: 1300px; } .md-effect-show .md-content { -webkit-transform-style: preserve-3d; -moz-transform-style: preserve-3d; transform-style: preserve-3d; -webkit-transform: rotateX(-70deg); -moz-transform: rotateX(-70deg); -ms-transform: rotateX(-70deg); transform: rotateX(-70deg); -webkit-transition: all 0.3s; -moz-transition: all 0.3s; transition: all 0.3s; opacity: 0; } .md-show.md-effect-show .md-content { -webkit-transform: rotateX(0deg); -moz-transform: rotateX(0deg); -ms-transform: rotateX(0deg); transform: rotateX(0deg); opacity: 1; }
2.2 JS 逻辑
function init() { var overlay = document.querySelector('.md-overlay'); //获取灰色背景层 var modal = document.querySelector('#modal-popup'), //获取弹出框 close = modal.querySelector('.md-close'); //获取右上角关闭按钮 // function removeModal() { classie.remove(modal, 'md-show'); } // function removeModalHandler() { removeModal(classie.has(modal, 'md-setperspective')); } //根据Cookie的Popupgotonew的值判断是否显示弹出框 if ( getCookie("Popup_gotonew") != 1 ) { classie.add(modal, 'md-show'); overlay.removeEventListener('click', removeModalHandler); overlay.addEventListener('click', removeModalHandler); setCookie("Popup_gotonew","1",43200); } //关闭按钮的功能 close.addEventListener('click', function(ev) { ev.stopPropagation(); removeModalHandler(); }); } // init();
浅谈.querySelectorAll() (未完,待续)
返回一个静态的NodeList对象,这个对象将会包含调用querySelectorAll()方法的那个DOM对象的所有后代元素中匹配指定css选择器的元素集.
属性 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
基础支持 | 1 | 3.5 (1.9.1) | 8 | 10 | 3.2 (525.3) |
以前经常使用getElementsByTagName()、getElementsByName()、getElementById()时,感觉querySelectorAll()方便的多。 但是后再仔细查了下它的文档并经过测试,
getElementsByTagName('a')
在所有浏览器下都比querySelectorAll('a')
快很多倍,有一个测试页面
初学BackBone.js
BackBone.js
是由 Jeremy Ashkenas 2010年创建的一个轻量级的MVC javascript库,可用于创建 MVC 类应用程序。
是一个很灵活的MVC框架,可以与其它框架很好的协作。
BackBone
:
- 强制依赖于Underscore.js, 它是个实用型库。
- 非强制依赖 jQuery 。
- 根据模型的变更自动更新应用程序的 HTML , 有助于代码维护。
- 促进客户端模板使用,避免了在javascript中嵌入HTML代码。
backbone最适合的场景:需要用 JS 生成大量的HTML页面内容,并且用户跟页面有很多交互行为。
优点
1,前后端分离(前后端可以并行开发) 2,减轻服务器的压力(后端只需要吐数据,不用处理和渲染整个页面) 3,更好的用户体验(用户只是首次登录网站时需要等待多个JS文件,其他页面网络好的话几乎秒出) 4,前端的机会增加(挑战增加的同时价值也会更高,也会变得更重要)
缺点
1,SEO的问题 2,初次加载loading的问题(因为多个js模块在加载)
backbone 对象有5个重要的函数:(帮我们规范了编码以及代码结构,它提供的功能也已经满足我们的基本需求了, 需要更细致, 更复杂的功能, 我们只需要对其进行拓展即可。)
- Model (模型)包含了”Controller”的逻辑,同时路由帮助我们管理应用的状态,但是它们都不是传统意义上的Controller。
- Collection (同一 Model 数据的集合)是 Model 的集合, 可以把它俩理解为一个是数组, 一个是数组中的元素。
- View (视图)渲染、处理。每个 View 对象都是有对应的 DOM 元素的。
- Router (路由)声明需要监听的URL规则和Action【帮助我们管理应用的状态】。
- History ()用于监听URL的变化,以及触发Action方法。
Model
Model 通过调用 Backbone.Model.extend 函数来编写我们的 Model 类:
var User = Backbone.Model.extend({
defaults: {
staff: false
},
initialize: function() {
// 初始化操作
}
});
Collection
Collection 类是同一 Model 数据的集合:
var Users = Backbone.Collection.extend({
model: User
});
View
每个 View 对象都是有对应的 DOM 元素的, 我们在 extend 函数中设置 el 属性来使该 View 的对象 DOM 元素相关联:
var UserView = Backbone.View.extend({
el: 'body',
template: _.template('<div class="user-view"></div>'),
initialize: function() {
this.render();
},
render: function() {
this.$el.html(this.template());
}
});
new UserView();
设置 el 属性只是其中的一个方法, 我们还可以通过 setElement 函数来实现:
var UserView = Backbone.View.extend({
template: _.template(''),
initialize: function() {
this.setElement('<div class="user-view">');
this.render();
},
render: function() {
this.$el.html(this.template && this.template());
}
});
$('body').html(new UserView().$el);
Router
声明需要监听的URL规则和Action。
var UserRouter = Backbone.Router.extend({
routes: {
'help': function() {
...
},
'search/:query': 'search'
}
search: function(query) {
...
}
});
Underscore入门
Underscore 是一个javascript的工具库,它提供了一套函数式编程的实用功能。
- 包含100多个独立的函数,和jquery相辅相成。
- Collection、Arrays、Functions、Objects、Utility。
Collection
(回家,待续......)