模块化


不同功能的js放入不同的文件
每个文件用立即执行函数封装
! function () {}.call
如果要相互访问,可以使用闭包,传出一个函数让其他文件操作部分功能
var a = function(){var bb = 1;return function(){return bb+1;}}.call()! function(){var bb = 1;window.grow = function(){return bb+1;}}.call()
将每个文件封装成MVC对象
! function () {/**添加导航菜单事件 */let view = document.getElementsByClassName('menuTrigger');var controller = {view: null,init: function (view) {this.view = view;this.bindEvents()},bindEvents: function () {var view = this.viewfor (let i = 0; i < view.length; i++) {view[i].onmouseenter = function (e) {e.currentTarget.classList.add('active')}view[i].onmouseleave = function (e) {e.currentTarget.classList.remove('active')}}}}controller.init(view);}.call()
! function () {var view = document.querySelector('.content')var controller = {view: null,swiper: null,swiperOptions: {loop: true,pagination: {el: '.swiper-pagination',},navigation: {nextEl: '.swiper-button-next',prevEl: '.swiper-button-prev',}},init: function (view) {this.view = viewconsole.log(this.view)this.initSwiper()},initSwiper: function () {this.swiper = new Swiper(this.view.querySelector('.swiper-container'), this.swiperOptions)}}controller.init(view)}.call()
! function () {var view = document.querySelector('section.message')var model = {init: function () {var APP_ID = 'qXl6W9vxbolyxcUCjs67LHQq-gzGzoHsz';var APP_KEY = 'eOq0UluoW79IgUqEyAp1YIYe';AV.init({appId: APP_ID,appKey: APP_KEY});},fetch: function () {var query = new AV.Query('Message');return query.find()},save: function (name, content) {var Message = AV.Object.extend('Message');var message = new Message();return message.save({'name': name,'content': content})}}var controller = {view: null,model: null,messageList: null,form: null,init: function (view, model) {this.view = viewthis.model = modelthis.messageList = view.querySelector('#messageList')this.form = view.querySelector('form')this.model.init()this.loadMessages()this.bindEvents()},loadMessages: function () {this.model.fetch().then((messages) => {let array = messages.map(item => item.attributes)array.forEach(item => {let li = document.createElement('li')li.innerText = `${item.name}: ${item.content}`this.messageList.append(li)});},function (error) {console.log(error)});},saveMessage: function () {let myForm = this.formlet content = myForm.querySelector('input[name=content]').valuelet name = myForm.querySelector('input[name=name]').valuethis.model.save(name, content).then(function (object) {let li = document.createElement('li')li.innerText = `${object.attributes.name}: ${object.attributes.content}`this.messageList.append(li)myForm.querySelector('input[name=content]').value = ''})},bindEvents: function () {let myForm = this.formmyForm = document.querySelector('#postMessage')var that = thismyForm.addEventListener('submit', function (e) {e.preventDefault()that.saveMessage()})}}controller.init(view, model)}.call()
MVC
window.View = function (selector) {return document.querySelector(selector)}
window.Model = function ({resourceName}) {return {init: function () {var APP_ID = 'qXl6W9vxbolyxcUCjs67LHQq-gzGzoHsz';var APP_KEY = 'eOq0UluoW79IgUqEyAp1YIYe';AV.init({appId: APP_ID,appKey: APP_KEY});},fetch: function () {var query = new AV.Query(resourceName);return query.find()},save: function (object) {var Instance = AV.Object.extend(resourceName);var ins = new Instance();return ins.save(object)}}}
window.Controller = function (options) {var init = options.initvar object = {view: null,model: null,init: function (view, model) {console.log(this)this.view = viewthis.model = modelthis.model.init()init.call(this, view, model)this.bindEvents.call(this)}}for (const key in options) {if (key !== 'init') {object[key] = options[key]}}return object}
! function () {var view = View('section.message')var model = Model({resourceName: 'Message'})var controller = Controller({messageList: null,form: null,init: function (view, model) {console.log(this)this.messageList = view.querySelector('#messageList')this.form = view.querySelector('form')this.loadMessages()},loadMessages: function () {this.model.fetch().then((messages) => {let array = messages.map(item => item.attributes)array.forEach(item => {let li = document.createElement('li')li.innerText = `${item.name}: ${item.content}`this.messageList.append(li)});},function (error) {console.log(error)});},saveMessage: function () {let myForm = this.formlet content = myForm.querySelector('input[name=content]').valuelet name = myForm.querySelector('input[name=name]').valuethis.model.save({'name': name,'content': content}).then(function (object) {let li = document.createElement('li')li.innerText = `${object.attributes.name}: ${object.attributes.content}`this.messageList.append(li)myForm.querySelector('input[name=content]').value = ''})},bindEvents: function () {this.form.addEventListener('submit', (e) => {e.preventDefault()this.saveMessage()})}})controller.init(view, model)}.call()
命名空间
模块化开发,防止污染全局变量
多人开发,对象命名容易重复,就要
解决命名空间的问题
老旧的解决方法:
用闭包来解决(也可用 webpack),返回方法的调用,变量也污染全局变量
