热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

怎样创建与框架无关的JavaScript插件

怎样创建与框架无关的JavaScript插件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易

怎样创建与框架无关的Javascript插件,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

Javascript中的插件使我们能够扩展语言,以实现所需的某些强大(或不够强大)的功能。插件/库本质上是打包的代码,可以使我们免于一遍又一遍地编写相同的东西(功能)。

在Javascript生态系统中,有数百个框架,这些框架中的每一个都为我们提供了一个创建插件的系统,以便为框架添加新的东西。

如果你看一下NPM注册表,几乎所有的Javascript插件都是在那里发布的,你会看到有超过一百万个插件以简单库和框架的形式发布。

为每个框架创建插件的方式可能会有很大不同。例如,Vue.js有自己的插件系统,这与你为React.js创建插件的方式不同。然而,这一切都归结为相同的Javascript代码。

因此,使用普通Javascript创建插件,让你有能力创建一个无论在哪个框架下都能使用。

“与框架无关的Javascript插件是无需框架上下文即可工作的插件,您可以在任何框架(甚至没有框架)中使用插件”

构建库时要记住的事项

  • 您应该对插件有一个目标——这是插件要实现的关键

  • 您的插件应易于使用以达到预期用途

  • 您的插件应在很大程度上可定制

  • 您的插件应该有一个文档,指导将要使用该插件的开发人员

现在,让我们着眼于上述几点。

我们将创造什么

在本文中,我将向您展示如何创建与框架无关的插件。在本教程中,我们将创建一个旋转木马/幻灯片插件——该插件的目标。

这个插件会暴露一些方法,可以被插件的用户调用 .next() 和 .prev()

起步

让我们创建一个新的文件夹来存放我们的插件代码和任何其他必要的文件,我将把我的文件夹称为 TooSlidePlugin。

在这个文件夹中,在你喜欢的编辑器中创建一个新的Javascript文件。这个文件将包含插件的代码,我把我的文件叫做 tooSlide.js。

有时,我什至想像在开始创建插件之前(从最终开发人员的角度)如何使用插件。

var slider = new ToolSidePlugin({   slideClass: ".singleSlide",   container: ".slideContainer",   nextButton: ".next",   previousButton: ".prev" })

上面的代码假定有一个名为 TooSlides 的构造函数,该构造函数接收具有某些属性的对象作为参数。对象的属性是  slidesClass、container、nextButton 和 previousButton,这些是我们希望用户能够自定义的属性。

我们将从将插件创建为单个构造函数开始,以便其本身具有名称空间。

function ToolSidePlugin() {    }

Options

由于我们的插件,TooSlides 需要一个选项参数,所以我们会定义一些默认的属性,这样如果我们的用户没有指定自己的属性,就会使用默认的属性。

function ToolSidePlugin(options) {   let defaultOptions = {     slideClass: ".singleSlide",     container: ".slideContainer",     nextButton: ".nextSlide",     previousButton: ".previousSlide"   }      options = { ...defaultOptions, ...options};      let _this = this;   let slides = [];   let currentSlideIdex = 0; }

我们创建了一个 defaultOptions 对象来保存一些属性,我们还使用Javascript扩展操作符将传入的选项与默认选项合并。我们将 this  分配给另一个变量,因此我们仍然可以在内部函数中对其进行访问。

我们还创建了两个变量 slides,它将保存所有我们想要用作幻灯片的图片,以及  currentSlideIndex,它保存当前正在显示的幻灯片的索引。

接下来,由于我们的幻灯片需要有一些控制,可以用来向前和向后移动幻灯片,我们将在构造函数中添加下面的方法。

