给 jQuery添加扩展方法

使用油猴脚本时给 jQuery添加扩展方法

最近用油猴写了个 swagger文档助手的脚本,用于复制api链接,名称,由于页面是异步加载的,需要判断元素有没有加载。
搜了下找到这篇文章 jQuery下实现等待指定元素加载完毕
看着不错,赶紧扒来代码试试

  jQuery.fn.extend({
    wait: function (selector, func, times, interval) {
      var _times = times || -1, //100次
        _interval = interval || 20, //20毫秒每次
        _self = this,
        _selector = selector, //选择器
        _iIntervalID //定时器id
      if (this.length) {
        //如果已经获取到了,就直接执行函数
        func && func.call(this)
      } else {
        _iIntervalID = setInterval(function () {
          if (!_times) {
            //是0就退出
            clearInterval(_iIntervalID)
          }
          _times <= 0 || _times-- //如果是正数就 --

          _self = $(_selector) //再次选择
          if (_self.length) {
            //判断是否取到
            func && func.call(_self)
            clearInterval(_iIntervalID)
          }
        }, _interval)
      }
      return this
    }
  })
  $('.opblock-summary').wait('.opblock-summary', function () {
      // 执行具体逻辑
  })

由于对jQuery不太熟悉,看了文档有 jQuery.extend, jQuery.fn.extend两种方法,自以为jQuery.extend相当于构造函数的方法,就写下了这样的代码:

