在 HTML 画布中创建链接

2023-12-27

是否可以从 canvas 元素中呈现的文本创建 html 链接?


没有简单的方法。您必须将链接文本绘制到画布上,然后检查鼠标单击情况。这是一个演示 html 页面:

<html>
<head>
<script type="text/javascript">
var canvas = document.getElementById("myCanvas");
var ctx;
var linkText="https://stackoverflow.com";
var linkX=5;
var linkY=15;
var linkHeight=10;
var linkWidth;
var inLink = false;

// draw the balls on the canvas
function draw(){
  canvas = document.getElementById("myCanvas");
  // check if supported
  if(canvas.getContext){
  
    ctx=canvas.getContext("2d");
    
    //clear canvas
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    
    //draw the link
    ctx.font='10px sans-serif';
    ctx.fillStyle = "#0000ff";
    ctx.fillText(linkText,linkX,linkY);
    linkWidth=ctx.measureText(linkText).width;
    
    //add mouse listeners
    canvas.addEventListener("mousemove", on_mousemove, false);
    canvas.addEventListener("click", on_click, false);

  }
}

//check if the mouse is over the link and change cursor style
function on_mousemove (ev) {
  var x, y;

  // Get the mouse position relative to the canvas element.
  if (ev.layerX || ev.layerX == 0) { //for firefox
    x = ev.layerX;
    y = ev.layerY;
  }
  x-=canvas.offsetLeft;
  y-=canvas.offsetTop;
  
  //is the mouse over the link?
  if(x>=linkX && x <= (linkX + linkWidth) && y<=linkY && y>= (linkY-linkHeight)){
      document.body.style.cursor = "pointer";
      inLink=true;
  }
  else{
      document.body.style.cursor = "";
      inLink=false;
  }
}

//if the link has been clicked, go to link
function on_click(e) {
  if (inLink)  {
    window.location = linkText;
  }
}
</script>
</head>
<body onload="draw()">
<center>
<canvas id="myCanvas" width="200" height="200" style="border-style:solid;border-width:1px">Canvas not supported.</canvas>
</center>
</body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 HTML 画布中创建链接 的相关文章