this.prepareControls = function() {   const nextButton = document.createElement("button");   const previousButton = document.createElement("button");      nextButton.setAttribute("class", "next");   nextButton.InnerHTML = "Next";      previousButton.setAttribute("class", "prev");   nextButton.InnerHTML = "Prev";      let controleContainer = document.createElement("div");      controleContainer.setAttribute("class", "too-slide-control-container");      controleContainer.appendChild(previousButton);   controleContainer.appendChild(nextButton);      document.querySelector(options.container).appendChild(controleContainer);      nextButton.addEventListener("click", function() {     _this.next();   });   previousButton.addEventListener("click", function() {     _this.previous();   }); }

在 .prepareControls() 方法中,我们创建了一个容器DOM元素来保存控件按钮,我们自己创建了下一个和上一个按钮,并将它们附加到  controlContainer。

然后我们给两个按钮附加事件监听器,分别调用 .next() 和 .previous() 方法。别担心,我们很快就会创建这些方法。

接下来,我们将添加两个方法:.goToSlide()和 .hideOtherSlides()。

this.goToSlide = function(index) {   this.hideOtherSlides();   if(index > slides.length - 1) {     index = 0;   }   if(index < 0) {     index = slides.length - 1;   }   slides[index].style = "display:block";   currentSlideIndex = index; }  this.hideOtherSlides = function() {   document.querySelectorAll(options.slidesClass).forEach((slide, index) => {     slides[index].style = "display: none"   }) }

.goToSlide() 方法采用参数  index,这是我们要显示的幻灯片的索引,此方法首先隐藏当前正在显示的任何幻灯片,然后仅显示我们要显示的幻灯片。

