Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.06.2021, 16:01
Кандидат Javascript-наук
Отправить личное сообщение для Was-Ja Посмотреть профиль Найти все сообщения от Was-Ja
 
Регистрация: 20.09.2020
Сообщений: 130

Можно ли загрузить в img.src содержимое JS переменной синхронно?
Добрый день,

имею конструкцию, в которой мне надобно загрузить одну и ту же картинку в несколько канвасов (все скрыты display:none, потом с ними сделать некоторые преобразования, а потом показывать по одному в зависимости от обстоятельств.

Важный момент, сама картинка лежит в переменной JS.

Сейчас я делаю так:
function ID(id) { return document.getElementById(id); }

// ...

  let ctx_0 = ID("MainInitFrame_0").getContext("2d");
  let img_0 = new Image();

  img_0.src=MainInitFrame_Data;
  ctx_0.drawImage(img_0, 0, 0);

  let ip_0 = ctx_0.getImageData(0, 0, X_Size, Y_Size).data;


но, содержимое ip_0 не всегда содержит картинку.

Попробовал через onload - тоже не получилось...

Полный пример лежит по адресу https://www.elegant-nmr.com/tst/l.html

Скажите, пожалуйста, есть ли способ синхронной загрузки картинки из переменной

img_0.src=MainInitFrame_Data;

Спасибо!

Последний раз редактировалось Was-Ja, 06.06.2021 в 16:31.
Ответить с цитированием
  #2 (permalink)  
Старый 06.06.2021, 18:10
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Есть один deprecated способ, но я вам его не скажу.)
Потому что он подвесит страницу на всё время загрузки картинки, что может занять от секунды до минут и более на медленном соединении.

Изучайте асинхронность в javascript, без этого вы всё равно никуда не уедите.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 06.06.2021, 18:32
Кандидат Javascript-наук
Отправить личное сообщение для Was-Ja Посмотреть профиль Найти все сообщения от Was-Ja
 
Регистрация: 20.09.2020
Сообщений: 130

Спасибо большое, Aetae, что помогаете!

Переписал через onload, все равно не помогает. По ссылке выше уже обновленная версия.

То есть сейчас я делаю:

var MainInitFrame_Img;

...


MainInitFrame_Img = new Image();
MainInitFrame_Img.onload=MainInitFrame_Init2();
MainInitFrame_Img.src=MainInitFrame_Data;


а в MainInitFrame_Init2 уже пытаюсь использовать MainInitFrame_Img:

let ctx_0 = ID("MainInitFrame_0").getContext("2d");
ctx_0.drawImage(MainInitFrame_Img, 0, 0);

let ip_0 = ctx_0.getImageData(0, 0, X_Size, Y_Size).data;


и все равно не стабильно работает... Если вызвать два раза

MainInitFrame_Img.src=MainInitFrame_Data;

один перед onload, другой раз внутри onload то более-менее всегда работает, но ведь так не должно быть!!!

Этот пример по ссылке выше, там добавление-удаление второго копирования в 95-ой строчке.

Цитата:
Потому что он подвесит страницу на всё время загрузки картинки, что может занять от секунды до минут и более на медленном соединении.
У меня же нет соединения! На момент, когда мне это нужно, сама картинка уже находится в локальной переменной в JS!!!
Ответить с цитированием
  #4 (permalink)  
Старый 06.06.2021, 18:34
Кандидат Javascript-наук
Отправить личное сообщение для Was-Ja Посмотреть профиль Найти все сообщения от Was-Ja
 
Регистрация: 20.09.2020
Сообщений: 130

То есть резюмируя, я предполагаю, что мне надо onload на какую-то другую опцию перевести, когда картинка уже отрисовалась, но я не знаю как такая опция называется и вопрошаю, посоветуйте, мне ее, пожалуйста!
Ответить с цитированием
  #5 (permalink)  
Старый 06.06.2021, 19:21
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

MainInitFrame_Img.onload=MainInitFrame_Init2(); -> MainInitFrame_Img.onload=MainInitFrame_Init2;

() - это вызов функции вот прям тут. Вы хотите не вызвать функцию, а передать её, чтоб при событии load она была вызвана.
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 06.06.2021, 21:05
Кандидат Javascript-наук
Отправить личное сообщение для Was-Ja Посмотреть профиль Найти все сообщения от Was-Ja
 
Регистрация: 20.09.2020
Сообщений: 130

Спасибо большое, Aetae,

ой, как же я лажанулся... Все выходные с этой проблемой разбирался и такой тривиальный баг не заметил, а все от того, что в С/С++ это была бы ошибка приведения типа, а тут в синтаксисе языка разрешено и я на это не обратил внимания. А из-за того, что картинка была локально сохранена в JS переменной я долго был уверен, что с onload и без вести себя программа должна одинаково, поэтому всячески искал проблему на не асинхронном варианте.

Все заработало! Спасибо большое, что помогли найти мою глупейшую ошибку!!!
Ответить с цитированием
  #7 (permalink)  
Старый 10.06.2021, 10:14
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от Was-Ja
а тут в синтаксисе языка разрешено и я на это не обратил внимания.
используй TS (лучше всего - строгий), все ошибки будут на лету подсвечиваться в IDE
Ответить с цитированием
  #8 (permalink)  
Старый 10.06.2021, 10:42
Кандидат Javascript-наук
Отправить личное сообщение для Was-Ja Посмотреть профиль Найти все сообщения от Was-Ja
 
Регистрация: 20.09.2020
Сообщений: 130

Спасибо, Alexandroppolus за совет!

Сообщение от Alexandroppolus Посмотреть сообщение
используй TS (лучше всего - строгий), все ошибки будут на лету подсвечиваться в IDE
интересно, а в Vim это можно как-то сделать? У меня просто веб интерфейс сильно завязан на backend на С++ и я все это одновременно разрабатываю, а в Vim по крайней мере легко подсвечивать синтаксис JSON структур, которые я между фронт и бек эндами гоняю. То есть у меня есть такие самописные headers, которые в зависимости от того, куда я их вставляю, или в С++ ставляются, или парсятся и в JS вставляются. Бекенд на g++ со вставками на CUDA и строго под линукс.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передать значение переменной из php в js wayzer jQuery 6 09.09.2012 23:26
Можно ли средствами JS узнать высоту скрытого элемента? ацкий Общие вопросы Javascript 7 24.08.2011 19:07
Подскажите сайт(помимо этого) на котором можно поучиться JS Ruzarh Учебные материалы 2 24.05.2011 10:36
Как вывести содержимое PHP файла с помощью JS? pavdin Серверные языки и технологии 6 22.12.2010 14:16
Как загрузить содержимое web-страницы и провести ее анализ с помощью Js stakker Events/DOM/Window 9 05.02.2010 23:55