微信小程序获取页面节点方法简介。canvas 滑动验证码 (前段,微信小程序,canvas2D)

这篇具有很好参考价值的文章主要介绍了微信小程序获取页面节点方法简介。canvas 滑动验证码 (前段,微信小程序,canvas2D)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.wx.createSelectorQuery():返回一个 SelectorQuery 对象实例。在自定义组件或包含自定义组件的页面中,应使用 this.createSelectorQuery() 来代替

二.SelectorQuery.select(string selector)  返回值是NodesRef

三.NodesRef 

四:执行所有请求 NodesRef SelectorQuery.exec

五:canvas 滑动验证码(使用wx.createSelectorQuery()做一个小小的实践)


微信小程序获取页面上的节点信息:微信小程序官方文档

一.wx.createSelectorQuery():返回一个 SelectorQuery 对象实例。在自定义组件或包含自定义组件的页面中,应使用 this.createSelectorQuery() 来代替

代码:wxml

<!-- 以画布举例 -->
<canvas id="myCanvas" type="2d"></canvas>

代码:js

	/**
	 * 生命周期函数--监听页面加载
	 */
	onLoad: function (options) {
		wx.createSelectorQuery()
	},

二.SelectorQuery.select(string selector)  返回值是NodesRef

(注:SelectorQuery是wx.createSelectorQuery()的返回值  )

方法:

        1.SelectorQuery SelectorQuery.in(Component component):将选择器的选取范围更改为自定义组件 component 内。(初始时,选择器仅选取页面范围的节点,不会选取任何自定义组件中的节点)

        2.NodesRef SelectorQuery.select(string selector):(我用到最多的,接下来以此方法为例)在当前页面下选择第一个匹配选择器 selector 的节点。返回一个 NodesRef 对象实例,可以用于获取节点信息。

                string selector语法:selector类似于 CSS 的选择器,但仅支持下列语法。(ID选择器,class选择器,子元素选择器,后代选择器,跨自定义组件的后代选择器,多选择器的并集)

        3.NodesRef SelectorQuery.selectAll(string selector):在当前页面下选择匹配选择器 selector 的所有节点

        4.NodesRef SelectorQuery.selectViewport():选择显示区域。可用于获取显示区域的尺寸、滚动位置等信息

        5.NodesRef SelectorQuery.exec(function callback):执行所有的请求。请求结果按请求次序构成数组,在 callback 的第一个参数中返回。

代码:js

	onLoad: function (options) {
	    wx.createSelectorQuery().select("#myCanvas")
	},

三.NodesRef 

(注:NodesRef 是SelectorQuery.select的返回值  )

方法: 每个方法的返回值都是SelectorQuery(调用NodesRef SelectorQuery.exec(function callback)执行所有的请求。请求结果按请求次序构成数组,在 callback 的第一个参数中返回。)

SelectorQuery NodesRef.fields(Object fields, NodesRef.FieldsCallback callback)

获取节点的相关信息。需要获取的字段在 fields 中指定。返回值是 nodesRef 对应的 selectorQuery

SelectorQuery NodesRef.boundingClientRect(NodesRef.boundingClientRectCallback callback)

添加节点的布局位置的查询请求。相对于显示区域,以像素为单位。其功能类似于 DOM 的 getBoundingClientRect。返回 NodesRef 对应的 SelectorQuery

SelectorQuery NodesRef.scrollOffset(NodesRef.scrollOffsetCallback callback)

添加节点的滚动位置查询请求。以像素为单位。节点必须是 scroll-view 或者 viewport,返回 NodesRef 对应的 SelectorQuery

SelectorQuery NodesRef.context(NodesRef.contextCallback callback)

添加节点的 Context 对象查询请求。目前支持 VideoContext、CanvasContext、LivePlayerContext、EditorContext和 MapContext 的获取。

SelectorQuery NodesRef.node(NodesRef.nodeCallback callback)

获取 Node 节点实例。

代码:js 注:这个时候是没有输出的。

	onLoad: function (options) {
		// 获取节点的相关信息
		wx.createSelectorQuery().select("#myCanvas").fields({id:true,size:true,node:true},(res) => {
			console.log(res)//{id: "myCanvas", width: 300, height: 150, nodeCanvasType: "2d", node: gE}  注:但是这个时候是没有输出的
		})

	    //添加节点的布局位置的查询请求
		wx.createSelectorQuery().select("#myCanvas").boundingClientRect((res) => {
			res.id      // 节点的ID
			res.dataset // 节点的dataset
			res.left    // 节点的左边界坐标
			res.right   // 节点的右边界坐标
			res.top     // 节点的上边界坐标
			res.bottom  // 节点的下边界坐标
			res.width   // 节点的宽度
			res.height  // 节点的高度
		})

		// //添加节点的滚动位置查询请求
		wx.createSelectorQuery().select("#myCanvas").scrollOffset()

		// //添加节点的 Context 对象查询请求
		wx.createSelectorQuery().select("#myCanvas").context()

		// //获取 Node 节点实例。
		wx.createSelectorQuery().select("#myCanvas").node()

	}

