JS 代理 HTML5 画布上下文

2024-03-10

我希望代理画布 API,这样我就可以测试抽象方法是否确实绘制到画布上,但是我遇到了代理后出现错误的问题:

'strokeStyle' setter called on an object that does not implement interface CanvasRenderingContext2D

此代码已简化,但会引发相同的错误:

/** !NB: This snippet will probably only run in Firefox */
var canvas = document.createElement("canvas");
canvas.width = 100;
canvas.height = 100;
canvas.style.backgroundColor = '#FF0000';

var ctx = canvas.getContext("2d");                          
var calls = [];

var handler = {
    get( target, property, receiver ) {

        if ( typeof ctx[property] === 'function' ){
            return function( ...args ){
                calls.push( { call: property, args: args } )
                return ctx[property]( ...args );
            };
        }

        return ctx[property];
    }
};

try {
    document.body.appendChild(canvas);
    var proxy = new Proxy( ctx, handler );
    
    proxy.scale( 1, 1 );
    proxy.strokeStyle = '#000000';
    
    canvas.getContext = function(){
        return proxy;  
    };
}
catch( e ) {
    document.getElementById('message').innerHTML = 'Error: ' + e.message;   
}
<div id="message"></div>

有什么想法吗?


您可以通过定义一个来修复此错误set您的处理程序上的方法:

set(target, property, value, receiver) {
    target[property] = value;
}

这个错误的原因可能看起来有点奇怪。CanvasRenderingContext2D实例没有自己的strokeStyle财产。相反,CanvasRenderingContext2DPrototype(每个的原型CanvasRenderingContext2D实例)有一个访问器属性,其set/get组件将设置并获取实例的笔划样式值:

> ctx.hasOwnProperty("strokeStyle")
false

> Object.getOwnPropertyDescriptor(ctx.__proto__, "strokeStyle")
Object { get: strokeStyle(), set: strokeStyle(), enumerable: true, configurable: true }

