当前位置:首页 > JavaScript

js 实现 jq

2026-04-05 07:37:34JavaScript

要在 JavaScript 中实现类似 jQuery 的功能,可以创建一个简单的类或函数来封装常见的 DOM 操作、事件处理和 AJAX 请求。以下是实现 jQuery 核心功能的一种方式:

基础结构

创建一个名为 $ 的函数,用于选择元素并返回一个对象,该对象包含操作 DOM 的方法。

function $(selector) {
  const elements = document.querySelectorAll(selector);
  return {
    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;
}

设置/获取属性

attr(name, value) {
  if (value === undefined) {
    return this.elements[0].getAttribute(name);
  }
  this.elements.forEach(el => el.setAttribute(name, value));
  return this;
}

设置/获取内容

html(content) {
  if (content === undefined) {
    return this.elements[0].innerHTML;
  }
  this.elements.forEach(el => el.innerHTML = content);
  return this;
}

事件绑定

on(eventName, callback) {
  this.elements.forEach(el => el.addEventListener(eventName, callback));
  return this;
}

AJAX 实现

$.ajax = function(options) {
  const xhr = new XMLHttpRequest();
  xhr.open(options.method || 'GET', options.url, true);
  xhr.onload = function() {
    if (xhr.status >= 200 && xhr.status < 300) {
      options.success && options.success(xhr.responseText);
    } else {
      options.error && options.error(xhr.statusText);
    }
  };
  xhr.onerror = function() {
    options.error && options.error(xhr.statusText);
  };
  xhr.send(options.data);
};

链式调用

通过在每个方法中返回 this,可以实现链式调用:

js 实现 jq

$('div').addClass('active').attr('data-id', '123');

完整示例

function $(selector) {
  const elements = document.querySelectorAll(selector);
  return {
    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;
    },
    attr(name, value) {
      if (value === undefined) {
        return this.elements[0].getAttribute(name);
      }
      this.elements.forEach(el => el.setAttribute(name, value));
      return this;
    },
    html(content) {
      if (content === undefined) {
        return this.elements[0].innerHTML;
      }
      this.elements.forEach(el => el.innerHTML = content);
      return this;
    },
    on(eventName, callback) {
      this.elements.forEach(el => el.addEventListener(eventName, callback));
      return this;
    }
  };
}

$.ajax = function(options) {
  const xhr = new XMLHttpRequest();
  xhr.open(options.method || 'GET', options.url, true);
  xhr.onload = function() {
    if (xhr.status >= 200 && xhr.status < 300) {
      options.success && options.success(xhr.responseText);
    } else {
      options.error && options.error(xhr.statusText);
    }
  };
  xhr.onerror = function() {
    options.error && options.error(xhr.statusText);
  };
  xhr.send(options.data);
};

使用示例

// DOM 操作
$('.test').addClass('highlight').html('Hello World');

// 事件处理
$('button').on('click', () => alert('Clicked!'));

// AJAX
$.ajax({
  url: '/api/data',
  method: 'GET',
  success: (data) => console.log(data),
  error: (err) => console.error(err)
});

这种方法实现了 jQuery 的核心功能,但实际 jQuery 要复杂得多,包含更多特性和跨浏览器兼容处理。

标签: jsjq
分享给朋友:

相关文章

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

react如何引入jq

react如何引入jq

在React中引入jQuery的方法 React和jQuery可以共存,但需要注意避免直接操作DOM,因为React有自己的虚拟DOM机制。以下是几种引入jQuery的方式: 通过npm安装jQue…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…