莆田网站开发公司电话网站开发学些什么

diannao/2026/1/16 4:48:43/文章来源:
莆田网站开发公司电话,网站开发学些什么,查找企业资料的网站,wordpress 圆形头像写在前面 如今#xff0c;在项目中使用React、Vue等框架作为技术栈已成为一种常态#xff0c;在享受带来便利性的同时#xff0c;也许我们渐渐地遗忘原生js的写法。 现在#xff0c;是时候回归本源#xff0c;响应原始的召唤了。本文将一步一步带领大家封装一套属于自己的…写在前面 如今在项目中使用React、Vue等框架作为技术栈已成为一种常态在享受带来便利性的同时也许我们渐渐地遗忘原生js的写法。 现在是时候回归本源响应原始的召唤了。本文将一步一步带领大家封装一套属于自己的DOM操作库我将其命名为qnode。 功能特性 qnode吸收了jquery优雅的链式写法并且融入了我个人的一些经验和思考 自定义DOM工厂模式缓存节点、跨文件操作快速优雅地创建新的DOM节点CSS3样式前缀自动识别和添加大家可能会比较疑惑什么是DOM工厂模式 实际上是这样有一些需要共享的节点、数据和方法它在某个文件中定义在另一个文件中调用。我最初的方式是在文件中暴露export出这些东西但是后来发现文件多了这种方式很难维护而且需要引入很多的文件非常麻烦。 于是在不断的摸索和思考中想出了DOM工厂模式这个概念咱们可以这么理解DOM工厂就是取快递的地方不管是从哪里发来的货品统一送到这里然后再由特定的人群来取。 当然未来还有很长的路要走我会不断地探索和改进融入更多的想法和改进。 目录结构 qnode ├── QNode.js ├── README.md ├── api.js ├── core │   ├── attr.js │   ├── find.js │   ├── index.js │   ├── klass.js │   ├── listener.js │   ├── node.js │   └── style.js ├── index.js ├── q.js └── tools.js 复制代码q.js是DOM操作的集合融合了所有core的方法QNode.js是工厂模式提供节点、数据以及方法的缓存和获取core目录下的文件是DOM操作的具体方法编写代码 core/attr.js内容属性操作 import { isDef } from ../toolsexport function text (value) {if (!isDef(value)) {return this.node.textContent}this.node.textContent valuereturn this }export function html (value) {if (!isDef(value)) {return this.node.innerHTML}this.node.innerHTML valuereturn this }export function value (val) {if (!isDef(val)) {return this.node.value}this.node.value valreturn this }export function attr (name, value) {if (!isDef(value)) {return this.node.getAttribute(name)}if (value true) {this.node.setAttribute(name, )} else if (value false || value null) {this.node.removeAttribute(name)} else {this.node.setAttribute(name, value)}return this } 复制代码core/find.js节点信息获取 export function tagName () {return this.node.tagName }export function current () {return this.node }export function parent () {return this.node.parentNode }export function next () {return this.node.nextSibling }export function prev () {return this.node.previousSibling }export function first () {return this.node.firstChild }export function last () {return this.node.lastChild }export function find (selector) {return this.node.querySelector(selector) } 复制代码core/klass.jsclass样式操作 import { isArray } from ../toolsexport function addClass (cls) {let classList this.node.classListlet classes isArray(cls) ? cls : [].slice.call(arguments, 0)classList.add.apply(classList, classes.filter(c c).join( ).split( ))return this }export function removeClass (cls) {let classList this.node.classListlet classes isArray(cls) ? cls : [].slice.call(arguments, 0)classList.remove.apply(classList, classes.filter(c c).join( ).split( ))return this }export function hasClass (cls) {let classList this.node.classList// 若有空格则必须满足所有class才返回trueif (cls.indexOf( ) ! -1) {return cls.split( ).every(c classList.contains(c))}return classList.contains(cls) } 复制代码core/listener.js事件监听处理 export function on (type, fn, useCapture false) {this.node.addEventListener(type, fn, useCapture)return this }export function off (type, fn) {this.node.removeEventListener(type, fn)return this } 复制代码core/node.jsDOM操作 import { createFragment } from ../api import { getRealNode, isArray } from ../toolsexport function append (child) {let realNode nullif (isArray(child)) {let fragment createFragment()child.forEach(c {realNode getRealNode(c)if (realNode) {fragment.appendChild(realNode)}})this.node.appendChild(fragment)} else {realNode getRealNode(child)if (realNode) {this.node.appendChild(realNode)}}return this }export function appendTo (parent) {parent getRealNode(parent)if (parent) {parent.appendChild(this.node)}return this }export function prepend (child, reference) {let realNode nulllet realReference getRealNode(reference) || this.node.firstChildif (isArray(child)) {let fragment createFragment()child.forEach(c {realNode getRealNode(c)if (realNode) {fragment.appendChild(realNode)}})this.node.insertBefore(fragment, realReference)} else {realNode getRealNode(child)if (realNode) {this.node.insertBefore(realNode, realReference)}}return this }export function prependTo (parent, reference) {parent getRealNode(parent)if (parent) {parent.insertBefore(this.node, getRealNode(reference) || parent.firstChild)}return this }export function remove (child) {// 没有要移除的子节点则移除本身if (!child) {if (this.node.parentNode) {this.node.parentNode.removeChild(this.node)}} else {let realNode nullif (isArray(child)) {child.forEach(c {realNode getRealNode(c)if (realNode) {this.node.removeChild(realNode)}})} else {realNode getRealNode(child)if (realNode) {this.node.removeChild(realNode)}}}return this } 复制代码core/style.js内联样式操作 import { isDef, isObject } from ../toolsconst htmlStyle document.documentElement.style const prefixes [webkit, moz, ms, o] const prefixLen prefixes.lengthfunction getRealStyleName (name) {if (name in htmlStyle) {return name}// 首字母大写let upperName name[0].toUpperCase() name.substr(1)// 前缀判断for (let i 0; i prefixLen; i) {let realName prefixes[i] upperNameif (realName in htmlStyle) {return realName}}// 都不支持则返回原值return name }export function css (name) {if (!this.computedStyle) {this.computedStyle window.getComputedStyle(this.node)}if (!isDef(name)) {return this.computedStyle}return this.computedStyle[name] }export function style (a, b) {if (isObject(a)) {Object.keys(a).forEach(name {name getRealStyleName(name)this.node.style[name] a[name]})} else {a getRealStyleName(a)if (!isDef(b)) {return this.node.style[a]}this.node.style[a] b}return this }export function show () {if (this.node.style.display none) {this.node.style.display }return this }export function hide () {this.node.style.display nonereturn this }export function width () {return this.node.clientWidth }export function height () {return this.node.clientHeight } 复制代码core/index.js所有操作集合 import * as attr from ./attr import * as find from ./find import * as klass from ./klass import * as listener from ./listener import * as node from ./node import * as style from ./styleexport default Object.assign({},attr,find,klass,listener,node,style ) 复制代码api.jsDOM API // 创建dom节点 export function createElement (tagName) {return document.createElement(tagName) }// 创建dom节点片段 export function createFragment () {return document.createDocumentFragment() } 复制代码tools.js工具方法 import { createElement } from ./apiexport const Q_TYPE (typeof Symbol function Symbol(q)) || 0x89bc export const QNODE_TYPE (typeof Symbol function Symbol(QNode)) || 0x7b96// 占位node节点 export const emptyNode createElement(div)export function isQ (ele) {return ele ele.node ele.__type__ Q_TYPE }/*** 判断值是否定义* param {any} t* returns {boolean}*/ export function isDef (t) {return typeof t ! undefined }/*** 判断是否为字符串* param {any} t* returns {boolean}*/ export function isString (t) {return typeof t string }/*** 是否为对象* param {any} t* param {boolean} [includeArrayfalse] 是否包含数组* returns {boolean}*/ export function isObject (t) {return t typeof t object }/*** 判断是否为数组* param {any} t* returns {boolean}*/ export function isArray (t) {if (Array.isArray) {return Array.isArray(t)}return Object.prototype.toString.call(t) [object Array] }// 判断是否为dom元素 export function isElement (node) {if (isObject(HTMLElement)) {return node instanceof HTMLElement}return node node.nodeType 1 isString(node.nodeName) }export function getRealNode (ele) {if (isElement(ele)) {return ele} else if (isQ(ele)) {return ele.node}return null } 复制代码q.js import { createElement } from ./api import { Q_TYPE, isElement, isString, emptyNode } from ./tools import core from ./coreclass Q {constructor (selector) {let nodeif (isElement(selector)) {node selector} else if (isString(selector)) {if (selector[0] $) {node createElement(selector.substring(1))} else {node document.querySelector(selector)}}// node不存在则创建一个占位node避免操作dom报错this.node node || emptyNodethis.__type__ Q_TYPE} }// 集合 Object.assign(Q.prototype, core)export default function q (selector) {return new Q(selector) } 复制代码QNode.js import { QNODE_TYPE, isQ, isArray } from ./tools import q from ./qexport default class QNode {constructor () {this.__type__ QNODE_TYPEthis.qNodes {}this.store {}this.methods {}}q (selector) {return q(selector)}getNode (name) {return this.qNodes[name]}setNode (name, node) {if (isArray(node)) {this.qNodes[name] node.map(n isQ(n) ? n : q(n))} else {this.qNodes[name] isQ(node) ? node : q(node)}return this.qNodes[name]}getStore (name) {return this.store[name]}setStore (name, value) {this.store[name] valuereturn value}getMethod (name) {return this.methods[name]}execMethod (name) {let fn this.methods[name]return fn fn.apply(this, [].slice.call(arguments, 1))}setMethod (name, fn) {let thisFn fn.bind(this)this.methods[name] thisFnreturn thisFn} } 复制代码index.js import q from ./q import QNode from ./QNodeexport {q,QNode }export default {q,QNode } 复制代码到这里为止所有代码已经编写完成了。 API Reference q获取|创建节点 参数 #id 根据id获取节点.class 根据class获取节点tagName 根据标签获取节点$tagName 创建新的节点备注如果有多个节点则只获取第一个 方法 attr text: str 【设置文本内容若无参数则获取文本内容】html: str 【设置html若无参数则获取html】value: val 【设置表单值若无参数则获取表单值】attr: name, value 【设置name属性的值若value无参数则获取name的值】find tagName 【获取节点名称】current 【获取节点本身】parent 【获取父节点】next 【获取后一个节点】prev 【获取上一个节点】first 【获取第一个子节点】last 【获取最后一个子节点】find: #id | .class | tagName 【找子节点】class addClass: str | arr | a, b, ... 【添加样式class】removeClass: str | arr | a, b, ... 【移除样式class】hasClass: str 【是否含有样式class】listener on: type, fn, useCapturefalse 【添加事件监听】off: type, fn 【移除事件监听】node append: node | nodeList 【填充子节点到最后】appendTo: parent 【填充到父节点中最后】prepend: node | nodeList, reference 【填充子节点到最前或指定节点前】prependTo: parent, reference【填充到父节点中最前或指定节点前】remove: child 【移除子节点若无参数则移除自身】style css: name 【获取css文件中定义的样式】style: (name, value) | object 【1.设置或获取内联样式2.设置一组样式】show 【显示节点】hide 【隐藏节点】width 【获取节点宽度】height 【获取节点高度】QNode节点仓库包括数据和方法 方法 q: 同上述qgetNode: name 【获取节点】setNode: name, node 【设置节点返回节点】getStore: name 【获取数据】setStore: name, value 【设置数据返回数据】getMethod: name 【获取方法】setMethod: name, fn 【设置方法返回方法this绑定到qnode】execMethod: name 【执行方法name后面可以传入方法需要的参数this为qnode】结语 本文到这里就要结束了读者对文中的代码感兴趣的话建议自己动手试试在编程这块儿实践才能出真知。 写完之后是不是跃跃欲试呢下一篇文章我将基于本文封装的DOM库来开发无限循环轮播图详细请看下文原生js系列之无限循环轮播图。 附本文源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/91571.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

