当前位置:首页 > JavaScript

js实现$()

2026-01-31 12:26:56JavaScript

实现类似 jQuery 的 $() 函数

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

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 的链式调用,可以创建一个包装器类:

js实现$()

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实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…