四:执行所有请求

NodesRef SelectorQuery.exec(function callback)

执行所有的请求。请求结果按请求次序构成数组,在 callback 的第一个参数中返回。

代码:js:js 注:是在这个时候输出的

onLoad: function (options) {
		console.log(1)
		// 获取节点的相关信息
		wx.createSelectorQuery().select("#myCanvas").fields({id:true,size:true,node:true},(res) => {
			console.log(res) //{id: "myCanvas", width: 300, height: 150, nodeCanvasType: "2d", node: gE}
		}).exec()

		// //添加节点的布局位置的查询请求
		wx.createSelectorQuery().select("#myCanvas").boundingClientRect((res) => {
			res.id      // 节点的ID
			res.dataset // 节点的dataset
			res.left    // 节点的左边界坐标
			res.right   // 节点的右边界坐标
			res.top     // 节点的上边界坐标
			res.bottom  // 节点的下边界坐标
			res.width   // 节点的宽度
			res.height  // 节点的高度
		}).exec(res => {
			console.log(res)  //[{…}]  展开 0: {id: "myCanvas", dataset: {…}, left: 0, right: 300, top: 0, …}
		})
	},

canvas 滑动验证码(使用wx.createSelectorQuery()做一个小小的实践)

微信小程序canvas画布。2.9.0 起支持一套新 Canvas 2D 接口(需指定 type 属性),同时支持同层渲染。

html

<view class="container">
  <view class="code-canvas">
    <canvas id="myCanvas" type="2d"></canvas>
    <canvas id="codeCanvas" type="2d" style="width:{{rectWidth}}rpx;height: {{rectWidth}}rpx;"></canvas>
    <canvas id="activeCanvas" type="2d"  bindtouchstart="onStart" bindtouchmove="onMove" bindtouchend="onEnd"></canvas>
  </view>
</view>

css

.code-canvas{
  position: relative;
  width: 600rpx;
  height: 300rpx;
}
#myCanvas,#activeCanvas{
  position: absolute;
  width: 600rpx;
  height: 300rpx;

}
#codeCanvas{
  position: absolute;
}

js