柳州做网站设计的公司无锡网站建设和

以下可以解决我的问题,请一步一步跟着做,有可能版本不一样就失败了 一、下载mqtt.js 前往蓝奏云 https://wwue.lanzouo.com/iQPdc1k50hpe 下载好后将.txt改为.js 然后放入项目里 二、连接mqtt const mqtt require(../../utils/mqtt.min); let cli…

花店网站建设方案南昌网站建设代理商

内容导航 类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统…

企业网站排版wordpress 黑

1.AAA 服务器 AAA 是验证、授权和记账(Authentication、Authorization、Accounting)3个英文单词的简称,是一个能够处理用户访问请求的服务器程序,提供验证授权以及帐户服务,主要目的是管理用户访问网络服务器,对具有访问权的用户提供服务。AAA服务器通常…

国外网站打开速度慢的原因网站做多少屏合适

最近公司在申请专利,编写不少文档,项目的代码量实在是过于庞大。如果一个一个的复制粘贴虽然能够完成,但是对于程序员而言实在没有这个必要。shell或者python就能解决这个问题。由于我个人对于shell和python不是非常熟练的情况下,…

南昌网站搭建制作公司html5网站强制横屏

LibTooling(库工具) LibTooling是个支持基于Clang编写独立工具的库. 在此,为LLVM安装Clang工具 介绍 用LibTooling构建的工具(如Clang插件)通过代码运行FrontendActions. 这里演示运行Clang的快速检查一堆代码语法的SyntaxOnlyAction的不同方法. 解析内存中的代码片 如果想…

