// 自执行函数 // 形成一个独立的作用域 // 通过原形模拟类 // 注意 以前js没有类的概念,现在有!!! // 以前没有类的概念,但是我们可以通过其他方法来模拟类 // 挂载到window上的方法或者变量都将成为全局变量|方法 (function (bom,dom) { // 插件的默认配置 var defaultOption = { // 内容被激活的类名 contentActive: "content_on", // 标题被激活的类名 titleActive: "title_on", titleFather: ".tabs_title", contentFather: ".tabs_content" }; function tabs(params) { if(typeof params == "object" && params.hasOwnProperty("titleArray") && params.hasOwnProperty("contentArray")) { // 将用户传递过来的参数进行保存,保存到 tabs中, ///成tabs的私有属性,然后下面的其他方法就可以使用了 this.option = { titleArray: params.titleArray, contentArray: params.contentArray }; // 不必要的参数,如果用户传递了标题和内容的激活类名,那么采用用户的,如果没传 // 那么采取系统默认的 defaultOption.titleActive = params.titleActive || defaultOption.titleActive defaultOption.contentActive = params.contentActive || defaultOption.contentActive // 不用 + 进行字符串拼接 this.dom = { titleFather: document.querySelector(`${defaultOption.titleFather} ul`), contentFather: document.querySelector(`${defaultOption.contentFather} ul`) } this.init(); }else { //console.error("抱歉,插件运行需要参数") throw new Error("抱歉,插件运行需要参数"); } } tabs.prototype = { // 插件初始化方法 init() { this.renderPage(); this.dom.titleChildenli = document.querySelectorAll(`${defaultOption.titleFather} ul li`) this.dom.contentChildenli = document.querySelectorAll(`${defaultOption.contentFather} ul li`) this.bindEvent() }, // 渲染数组成为页面 renderPage() { var title = "",content=""; for(var i = 0;i${this.option.titleArray[i]}` content += `
  • ${this.option.contentArray[i]}
  • ` } this.dom.titleFather.innerHTML = title this.dom.contentFather.innerHTML = content }, // es5 老旧的js语法 // es6, 7 => `` let // babel 将最新的js语法转换为 es5(浏览器能认识的兼容性比较好的) bindEvent() { var self = this; for(let i= 0;i