ToDataURL не является функцией

Я пытаюсь создать URL-адрес для холста. Вот шаги, которые я выполнил:

var can = document.getElementsByTagName("canvas");
var src = can.toDataURL("image/png");

Когда я попытался запустить вышеуказанный код в firebug, он выдает сообщение об ошибке:

TypeError: can.toDataURL is not a function

Я запускаю firefox 8 на ubuntu.

Ответы

Ответ 1

getElementsByTagName возвращает NodeList [docs], а не один элемент.

Просто доступ к первому элементу списка:

var src = can[0].toDataURL("image/png");

Если вы хотите получить URL-адрес данных для каждого холста, вам придется перебирать список. В противном случае предоставление canvas идентификатора и получение ссылки с помощью getElementById может быть более удобным.

Ответ 2

var can = document.getElementsByTagName("canvas"); 

возвращает массив элементов холста. вам нужно получить холст по id.

var can = document.getElementById("canvasId"); 

Ответ 3

Дважды проверьте, что вы используете toDataURL() сам объект canvas, а не объект контекста.

Ответ 4

Что-то не упоминается в принятом ответе: даже при использовании селектора ID, jQuery Sizzle возвращает объект/коллекцию. Поэтому, если вы получаете эту ошибку при использовании jQuery, используйте app [0] для доступа к первому индексу элемента. Если вам интересно, индексы можно изучить, используя console.dir($('#canvasId));

Например, этот совершенно нормальный селектор потерпит неудачу:

var src = $('#canvasId').toDataURL("image/png");

Но это будет работать (обратите внимание на дополнительную скобку):

var src = ($('#canvasId')[0]).toDataURL("image/png");

Ответ 5

(Решено!) Я столкнулся с этой проблемой и решил ее. Прежде всего вы должны убедиться, что вы включили CDN HTML2CANVAS.js в ваши ссылки на скрипты в вашем теге head. Чтобы сделать это, вы должны вставить этот скрипт в тег head, после jquery CDN: (добавьте этот скрипт ниже в тег head)

<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script>

в этом CDN была определена функция toDataURL, и если вы перейдете по этой ссылке и выполните поиск (с помощью CTRL + F) на этой странице скрипта, вы можете найти функцию toDataURL. (который был определен в этом CDN) ТЕПЕРЬ мой тег head выглядит следующим образом, и он работает:

<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script>
</head>

Ответ 6

Этот код полезен для захвата изображения холста и загрузки из видео.

capture() {

  var video = document.getElementById('video');
  var canvas = $('#canvas');
  canvas.attr('width', 300);
  canvas.attr('height', 300);
  canvas[0].getContext('2d').drawImage(video, 0, 0, canvas.width(), canvas.height());
  console.log(canvas);
  var download = document.getElementById("download");
  var image = canvas[0].toDataURL("image/png");
  download.setAttribute("href", image);
}

<video id="video" width="300">
        <source src="videoURL" type="video/mp4">
    </video>

<a class="cmd-txt tar" href="" id="download" download="download.png">
  <img id="capture" src="src/assets/images/download_black.png" (click)="capture();" class="cursor-pointer" alt="download video image">
</a>

<canvas id="canvas">

</canvas>