渠道推广费用咨询什么是网站优化

目录 正文之前1. 目的2. 原帖3. 为何推荐Notepad3.1. Notepad的一些基本特点3.2. notepad,notepad2,notepad,ultraEdit比较4. 使用Notepad前要了解的知识4.1. Notepad的名称和缩写4.2. Notepad修改设置后,立即生效4.3. Notepad的版…

网站开发与网页制作难不难什么网站招聘外国人做兼职

导读:随着信息科学技术的飞速发展,人们逐渐意识到对信息管理软件的运用可以使日常工作更加方便、快捷和高效。论文详细论述了公司合同管理系统的开发设计过程。软件采用JSP开发技术,Tomcat作容器, SQL Server 2000作数据库管理系统,实现了创建合同、修改合同、删除合同、合…

厦门门户网站制作服务商调整百度对网站的最大天级抓取频次值

开源操作系统社区 OpenCloudOS 由腾讯与合作伙伴共同倡议发起,是完全中立、全面开放、安全稳定、高性能的操作系统及生态。OpenCloudOS 沉淀了多家厂商在软件和开源生态的优势,继承了腾讯在操作系统和内核层面超过10年的技术积累,在云原生、稳…

网站建设技术支持牛商网中学生做网站的软件

目录 一、数组的概念 二、数组的类型 三、一维数组 3.1 一维数组的创建 3.2 一维数组的初始化 3.3 一维数组的访问 3.4 一维数组在内存中的存储 四、二维数组 4.1 二维数组的创建 4.2 二维数组的初始化 4.3 二维数组的访问 4.4 二维数组在内存中的存储 五、变长数组 六、…