(如果您有兴趣了解有关此模式的更多信息,请查看我的回答JSON.parse 在循环对象上不会出错 https://stackoverflow.com/q/20381239/710446.)

这里的问题是this供应给CanvasRenderingContext2DPrototype.strokeStyle设置器是proxy对象,而不是实际的ctx目的。也就是说,当我们仅在代理上设置属性时:

proxy.isAFake = true;

并在重新定义的设置器中测试它:

Object.defineProperty(ctx.__proto__, "strokeStyle", {
    set: function() {
        console.log("strokeStyle setter called for proxy?", this.isAFake);
    }
});

我们看到设置器记录了仅代理属性:strokeStyle setter called for proxy? true.

无论出于何种原因,二传手CanvasRenderingContext2DPrototype.strokeStyle只接受正品CanvasRenderingContext2D实例,而不是代理实例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS 代理 HTML5 画布上下文 的相关文章

  • Node 和 General 中的 MVC:模型如何与视图绑定?

    我从 node js 开始 正在制作一个简单的 MVC 框架 到目前为止 我已经有一个前端控制器 或 调度程序 如果你愿意的话 可以工作 路由通过调度程序配置模块进行 如图所示 我的问题在最后 紧接代码之后 另外 这是学习node的练习 请
  • 在气球内显示带有照片的多个地标的最佳做法是什么?

    我有一个项目如下 从手机上拍摄几张照片 将照片保存在网络系统中 然后将照片显示在其中的谷歌地球上 我读过很多文章 但它们都使用 fetchKml 我读过的一篇好文章是使用 php 但使用 fetchKml 我不知道是否可以使用 parseK
  • 关闭 Godot 中的游戏

    我正在使用 Godot 创建网页游戏 为了关闭游戏 我尝试使用 get tree quit 如果我在 IDE 上使用它 它就可以工作 当我在我的服务器上尝试它时 导出项目后 它不起作用 我确信导出设置没问题 我怎样才能关闭游戏 并且 如何添
  • 页面其余部分完成加载后延迟加载 html5 视频

    我有一个视频元素用作我正在构建的页面底部部分的背景 我试图通过将 src 存储为 data src 属性并使用 jQuery 在其他资源加载后将其应用到 src 属性 因为它不是英雄图像或任何东西 我想加载海报以节省加载时间 然后稍后加载视
  • 无法让 CloudKit 进行身份验证(使用 Javascript 和服务器到服务器密钥)

    我正在尝试使用苹果的cloudkit js文件以建立与 CloudKit 的服务器到服务器连接 然而 尽管配置混乱了几个小时 我似乎无法让 CloudKit 认为我的请求有效 我的配置逻辑非常简单 const privateKeyFile
  • 在 JavaScript 中引用 C# 变量

    我已经阅读了很多线程 但我不明白为什么这不起作用 我正在创建一个将用作导航栏的 SharePoint Web 部件 一切都很顺利 直到我尝试在 JS 代码中引用 C 变量 这是来自 VisualWebPart1UserControl asc
  • Antd 选择搜索框未呈现匹配项

    我有产品数据 我正在使用搜索值过滤数据 然后使用过滤后的数据呈现选项 产品数据作为道具来自全局 redux 存储 由于某种原因 下拉列表仅在搜索值为空时显示数据 当我开始输入时 filteredData已更新 组件也重新渲染 但选项不显示任
  • 使用点符号将数字传递到函数中

    如果我有一个对象和函数 var obj 1234 example sample 5678 example sample function example num str if obj num hasOwnProperty str manip
  • 仅使用 CSS 向电话号码添加空格

    我有一个生成 HTML 电话号码的页面 如下所示 div class phone 01987123456 div 我想要的只是在数字内添加一个空格 如下所示 01987 123456 生成的数字和 HTML 始终相同 但我只能访问客户端代码
  • 如何在javascript中删除一组表情符号中的最后一个表情符号?

    假设我的字符串中有 3 个表情符号 字符串中没有任何空格或除表情符号之外的任何其他字符 如何删除javascript中最后一个表情符号 下面的答案不使用任何特殊的包并安全地删除最后一个表情符号 function safeEmojiBacks
  • 启动 onclick 比使用 document.onload 更快

    我有带有链接的 html 页面 我想在其中附加一个功能onclick事件 一种方法当然是 a href save php Save a 但我知道这不是最佳做法 所以我反而等待window onload 循环遍历链接并将保存功能附加到链接re
  • 无法安装js-bson

    我正在使用Windows 7 64位 尝试安装bson作为mongodb的依赖项 我收到此错误 npm WARN package json email protected cdn cgi l email protection No READ
  • 如何在没有 DOM 的情况下将 javascript 作为 node.js 脚本运行?

    https github com jasondavies d3 cloud https github com jasondavies d3 cloud是一个使用 D3 库的 javascript 文字云 这是一个交互式演示 http www
  • 防止 Bootstrap IE 下拉列表在滚动条单击时关闭

    在 IE 中 单击下拉菜单滚动条时 下拉菜单将关闭 当您使用鼠标滚轮滚动它时 效果很好 这是代码层链接 https www codeply com go Uh8qadr3q2 https www codeply com go Uh8qadr
  • 将罗马数字转换为阿拉伯数字--recursiv

    我是 JavaScript 新手 正在网站的帮助下学习https www jshero net koans roman1 html https www jshero net koans roman1 html 本练习是编写一个转换器 将罗马
  • jQuery clone() 复制数据...有时...?

    使用下面的示例 我有一个tr我正在复制 它包含一个 jQueryautocomplete 第一次克隆时 自动完成功能不起作用 因为附加的data items 一片空白 第二次单击 添加 按钮时 自动完成功能将起作用 此后 再次单击 添加 会
  • Google 折线图添加对象数组

    我有一个通过解析 JSON 字符串创建的对象数组 var measurementData Html Raw JsonConvert SerializeObject this Model Item1 var stringifiedData J
  • HTML5 画布将颜色应用于形状重叠的图像

    我将此图像绘制到 HTML5 画布上 我想做的就是只给它的一部分应用颜色 我想要应用颜色的部分由以下覆盖图像定义 所以 基本上 我想通过叠加来指导我的着色 因此 在覆盖像素与主图像像素相遇的地方 我应该在主图像上应用颜色 至少我认为它是这样
  • 类型错误:无法读取未定义的属性“长度” - 使用安全帽部署时

    我在尝试在安全帽开发链上部署模拟合约时收到以下错误 我正在关注 使用 JavaScript 学习区块链 Solidity 和全栈 Web3 开发 Patrick Collins 在 FreeCodeCamp YT 频道上的 32 小时课程
  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik

随机推荐

  • 签署 mac 安装程序 (pkgmaker)

    我的安装程序是使用 PackageMaker 创建的 之后 我使用以下命令对安装程序进行了代码签名 产品签名 签名 Blah Inc 安装 mpkg CS 安装 mpkg 这似乎工作得很好 我可以看到它是使用以下命令签名的 pkgutil
  • 在Linux中,有没有办法找出哪个PCI卡插入哪个PCI插槽?

    在Linux中 有没有办法找出哪个PCI卡插入哪个PCI插槽 sys bus pci devices 包含许多不是卡的设备 桥 CPU 通道等 我无法在设备目录中找到有关插槽卡映射的任何信息 您可以使用 dmidecode t slot 查
  • 事件处理顺序

    Javascript jQuery 事件处理 如果事件 例如 点击 为父元素绑定了一个函数 为子 DOM 元素绑定了另一个处理函数 那么会调用哪一个函数 如果全部都被调用 那么按什么顺序调用 事件在 DOM 树中 向上 冒泡 因此如果您有某
  • 如何使用 ng-repeat track by $index 创建的量角器选择元素?

    我需要选择 ng repeat 创建的文本框并使用 sendKeys 函数发送一些值 但我不确定选择文本框的方法 请建议一种方法来完成此任务 或者我应该使用 css 选择器来代替 div class qst input hld ng sco
  • 使用 fopen 时出现段错误

    我从以下代码的第二行收到段错误 FILE output NULL output fopen output2 txt w 我不认为这是某种损坏的内存错误 因为当我将 w 更改为 r 时 它运行时没有段错误 另外 它似乎是在出现段错误之前创建该
  • ng-show/ng-if 不会立即更新 dom 高度

    我有一个很长的 div 它是由 ng hide 隐藏 显示的 这是一个基于离子的示例demo http codepen io leonz full bEqbKM 单击该按钮可以显示或隐藏 longDiv 如果您尝试在隐藏或显示页面后立即滚动
  • 如何从 pandas groupby 对象创建多个数据框

    我正在尝试在多索引数据帧 df 上使用 groupby 创建新的数据帧 级别 0 是字符串标识符 级别 1 是日期时间索引 最终我想确定每个 vsl 与每个 DIV 和 DIS 关联的总时间 这是 df 的片段 DIV DIS vsl Be
  • 派生类中的 sizeof(*this) 和 decltype(*this)

    假设有类 struct A int a virtual size t GetMemoryUsage const return sizeof this struct B public A int b 而且可能还有更深层次的传承 我想要的是有一
  • 下面的 for 循环语法在 C 中意味着什么?

    我遇到了这个语法 不知道它意味着什么 for do stuff like read from a handle etc 我仍然处于 C 语言的学习曲线上 所以如果你愿意的话 如果这是一个蹩脚的问题 请投票否决 这是一个无限循环 与 一样wh
  • Jersey:禁用默认 JSON 提供程序

    我正在使用 Jersey 2 17 JSON 和自动功能发现 我有我的自定义 JSON Provider 扩展JacksonJsonProvider 它的注释是 Provider并自动注册 与附带的默认注册相同
  • React - 单个组件的动画安装和卸载

    这么简单的事情应该很容易完成 但我却对它的复杂程度感到抓狂 我想做的就是为 React 组件的安装和卸载设置动画 仅此而已 以下是我迄今为止尝试过的方法以及每个解决方案不起作用的原因 ReactCSSTransitionGroup 我根本没
  • 类型“HttpRequestMessage”在未引用的程序集中定义

    当我在本地构建时它可以工作 但我的 VSTS 托管 2017 实例构建失败并显示以下消息 error apps Ascend Identity AccountController cs 126 17 Error CS0012 The typ
  • 将多个图包裹在一个图像中

    我试图将许多图包装在一起 因为它们密切相关 使用 1 个连续变量和 1 个分类变量显示密度 按一周中的某一天细分 其中每一天都是不同的图 在 R 中 我可以使用grid arrange from gridExtra or facet wra
  • 如何在普通的
    中使用 而不是

    我有一个使用标准 HTML 的搜索表单
  • 制定紧凑的隐私政策

    我正在研究使用 cookie 进行跟踪的想法 并注意到我当前的网站没有紧凑的隐私政策 我用谷歌搜索了一下 有很多方法可以创建它们 但要付出一定的代价 只是想知道是否有一种方法可以在不付费的情况下做到这一点 有任何想法吗 我正忙着同样的事情
  • Angular 2+ 中的 Azure Graph / Microsoft Graph 查询

    我想在 Angular 5 Web 应用程序中从 Azure Active Directory 查询应用程序角色和组声明 我想授予管理员对页面的特殊权限 访问权限 我在 Azure 中注册了一个 B2C 应用程序 在以下地址注册了一个 Mi
  • 如何获取redis中的所有集合?

    我知道 KEYS 命令 但它只返回键 我猜测所有类型为 String 的键 并且显然集合不被视为键 有没有获取数据库中所有集合的命令 其他数据类型 散列 列表 排序集 怎么样 http redis io topics data types
  • 如何保持 RTSP 会话存活?

    我尝试在 Google Nexus S 2 3 7 HTC Desire 2 3 3 和 Samsung Galaxy 3 2 上进行流式传输 只有 Google Nexus 存在 RTSP 会话超时问题 我阅读了一些关于这个问题的帖子 似
  • 将 GeoDataFrame 多边形转换为 kml 文件

    我有一个 geopandas GeoDataFrame 其中包含各种多边形和颜色 我用它来绘制气象数据 我问的另一个问题here https stackoverflow com questions 35516318 plot colored
  • JS 代理 HTML5 画布上下文

    我希望代理画布 API 这样我就可以测试抽象方法是否确实绘制到画布上 但是我遇到了代理后出现错误的问题 strokeStyle setter called on an object that does not implement inter