// pages/index/index.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    // 正方形宽
    rectWidth: 80,
    // 圆的半径
    r:10,
    // x坐标
    x: null,
    // y坐标
    y: 100,
    left:0,
    randX:0,
    // 开始触摸 并且触摸在验证码范围上
    isStart:false,
  },
  onLoad() {
    // 获取画布实例
    wx.createSelectorQuery().select("#myCanvas").fields({
      node: true,
      size: true
    }).exec(res => {
      const myCanvas = res[0].node;
      // 获取比例
      const ratio = wx.getSystemInfoSync().screenWidth / 750;
      this.data.ratio = ratio
      myCanvas.width = res[0].width / ratio;
      myCanvas.height = res[0].height / ratio;

      // 获取canvas 2d绘图上下文
      const ctx = myCanvas.getContext("2d");
      // 创建图片对象
      let bgImage = myCanvas.createImage();
      bgImage.src = "3.jpg";
      bgImage.onload = () => {
        // 画出背景
        ctx.drawImage(bgImage, 0, 0, myCanvas.width, myCanvas.height);

        // 随机x的值
        let randX = this.minRand(myCanvas.width / 2, myCanvas.width - this.data.rectWidth);
        this.data.randX = randX;
        // 获取遮盖块下的图画
        let codeImage1 = ctx.getImageData(randX, this.data.y, this.data.rectWidth, this.data.rectWidth);
        // 遮盖快
        this.playCode(ctx, true, randX, this.data.y);

        // 导出图片背景
        let bgImageUrl = myCanvas.toDataURL("image/png");
        this.setData({
          bgImageUrl: bgImageUrl
        });

        // 二
        wx.createSelectorQuery().select("#codeCanvas").fields({
          node: true,
          size: true
        }).exec(res => {
          const codeCanvas = res[0].node;
          codeCanvas.width = res[0].width / ratio;
          codeCanvas.height = res[0].height / ratio;

          // 获取canvas 2d绘图上下文
          const codeCtx = codeCanvas.getContext("2d");
          codeCtx.putImageData(codeImage1, 0, 0);
          let codeImage = codeCanvas.toDataURL("image/png");
          this.setData({
            codeImage: codeImage
          });

          // 清除画布二的内容
          codeCtx.clearRect(0, 0, codeCanvas.width, codeCanvas.height);

          // 创建图片对象
          let codeImagePlay = codeCanvas.createImage();
          codeImagePlay.src = codeImage;
          codeImagePlay.onload = () => {
            this.playCode(codeCtx, false, 0, 0)
            codeCtx.drawImage(codeImagePlay, 0, 0, codeCanvas.width, codeCanvas.height)
            let getCodeImagePlay = codeCtx.getImageData(0, 0, codeCanvas.width, codeCanvas.height)
            codeImage = codeCanvas.toDataURL("image/png");
            this.setData({
              codeImage: codeImage
            });
            codeCtx.clearRect(0,0,codeCanvas.width,codeCanvas.height);

            // 三
            wx.createSelectorQuery().select("#activeCanvas").fields({
              node: true,
              size: true
            }).exec(res => {
              let that = this
              const activeCanvas = res[0].node;
              activeCanvas.width = res[0].width / ratio;
              activeCanvas.height = res[0].height / ratio;

              // 获取canvas 2d绘图上下文
              const ctx3 = activeCanvas.getContext("2d");
              let xx = 0;
              let animation = function(){
                  xx = that.data.left;
                ctx3.clearRect(0,0,activeCanvas.width,activeCanvas.height);
                ctx3.putImageData(getCodeImagePlay, xx, that.data.y)
                activeCanvas.requestAnimationFrame(animation)
              }
              activeCanvas.requestAnimationFrame(animation)
            })
          }
        })
      }
    })
    console.log("data", this.data)
  },

  // 触摸开始,记录触摸时的位置,并且确定触摸在验证码范围内
  onStart(e){
    console.log("开始")
    this.data.isOnNum = true;
    let startX = e.touches[0].x / this.data.ratio;
    let startY = e.touches[0].y / this.data.ratio;
    let x = this.data.left
    console.log(x,startX)
    if((startX >= x && startX <= x + this.data.rectWidth) && (startY >= this.data.y && startY <= this.data.y + this.data.rectWidth)){
    console.log("开始1")
      this.setData({
        startX:startX,
        isStart:true
      })
    }
  },

  // 手指触摸移动,移动范围不在验证码背景中验证码回到初始位置
  onMove(e){
    if(this.data.isStart){
    console.log("移动")

      let startX = this.data.startX;
      let activeX = e.touches[0].x;
      let left = ((activeX - startX) + startX) / this.data.ratio;
      left = left + 0
      if(left <= 0 || left >= 600){
        left = 0
      }
      this.setData({
        left:left
      })
    }
  },

  // 触摸结束。验证码图案与背景图相差不过5。验证成功
  onEnd(e){
    if(this.data.isStart){
      if(this.data.randX - this.data.left <= 5 && this.data.randX - this.data.left >= -5){
        this.data.left = this.data.left
      }else{
        this.data.left = 0
      }
      this.data.isStart = false
    }
    
  },

  /**
   * 多边形  以宽80的图形为例
   * @param {*} canvas  canvas 2d绘图上下文
   * @param {*} bool 布尔值多边形如何展示
   * @param {*} x x坐标
   * @param {*} y y坐标
   */
  playCode(canvas, bool, x, y) {
    let width = this.data.rectWidth
    let r = this.data.r
    canvas.beginPath()
    if (bool) {
      canvas.fillStyle = "#999"
    } else {
      canvas.strokeStyle = "#00000000"
    }
    canvas.moveTo(x, y + r)
    canvas.lineTo(x + (width/2 - r), y + r)
    canvas.arcTo(x + (width/2 - r), y, x + (width/2), y, r)
    canvas.arcTo(x + (width/2 + r), y, x + (width/2 + r), y + r, r)
    canvas.lineTo(x + width, y + r)
    canvas.lineTo(x + width, y + width)
    canvas.lineTo(x + (width/2 + r), y + width)
    canvas.arcTo(x + (width/2 + r), y + (width - r), x + (width/2), y + (width - r), r)
    canvas.arcTo(x + (width/2 - r), y + (width - r), x + (width/2 - r), y + width, r)
    canvas.lineTo(x, y + width)
    canvas.lineTo(x, y + (width/2 + r))
    canvas.arcTo(x + r, y + (width/2 + r), x + r, y + (width/2), r)
    canvas.arcTo(x + r, y + (width/2 - r), x, y + (width/2 - r), r)
    canvas.lineTo(x, y + (width/2 - r))
    canvas.closePath()
    if (bool) {
      canvas.fill()
    } else {
      canvas.clip()
      canvas.stroke()
    }
  },

  // 随机数 最小值
  minRand(min, max) {
    return Math.floor(Math.random() * (max - min) + min)
  }

})

