开发者问题收集

toDataURL 返回错误“未捕获的类型错误:无法读取未定义的属性‘0’”

2012-11-29
8459

我是 javascript 新手,遇到了错误。我肯定我跳过了一些基本概念……抱歉。

问题就在这里。

我在 html 上使用此代码:

<div>
<script type='text/javascript'>
var myCanvas = document.getElementsByTagName("canvas");
document.write('<img src="'+myCanvas[0].toDataURL("image/png")+'"/>');

</script></div>

我的文档上只有一个画布。我在 chrome 中看到的错误是:

Uncaught TypeError: Cannot read property '0' of undefined sankey.html:128 (anonymous function)

如果我在 java script chrome 控制台中输入

document.write('<img src="'+myCanvas[0].toDataURL("image/png")+'"/>');

(完全相同的行),它就可以正常工作!这怎么可能呢?

1个回答

您忘记了 [0]

var myCanvas = document.getElementsByTagName("canvas")[0];

getElementsByTagName 返回一个元素数组,您必须从中选择一个。(即使数组只包含 1 个元素)

执行此操作的“更干净”方法是在画布上设置一个 id ( id="myCanvas" ),并使用 getElementById ,但由于您只使用 1 个画布, getElementsByTagName 将起作用。

它返回 undefined 的原因可能是您的代码是在画布加载之前执行的。
将您的代码包装在一个函数中,然后将该函数注册到“load”事件

<script type='text/javascript'>
    var myCanvas;

    function initCanvas(){
        myCanvas = document.getElementsByTagName("canvas");
        document.write('<img src="'+myCanvas[0].toDataURL("image/png")+'"/>');
    }

    window.addEventListener('load', initCanvas, false);
</script>
Cerbrus
2012-11-29