当前位置:首页 > JavaScript

js 实现 jq

2026-03-02 06:36:14JavaScript

使用原生 JavaScript 实现 jQuery 功能

选择器功能

jQuery 的核心功能之一是选择器,可以通过 $()jQuery() 选择 DOM 元素。以下是原生 JavaScript 实现:

function $(selector) {
  return document.querySelectorAll(selector);
}

如果需要更接近 jQuery 的链式调用,可以返回一个包含常用方法的对象:

function $(selector) {
  const elements = document.querySelectorAll(selector);
  return {
    elements,
    css: function(property, value) {
      this.elements.forEach(el => {
        el.style[property] = value;
      });
      return this;
    },
    addClass: function(className) {
      this.elements.forEach(el => {
        el.classList.add(className);
      });
      return this;
    }
  };
}

事件绑定

jQuery 的 on() 方法可以用原生 JavaScript 的 addEventListener 实现:

js 实现 jq

function $(selector) {
  const elements = document.querySelectorAll(selector);
  return {
    elements,
    on: function(event, callback) {
      this.elements.forEach(el => {
        el.addEventListener(event, callback);
      });
      return this;
    }
  };
}

AJAX 请求

jQuery 的 $.ajax 可以用 fetch API 或 XMLHttpRequest 实现:

function ajax(options) {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();
    xhr.open(options.method || 'GET', options.url);

    if (options.headers) {
      Object.keys(options.headers).forEach(key => {
        xhr.setRequestHeader(key, options.headers[key]);
      });
    }

    xhr.onload = () => {
      if (xhr.status >= 200 && xhr.status < 300) {
        resolve(xhr.response);
      } else {
        reject(xhr.statusText);
      }
    };

    xhr.onerror = () => reject(xhr.statusText);
    xhr.send(options.data);
  });
}

DOM 操作

实现 jQuery 的 append, prepend, remove 等方法:

js 实现 jq

function $(selector) {
  const elements = document.querySelectorAll(selector);
  return {
    elements,
    append: function(html) {
      this.elements.forEach(el => {
        el.insertAdjacentHTML('beforeend', html);
      });
      return this;
    },
    remove: function() {
      this.elements.forEach(el => {
        el.parentNode.removeChild(el);
      });
    }
  };
}

动画效果

实现简单的 fadeInfadeOut 效果:

function $(selector) {
  const elements = document.querySelectorAll(selector);
  return {
    elements,
    fadeIn: function(duration = 400) {
      this.elements.forEach(el => {
        el.style.opacity = 0;
        el.style.display = 'block';
        let start = null;

        function step(timestamp) {
          if (!start) start = timestamp;
          const progress = timestamp - start;
          const opacity = Math.min(progress / duration, 1);
          el.style.opacity = opacity;
          if (progress < duration) {
            window.requestAnimationFrame(step);
          }
        }

        window.requestAnimationFrame(step);
      });
      return this;
    }
  };
}

完整简易实现

以下是一个更完整的简易 jQuery 实现:

function $(selector) {
  const elements = selector instanceof HTMLElement ? 
    [selector] : 
    document.querySelectorAll(selector);

  return {
    elements,

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

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

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

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

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

    hide() {
      this.elements.forEach(el => el.style.display = 'none');
      return this;
    },

    show() {
      this.elements.forEach(el => el.style.display = '';
      return this;
    }
  };
}

使用示例

// 选择元素并修改样式
$('.my-class').css('color', 'red').addClass('highlight');

// 事件绑定
$('#my-button').on('click', () => alert('Clicked!'));

// AJAX 请求
ajax({
  url: '/api/data',
  method: 'GET'
}).then(data => {
  console.log(data);
}).catch(error => {
  console.error(error);
});

这些实现展示了如何用原生 JavaScript 模拟 jQuery 的核心功能。实际项目中,可以根据需要扩展更多方法和功能。

标签: jsjq
分享给朋友:

相关文章

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现抽奖

js实现抽奖

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

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…