当前位置:首页 > JavaScript

js实现$()

2026-01-31 12:26:56JavaScript

实现类似 jQuery 的 $() 函数

在 JavaScript 中实现类似 jQuery 的 $() 函数,可以通过以下方式创建一个简化版本的选择器函数。这个函数能够根据不同的输入参数返回匹配的元素或创建新元素。

js实现$()

function $(selector, context) {
  // 如果传入的是字符串,则作为选择器处理
  if (typeof selector === 'string') {
    context = context || document;
    const elements = context.querySelectorAll(selector);
    return elements.length > 1 ? Array.from(elements) : elements[0];
  }

  // 如果传入的是函数,则在DOM加载完成后执行
  if (typeof selector === 'function') {
    if (document.readyState !== 'loading') {
      selector();
    } else {
      document.addEventListener('DOMContentLoaded', selector);
    }
    return;
  }

  // 如果传入的是DOM元素,直接返回
  if (selector instanceof HTMLElement) {
    return selector;
  }

  // 如果传入的是对象数组,返回数组
  if (Array.isArray(selector)) {
    return selector;
  }
}

功能扩展

为了更接近 jQuery 的功能,可以扩展这个基础实现:

function $(selector, context) {
  // 创建元素
  if (typeof selector === 'string' && selector.startsWith('<')) {
    const template = document.createElement('template');
    template.innerHTML = selector.trim();
    return template.content.firstChild;
  }

  // 选择器查询
  if (typeof selector === 'string') {
    context = context || document;
    const elements = context.querySelectorAll(selector);
    return elements.length > 1 ? Array.from(elements) : elements[0];
  }

  // DOM就绪回调
  if (typeof selector === 'function') {
    if (document.readyState !== 'loading') {
      selector();
    } else {
      document.addEventListener('DOMContentLoaded', selector);
    }
    return;
  }

  // 包装DOM元素
  if (selector instanceof HTMLElement) {
    return selector;
  }

  // 包装节点列表
  if (selector instanceof NodeList || Array.isArray(selector)) {
    return selector.length === 1 ? selector[0] : Array.from(selector);
  }
}

链式调用支持

要实现类似 jQuery 的链式调用,可以创建一个包装器类:

class JQWrapper {
  constructor(elements) {
    this.elements = Array.isArray(elements) ? elements : [elements];
  }

  addClass(className) {
    this.elements.forEach(el => el.classList.add(className));
    return this;
  }

  removeClass(className) {
    this.elements.forEach(el => el.classList.remove(className));
    return this;
  }

  css(property, value) {
    this.elements.forEach(el => el.style[property] = value);
    return this;
  }
}

function $(selector) {
  return new JQWrapper(selector);
}

使用示例

// 选择元素
$('#myElement').addClass('highlight').css('color', 'red');

// 创建元素
const newDiv = $('<div class="box">New element</div>');
document.body.appendChild(newDiv);

// DOM就绪回调
$(function() {
  console.log('DOM is ready');
});

这个实现提供了 jQuery 中最常用的 $() 函数功能,包括选择元素、创建元素和DOM就绪回调。可以根据需要进一步扩展功能。

js实现$()

标签: js
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的H…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-contain…