当前位置:首页 > 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实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现继承

js实现继承

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

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…