模块化

模块化 命名空间 - 图1

模块化 命名空间 - 图2

不同功能的js放入不同的文件

每个文件用立即执行函数封装

  1. ! function () {}.call

如果要相互访问,可以使用闭包,传出一个函数让其他文件操作部分功能

  1. var a = function(){
  2. var bb = 1;
  3. return function(){
  4. return bb+1;
  5. }
  6. }.call()
  7. ! function(){
  8. var bb = 1;
  9. window.grow = function(){
  10. return bb+1;
  11. }
  12. }.call()

将每个文件封装成MVC对象

  1. ! function () {
  2. /**添加导航菜单事件 */
  3. let view = document.getElementsByClassName('menuTrigger');
  4. var controller = {
  5. view: null,
  6. init: function (view) {
  7. this.view = view;
  8. this.bindEvents()
  9. },
  10. bindEvents: function () {
  11. var view = this.view
  12. for (let i = 0; i < view.length; i++) {
  13. view[i].onmouseenter = function (e) {
  14. e.currentTarget.classList.add('active')
  15. }
  16. view[i].onmouseleave = function (e) {
  17. e.currentTarget.classList.remove('active')
  18. }
  19. }
  20. }
  21. }
  22. controller.init(view);
  23. }.call()
  1. ! function () {
  2. var view = document.querySelector('.content')
  3. var controller = {
  4. view: null,
  5. swiper: null,
  6. swiperOptions: {
  7. loop: true,
  8. pagination: {
  9. el: '.swiper-pagination',
  10. },
  11. navigation: {
  12. nextEl: '.swiper-button-next',
  13. prevEl: '.swiper-button-prev',
  14. }
  15. },
  16. init: function (view) {
  17. this.view = view
  18. console.log(this.view)
  19. this.initSwiper()
  20. },
  21. initSwiper: function () {
  22. this.swiper = new Swiper(this.view.querySelector('.swiper-container'), this.swiperOptions)
  23. }
  24. }
  25. controller.init(view)
  26. }.call()
  1. ! function () {
  2. var view = document.querySelector('section.message')
  3. var model = {
  4. init: function () {
  5. var APP_ID = 'qXl6W9vxbolyxcUCjs67LHQq-gzGzoHsz';
  6. var APP_KEY = 'eOq0UluoW79IgUqEyAp1YIYe';
  7. AV.init({
  8. appId: APP_ID,
  9. appKey: APP_KEY
  10. });
  11. },
  12. fetch: function () {
  13. var query = new AV.Query('Message');
  14. return query.find()
  15. },
  16. save: function (name, content) {
  17. var Message = AV.Object.extend('Message');
  18. var message = new Message();
  19. return message.save({
  20. 'name': name,
  21. 'content': content
  22. })
  23. }
  24. }
  25. var controller = {
  26. view: null,
  27. model: null,
  28. messageList: null,
  29. form: null,
  30. init: function (view, model) {
  31. this.view = view
  32. this.model = model
  33. this.messageList = view.querySelector('#messageList')
  34. this.form = view.querySelector('form')
  35. this.model.init()
  36. this.loadMessages()
  37. this.bindEvents()
  38. },
  39. loadMessages: function () {
  40. this.model.fetch()
  41. .then(
  42. (messages) => {
  43. let array = messages.map(item => item.attributes)
  44. array.forEach(item => {
  45. let li = document.createElement('li')
  46. li.innerText = `${item.name}: ${item.content}`
  47. this.messageList.append(li)
  48. });
  49. },
  50. function (error) {
  51. console.log(error)
  52. }
  53. );
  54. },
  55. saveMessage: function () {
  56. let myForm = this.form
  57. let content = myForm.querySelector('input[name=content]').value
  58. let name = myForm.querySelector('input[name=name]').value
  59. this.model.save(name, content)
  60. .then(function (object) {
  61. let li = document.createElement('li')
  62. li.innerText = `${object.attributes.name}: ${object.attributes.content}`
  63. this.messageList.append(li)
  64. myForm.querySelector('input[name=content]').value = ''
  65. })
  66. },
  67. bindEvents: function () {
  68. let myForm = this.form
  69. myForm = document.querySelector('#postMessage')
  70. var that = this
  71. myForm.addEventListener('submit', function (e) {
  72. e.preventDefault()
  73. that.saveMessage()
  74. })
  75. }
  76. }
  77. controller.init(view, model)
  78. }.call()

MVC

  1. window.View = function (selector) {
  2. return document.querySelector(selector)
  3. }
  1. window.Model = function ({
  2. resourceName
  3. }) {
  4. return {
  5. init: function () {
  6. var APP_ID = 'qXl6W9vxbolyxcUCjs67LHQq-gzGzoHsz';
  7. var APP_KEY = 'eOq0UluoW79IgUqEyAp1YIYe';
  8. AV.init({
  9. appId: APP_ID,
  10. appKey: APP_KEY
  11. });
  12. },
  13. fetch: function () {
  14. var query = new AV.Query(resourceName);
  15. return query.find()
  16. },
  17. save: function (object) {
  18. var Instance = AV.Object.extend(resourceName);
  19. var ins = new Instance();
  20. return ins.save(object)
  21. }
  22. }
  23. }
  1. window.Controller = function (options) {
  2. var init = options.init
  3. var object = {
  4. view: null,
  5. model: null,
  6. init: function (view, model) {
  7. console.log(this)
  8. this.view = view
  9. this.model = model
  10. this.model.init()
  11. init.call(this, view, model)
  12. this.bindEvents.call(this)
  13. }
  14. }
  15. for (const key in options) {
  16. if (key !== 'init') {
  17. object[key] = options[key]
  18. }
  19. }
  20. return object
  21. }
  1. ! function () {
  2. var view = View('section.message')
  3. var model = Model({
  4. resourceName: 'Message'
  5. })
  6. var controller = Controller({
  7. messageList: null,
  8. form: null,
  9. init: function (view, model) {
  10. console.log(this)
  11. this.messageList = view.querySelector('#messageList')
  12. this.form = view.querySelector('form')
  13. this.loadMessages()
  14. },
  15. loadMessages: function () {
  16. this.model.fetch()
  17. .then(
  18. (messages) => {
  19. let array = messages.map(item => item.attributes)
  20. array.forEach(item => {
  21. let li = document.createElement('li')
  22. li.innerText = `${item.name}: ${item.content}`
  23. this.messageList.append(li)
  24. });
  25. },
  26. function (error) {
  27. console.log(error)
  28. }
  29. );
  30. },
  31. saveMessage: function () {
  32. let myForm = this.form
  33. let content = myForm.querySelector('input[name=content]').value
  34. let name = myForm.querySelector('input[name=name]').value
  35. this.model.save({
  36. 'name': name,
  37. 'content': content
  38. })
  39. .then(function (object) {
  40. let li = document.createElement('li')
  41. li.innerText = `${object.attributes.name}: ${object.attributes.content}`
  42. this.messageList.append(li)
  43. myForm.querySelector('input[name=content]').value = ''
  44. })
  45. },
  46. bindEvents: function () {
  47. this.form.addEventListener('submit', (e) => {
  48. e.preventDefault()
  49. this.saveMessage()
  50. })
  51. }
  52. })
  53. controller.init(view, model)
  54. }.call()

命名空间

模块化开发,防止污染全局变量
多人开发,对象命名容易重复,就要 解决命名空间的问题

老旧的解决方法:
image.png

用闭包来解决(也可用 webpack),返回方法的调用,变量也污染全局变量
image.png