接下来,我们将添加 .next() 和 .previous() 辅助方法,分别帮助我们向前一步,或者向后一步(还记得我们之前附加的事件监听器吗?

this.next = function() {   this.goToSlide(currentSlideIndex + 1); } this.previous = function() {   this.goToSlide(currentSlideIndex - 1); }

这两个方法基本上调用 .goToSlide() 方法,并将 currentSlideIndex 移动 1。

现在,我们还将创建一个 .init() 方法,该方法将在实例化构造函数时帮助我们进行设置。

this.init = function() {   document.querySelectorAll(options.container).className += " too-slide-slider-container";   document.querySelectorAll(options.slidesClass).forEach((slide, index) => {     slides[index] = index;     slides[index].style = "display:none";     slides[index].className = " too-slide-single-slide too-slide-fade";   });      this.goToSlide(0);   this.prepareControls(); }

如您所见,.init() 方法获取所有幻灯片图像并将其存储在我们之前声明的 slides 数组中,并默认隐藏所有图像。

然后,它通过调用 .goToSlide(0) 方法显示幻灯片中的第一张图像,并且还通过调用 .prepareControls()  设置我们的控制按钮。

为了收尾我们的构造函数代码,我们将在构造函数中调用 .init() 方法,这样每当构造函数被初始化时,.init() 方法总是被调用。

最终代码如下所示:

function ToolSidePlugin(options) {   let defaultOptions = {     slidesClass: ".singleSlide",     container: ".slideContainer",     nextButton: ".nextSlide",     previousButton: ".previousSlide"   }      options = { ...defaultOptions, ...options};      let _this = this;   let slides = [];   let currentSlideIdex = 0;    this.init = function() {     document.querySelectorAll(options.container).className += " too-slide-slider-container";     document.querySelectorAll(options.slidesClass).forEach((slide, index) => {       slides[index] = index;       slides[index].style = "display:none";       slides[index].className = " too-slide-single-slide too-slide-fade";     });          this.goToSlide(0);     this.prepareControls();   }    this.prepareControls = function() {     const nextButton = document.createElement("button");     const previousButton = document.createElement("button");          nextButton.setAttribute("class", "next");     nextButton.InnerHTML = "Next";          previousButton.setAttribute("class", "prev");     nextButton.InnerHTML = "Prev";          let controleContainer = document.createElement("div");          controleContainer.setAttribute("class", "too-slide-control-container");          controleContainer.appendChild(previousButton);     controleContainer.appendChild(nextButton);          document.querySelector(options.container).appendChild(controleContainer);          nextButton.addEventListener("click", function() {       _this.next();     });     previousButton.addEventListener("click", function() {       _this.previous();     });   }    this.goToSlide = function(index) {     this.hideOtherSlides();     if(index > slides.length - 1) {       index = 0;     }     if(index < 0) {       index = slides.length - 1;     }     slides[index].style = "display:block";     currentSlideIndex = index;   }      this.hideOtherSlides = function() {     document.querySelectorAll(options.slidesClass).forEach((slide, index) => {       slides[index].style = "display: none"     })   }    this.next = function() {     this.goToSlide(currentSlideIndex + 1);   }   this.previous = function() {     this.goToSlide(currentSlideIndex - 1);   }    this.init(); }

添加CSS

在存放我们的插件项目的文件夹中,我们将添加一个CSS文件,其中包含我们的滑块的基本样式。我将把这个文件称为 tooSlide.css。

* {box-sizing: border-box}   body {font-family: Verdana, sans-serif; margin:0; padding: 30px;}  .too-slide-single-slide {   display: none;    max-height: 100%;   width: 100%;  }   .too-slide-single-slide img{   height: 100%;   width: 100%; } img {vertical-align: middle;}   /* Slideshow container */ .too-slide-slider-container {   width: 100%;   max-width: 100%;   position: relative;   margin: auto;   height: 400px; }  .prev, .next {   cursor: pointer;   position: absolute;   top: 50%;   width: auto;   padding: 10px;   margin-right: 15px;   margin-left: 15px;   margin-top: -22px;   color: white;   font-weight: bold;   font-size: 18px;   transition: 0.6s ease;   border-radius: 0 3px 3px 0;   user-select: none;   border-style: unset;   background-color: blue; }  .next {   right: 0;   border-radius: 3px 0 0 3px; }  .prev:hover, .next:hover {   background-color: rgba(0,0,0,0.8); }   .too-slide-fade {   -webkit-animation-name: too-slide-fade;   -webkit-animation-duration: 1.5s;   animation-name: too-slide-fade;   animation-duration: 1.5s; }   @-webkit-keyframes too-slide-fade {   from {opacity: .4}    to {opacity: 1} }   @keyframes too-slide-fade {   from {opacity: .4}    to {opacity: 1} }   /* On smaller screens, decrease text size */ @media only screen and (max-width: 300px) {   .prev, .next,.text {font-size: 11px} }

测试我们的插件

为了测试我们的插件,我们将创建一个HTML文件,我将其命名为  index.html。我们还将添加4张图片用作幻灯片,所有图片都与我们的插件Javascript代码位于同一目录中。

我的HTML文件如下所示:

        

为您的Javascript项目编写文档

文档是你教人们如何使用你的插件。因此,它需要你花一些心思。

对于我们新创建的插件,我将从在项目目录中创建README.md文件开始。

怎样创建与框架无关的Javascript插件

发布你的插件

在编写了您的插件之后,您很可能希望其他开发人员从您的新创建中受益,因此我将向您展示如何做到这一点。

你可以通过两种方式让你的插件对其他人可用:

  • 在Github上托管它,当您这样做时,任何人都可以下载仓库,包括文件(.js和.css),并立即使用您的插件。

  • 发布在npm上,请查看官方的npm文档来指导您。

关于怎样创建与框架无关的Javascript插件问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程笔记行业资讯频道了解更多相关知识。


推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了JavaScript进化到TypeScript的历史和背景,解释了TypeScript相对于JavaScript的优势和特点。作者分享了自己对TypeScript的观察和认识,并提到了在项目开发中使用TypeScript的好处。最后,作者表示对TypeScript进行尝试和探索的态度。 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • Javascript中带有加号 - 减号(±)的极坐标曲线方程 - Polar curve equation with plus-minus sign (±) in Javascript
    IamtryingtodrawpolarcurvesonHTMLcanvasusingJavascript.WhatshouldIdowhenIwanttoco ... [详细]
author-avatar
国际物流-Ann
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有