jQuery.extend({
    wait: function (selector, func, times, interval) {
})
$.wait('.opblock-summary', function () {
      // 执行具体逻辑
})

然后就是一顿报错排错…
这里的jQuery.extend其实就相当于一个工具函数了,和Object.assign,...扩展运算符非常类似,和原型一点关系没有,自然不能添加原型方法。官方文档这样解释的:

jQuery.extend( target [, object1 ] [, objectN ] )
将两个或更多对象的内容合并到第一个对象。

也就是限定了至少有三个参数

en…个人感觉可能还不如Object.assign顺手,也就不再去尝试了。

注意项:
扩展方法是添加到原型上的,也就是每个jQuery实例对象都会有wait方法,而jQuery构造函数本身是没有该方法的。
如果代码这样写将会报错找不到wait方法了:

$.wait('.opblock-summary', function () {
      // 执行具体逻辑
  })

不过竟然是每个实例对象都会拥有该方法,这样也是可以的。

$().wait('.opblock-summary', function () {
      // 执行具体逻辑
  })

在jQuery 1.4中,如果你传递给jQuery()方法一个空参数,一个空的jQuery设置将被返回(.length属性为0)。 在以前的jQuery版本中,一个包含整个文档节点的集合将被返回。

最后贴一下swagger油猴助手的效果图及全部代码

// ==UserScript==
// @name         swagger 助手
// @namespace    swagger-helper
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        */apiv2/swagger*
// @icon         https://www.google.com/s2/favicons?domain=tampermonkey.net
// @require      https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js
// @grant        unsafeWindow
// @grant GM.setClipboard
// @grant GM_addStyle
// ==/UserScript==

const css = `
.btn-wrap{
  margin-right: 24px;
}
.swagger-ui .btn-copy{
  height: 32px;
  border-radius: 4px;
  margin: 0 12px;
}
.copy-tip{
  position: fixed;
  min-width: 300px;
  top: 100px;
  right: 32px;
  padding: 0 1rem;
  border: 1px solid teal;
  color: teal;
  background: white;
}
`

;(function () {
  'use strict'
  // GM_addStyle(GM_getResourceText('css'))
  GM_addStyle(css)
  jQuery.fn.extend({
    wait: function (selector, func, times, interval) {
      var _times = times || -1, //100次
        _interval = interval || 20, //20毫秒每次
        _self = this,
        _selector = selector, //选择器
        _iIntervalID //定时器id
      if (this.length) {
        //如果已经获取到了,就直接执行函数
        func && func.call(this)
      } else {
        _iIntervalID = setInterval(function () {
          if (!_times) {
            //是0就退出
            clearInterval(_iIntervalID)
          }
          _times <= 0 || _times-- //如果是正数就 --

          _self = $(_selector) //再次选择
          if (_self.length) {
            //判断是否取到
            func && func.call(_self)
            clearInterval(_iIntervalID)
          }
        }, _interval)
      }
      return this
    }
  })
  $().wait('.opblock-summary', function () {
    const entryEl = ($('.opblock-summary > button').length && $('.opblock-summary > button')) || $('.opblock-summary')
    entryEl.each(function () {
      const path = $('.opblock-summary-path', this).attr('data-path')
      const name = $('.opblock-summary-description', this).text()
      const cyNameEl = $('<button class="btn-copy">复制名称</button>')
      $(cyNameEl).on('click', e => {
        e.stopPropagation()
        GM.setClipboard(name)
        message()
      })
      const cyLinkEl = $('<button class="btn-copy"">复制链接</button>')
      $(cyLinkEl).on('click', e => {
        e.stopPropagation()
        GM.setClipboard(path)
        console.log('e:', e)
        message()
      })
      const btnWrap = $(`
<div class="btn-wrap">
</div>
        `).append(cyNameEl, cyLinkEl)
      $('.opblock-summary-description', this).after(btnWrap)
    })
  })
  function message(msg = '复制成功!') {
    const info = $(`<div class="copy-tip">
    <p>${msg}</p>
    </div>`).appendTo($('body'))
    setTimeout(() => {
      info.remove()
    }, 1000)
  }
})()

注意

  1. 使用@macth 匹配特地的域名才运行脚本

参考

  1. jQuery下实现等待指定元素加载完毕
  2. jQuery中文文档
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于开发 jQuery 火狐扩展,你可以遵循以下步骤: 1. 准备工作:确保你已经安装了最新版本的 Firefox 浏览器和一个文本编辑器(如 Visual Studio Code)。 2. 创建扩展文件夹:在你的工作目录下创建一个新的文件夹,用作扩展的根目录。 3. 创建 manifest.json 文件:在扩展的根目录中创建一个名为 manifest.json 的文件。这个文件用于描述扩展的元数据,包括名称、版本号、描述等。 4. 编写代码:在根目录中创建一个名为 content.js 的 JavaScript 文件,用于编写你的 jQuery 代码。在这个文件中,你可以使用 jQuery 库进行 DOM 操作和事件处理等。 例如,你可以编写一个示例代码来修改当前页面的标题: ```javascript $(document).ready(function() { $('title').text('Hello, Firefox Extension!'); }); ``` 5. 引入 jQuery 库:将 jQuery 库文件(例如 jquery.min.js)下载并放置在根目录中。然后,在 content.js 文件中通过以下方式引入 jQuery 库: ```javascript importScripts("jquery.min.js"); ``` 6. 更新 manifest.json 文件:在 manifest.json 文件中添加必要的配置项,以便 Firefox 可以正确加载和运行你的扩展。具体配置可以参考 Mozilla 开发者文档。 7. 打包扩展:将扩展文件夹压缩为一个 ZIP 文件,确保不包含额外的文件或文件夹。 8. 安装扩展:打开 Firefox 浏览器,点击菜单按钮,选择“附加组件”进入附加组件管理页面。在页面右上角的齿轮图标下拉菜单中选择“从文件安装附加组件”,然后选择之前打包好的 ZIP 文件进行安装。 9. 调试和测试:在 Firefox 中打开网页,并检查扩展是否按预期运行。在开发过程中,你可以通过 Firefox 的开发者工具来调试和测试你的扩展。 请注意,上述步骤只是一个简单的概述,实际开发过程中可能会涉及到更多细节和特定要求。你可以参考 Mozilla 开发者文档中关于 Firefox 扩展的详细指南,以更好地了解和掌握开发流程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值