随机推荐

  • 更新数百万个文档的嵌套字段

    我使用脚本进行批量更新来更新嵌套字段 但这非常慢 POST index type bulk update id 1 script inline ctx source nestedfield add params nestedfield pa
  • Agda 函数、类型匹配函数

    我想创建一个辅助函数 它将从索引或参数化类型中获取术语并返回该类型参数 showLen len A Set gt Vec A len gt showLen len showType len A Set gt Vec A len gt Set
  • 测试点是否在匹配的引号之间 (emacs lisp)

    我们如何检查是否 point 在匹配的 引号 内 示例 1 point 但不在范围之内 示例 2 此处引用 point 那里引用 在 Emacs Lisp 中 您正在寻找的是syntax ppss 定义于syntax el 它返回 10 个
  • 如何在Python中捕获自定义异常[重复]

    这个问题在这里已经有答案了 我正在使用一个 python 库 其中在某一时刻定义了一个异常 如下所示 raise Exception Key empty 我现在希望能够捕获该特定异常 但我不知道该怎么做 我尝试了以下方法 try raise
  • C++ 中的比较性能( foo >= 0 与 foo != 0 )

    我最近一直在写一段代码 其中性能非常重要 基本上我有以下情况 int len some very big number int counter some rather small number for int i len i gt 0 i
  • flutter:带有后备文本的 CircleAvatar

    我正在学习 Flutter 想做一个Widget就像内置的一样CircleAvatar 但是 我希望这种行为是 指定图像 NetworkImage 和缩写 即 BB 当图像未加载时 显示缩写 如果图像加载 则显示图像并删除缩写 下面的代码可
  • 实现惰性函数式语言

    当实现惰性函数式语言时 有必要将值存储为未计算的 thunk 仅在需要时才进行计算 有效实施的挑战之一 如在例如中所讨论的 无脊椎无标签 G 机 是这个评估必须对每个重击执行一次 并且后续访问必须重用计算值 如果不这样做将导致至少二次方减速
  • 为什么我无法减小该文本的行高?

    http jsfiddle net mJxn4 http jsfiddle net mJxn4 这很奇怪 我有几行文本包裹在 em 标签 无论我做什么 都会降低价值line height低于 17px 没有效果 我可以撞line heigh
  • Flash/Flex 跨域问题 - 对来自 AWS S3 的图像使用 BitmapData.draw() 会导致 SecurityError:错误 #2122:违反安全沙箱

    我在 DisplayObject 上使用 BitmapData draw 其中包含来自我的 AWS S3 存储桶的图像 当我将 S3 图像 URL 设置为 Image 对象的源时 图像在 swf 中加载正常 但当我在其上使用 BitmapD
  • magento 中的货币符号

    我用两种不同的语言创建了两个 Magento 商店视图 English Dutch 英语 EURO 货币符号以正确的方式出现 例如 20 00 但对于荷兰语视图 它显示为 20 00 EUR 我想为两种视图设置默认符号 因为欧元是相同的 我
  • 哪个 magento 表包含产品图像名称?

    我遇到的问题是我使用 Magmi magento 产品导入开源解决方案 导入产品 但我在前端看不到产品图像 我需要知道 magento 数据库中的哪个表包含图像名称 以便我可以直接以某种方式提供它 Catalog product entit
  • PHP 停用词列表

    我正在代码中使用停止词 我有一个充满我想要检查的单词的数组 以及一个我想要检查的单词数组 目前 我一次循环一个数组 并删除该单词 如果其 in array 与停用词列表 但我想知道是否有更好的方法来做到这一点 我已经查看了 array di
  • 有没有办法同时查看两个 Laravel Mix Webpack 配置文件是否有任何更改?

    使用 Laravel Mix 是否可以使用一个命令查看两个 Webpack 配置文件 以便对任何底层文件的更改立即导致必要的文件被编译 具体来说 我有以下两个与 Laravel Mix 一起使用的 Webpack 配置文件 webpack
  • 现代英特尔处理器有多少种超标量方式?

    我刚刚了解了超标量处理器 https en wikipedia org wiki Superscalar processor https en wikipedia org wiki Superscalar processor 我还了解到 随
  • SqlBulkCopy - 给定的 ColumnName 与源或目标中的任何列都不匹配

    我正在尝试使用 SqlBulkCopy 将数据复制到 SQL 数据库表中 但它 错误地 说列不匹配 他们确实匹配 如果我使用断点来查看正在映射的列的名称 它们是正确的 错误消息显示了列的名称 并且它是正确的 这是我的方法 我有一个相同的方法
  • 根据String生成唯一的Hash码

    我有以下两个字符串 var string1 MHH2016 05 20MASTECH HOLDINGS INC Financialshttp finance yahoo com q is s mhhEDGAR Online Financia
  • 将数据框折叠成单行并基于 R 行创建新列

    我有一个包含对象名称和该对象的统计矩列表的数据框 如下所示 Object Mean IQR Skew x 1 1 1 y 2 2 2 z 3 3 3 我想要的是为每一行创建带有统计矩和对象名称前缀的列 就像这样 xMean xIQR xSk
  • 如何编写递归打印程序

    Gurus 我想知道如何编写一个打印的递归函数 1 12 123 1234 例如 display 4 应该打印 1 12 123 1234 Code include
  • Redux router - 刷新后如何重放状态?

    我有一个多步骤表单应用程序 我正在努力思考如何保存我的 redux 状态并在刷新后重播它 在应用程序中后退 前进按预期工作 但浏览器刷新后 我之前的状态为空 理想情况下 我希望能够将先前的状态保存在与路径相关的会话存储中 以便稍后重播 但我
  • 在 HTML 画布中创建链接

    是否可以从 canvas 元素中呈现的文本创建 html 链接 没有简单的方法 您必须将链接文本绘制到画布上 然后检查鼠标单击情况 这是一个演示 html 页面