注:1.用来以后回忆现在的代码水平

        2.代码有问题望指正。文章来源地址https://www.toymoban.com/news/detail-486207.html

到了这里,关于微信小程序获取页面节点方法简介。canvas 滑动验证码 (前段,微信小程序,canvas2D)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序新版canvas绘制图片方法

    今天在做项目使用到了canvas绘制二维码,发现以前的方法被弃用了。 wxml: 如果想要绘制需要将起临时存储起来,写入成功的就可以进行绘制了。(如果是点击展示二维码,最好是先将数据写到onLoad事件中,在将要绘制的东西写到点击事件中去,在点击事件中去获取数据);

    2024年02月11日
    浏览(36)
  • 微信小程序获取节点的位置返回null

    微信小程序获取元素节点时,返回值为null的原因,是因为元素在页面数据渲染前,先调用的微信小程序的方法,此时元素节点还未渲染出来,所以拿不到节点位置,返回null。 解决办法:尽量避免动态生成元素节点,若避免不了,就设置个定时器,在页面加载几秒后再调用该

    2024年02月12日
    浏览(40)
  • 微信小程序canvas画布不清晰解决方法

    绘制的图片,文字等十分模糊 添加以下代码,通过设置分辨率来解决 完整代码: 模糊不清的时候 多多进行调试一下就可以了 多尝试新方案 

    2024年02月10日
    浏览(50)
  • 微信小程序获取元素节点并对其进行操作

    1.封装获取元素的方法 utils.js 2.页面js中引入 3.页面js中使用

    2024年02月16日
    浏览(34)
  • 微信小程序 获取window或某一节点的宽高

    异步方法: 同步方法: 如果查询节点为自定义组件内容,则要使用 in() 方法 例如查找的节点为当前组件内容: wx.createSelectorQuery().in(this).select(\\\'#container\\\')

    2024年02月15日
    浏览(33)
  • 如何获取微信小程序页面路径

    选择“工具”,“生成小程序码” 这样拿到的就是微信小程序的起始页面路径啦~

    2024年02月12日
    浏览(36)
  • 获取微信小程序页面路径【保姆级教程】

    1.进入微信小程序公众平台,登录账号,点击右上角生成小程序码 微信公众平台 2.输入小程序名称或者小程序的APPID或者原始ID,输入完成,然后点击搜索,然后下一步    3.输入自己的微信号之后,点击开启   4.看到提示开启成功之后,就可以在手机上去获取页面路径了  

    2024年02月16日
    浏览(37)
  • 微信小程序个人订单,微信头像用户名信息获取页面

    这里先做一个简单的展示,这个页面是我参加比赛做的小程序,分享给大家,不是很好看哈哈哈哈 话不多说,先上代码。首先是前端页面 .wxml   接下来是美化一下页面.wxss 最后就是js页面啦,这里涉及到微信头像昵称的获取,还有一些button的实现,我这里其他页面没有附着,

    2024年02月11日
    浏览(38)
  • 微信小程序页面跳转时URL获取不到参数

    原因: 在跳转的url参数中添加了包含特殊字符?的情况下 ,会出现参数丢失的情况 1.最近在小程序开发过程中,发现之前可用的某个功能字段展示为了undefined,后来查看参数发现 页面跳转时参数丢失了 导致的 此时获取到的参数都是正常的,在上线一段时间后,其它同学在 图

    2024年02月11日
    浏览(53)
  • uniapp,转微信小程序,获取当前页面的 路由、路由参数

    uniapp 获取当前路由信息跟 vue 不同,它没有 route 对象。 uniapp 转成小程序后是这样的 当前页面展示的路由信息就是上一条中获取到的 pages 的最后一条路由,即 它的内容是: 当前路由的参数 在 currentRoute.options 中 比如 index?type=diarydiaryid=123 的 options 就是 而 当前页面的完整路

    2024年02月14日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包