网站设计的销售微信网页制作网站建设

动态规划 1、动态规划的概念 简称DP,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。常常适用于有重叠子问题和最优子结构性质的问题。 简单来说,就是给定一个问题,把它拆成一个个子问题,查到子问题可以直接解决。然后把子问题答案保存起来,以减少重复计算…

网站建设找邓金平创业网站平台排名

今天听 \(\texttt{m}\color{red}{\texttt{yee}}\) 嘴的,赶紧来补个学习笔记。 PS:FFT 本质是长度为 \(2^k\) 的循环卷积。 单位根反演 反演本质: \[\frac1n\sum_{i0}^{n-1}\omega_{n}^{ai}[n|a] \]证明: 如果 \(n|i\),…

阜阳市城乡建设 档案馆网站wordpress主题商店

前言 DRY 原则,英文描述为: Don’t Repeat Yourself。中文直译:不要重复自己。将它应用在编程中,可理解为:不要写重读的代码。 可能你认为,这个原则很简单。只要两段代码长得一样,那就是违反 …

5在线做网站东莞建设网官网首页

文章目录 openssl3.2 - 官方demo学习 - cms - cms_sign2.c概述笔记END openssl3.2 - 官方demo学习 - cms - cms_sign2.c 概述 用多个证书进行CMS消息联合签名 笔记 /*! * \file cms_sign2.c * \note openssl3.2 - 官方demo学习 - cms - cms_sign2.c 用多个证书进行CMS消息联…

郑州营销型网站建设工作室常州app网站

socket套接字/TCP 一 客户端/服务器架构 C/S架构,包括 硬件C/S架构(打印机)软件C/S 架构(web服务)C/S架构的软件(软件属于应用层)是基于网络进行通信的Server端要: 1.力求一直提供服…

免费制作个人网站的软件建站工具 营销

在交换机组网时常见的故障比较多,为了帮助大家更好地排除这些故障,在此飞畅科技的小编来为大家介绍一些常见的典型故障案例和处理思路供大家参考。接下来大家就一起来看看交换机组最常见的8大故障及解决方法吧。 环网交换机产品图 故障1:交…

网站的建设哪个好山东省城乡住房和建设厅网站首页

本文来自#30天制图挑战#的GISer November_阿瑜瑜瑜瑜,完成了30幅中国风专辑地图,唯美又有韵味,十分赏心悦目,简直把中国风玩出了花~接下来,快来跟着小编一起细品30幅中国风地图吧~~~ 01day 1千里江山图《千里江山图》是…

做俄罗斯外贸的网站设计网页与网站设计

作为开发人员,我们都想写出优雅的代码,可又苦于自身能力不知该如何下手,而框架的作用正在与能够让你规范的去开发。 之前写Web的时候,总被要求采用MVC架构,的确非常好用,也从来没有质疑过这种架构的好与不好…

建站工具缺点施工企业造价管理

牛客题霸 [ 旋转数组] C题解/答案 题目描述 一个数组A中存有N(N&gt0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>0)个位置,即将A中的数据由(A0 A1 ………

欧美品牌网站设计怎么做网站自动响应

在当今这个信息爆炸的时代,图像和视频已经成为我们获取和传递信息的主要方式之一。从社交媒体上的照片分享,到安防监控、自动驾驶等领域的图像识别与处理,计算机视觉技术正日益改变着我们的生活。而在这场技术革命中,OpenCV(Open Source Computer Vision Library)这一开源…

企业做网站需要租服务器吗温州专业营销网站费用

设有 N堆石子排成一排,其编号为 1,2,3,…,N。 每堆石子有一定的质量,可以用一个整数来描述,现在要将这 N 堆石子合并成为一堆。 每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的…