Вопрос или проблема
Сначала извиняюсь за любые опечатки и тому подобное, так как я имею нарушения зрения.
У меня есть страница, которая позволяет пользователю создать диаграмму с помощью ползунков. Идея состоит в том, что они затем могут скачать диаграмму в виде изображения PNG или отправить по электронной почте себе.
Мне удалось сделать, чтобы опция загрузки работала, как показано в коде ниже (извиняюсь за его состояние, так как это еще в процессе разработки).
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу отправить это по электронной почте. Я пробовал использовать html-опцию mailto в качестве временного решения, но это не сработало, а также использую плагин (в настоящее время Forminator), который, к сожалению, не взаимодействует с кодом.
Я довольно новичок в этом, обычно занимаюсь только CSS, поэтому это вызывает небольшую головную боль.
<div class="sliders">
<div class="slidecontainer">
<div class="slideLabel">Конец бедности</div>
<div><input type="range" min="0" max="100" value="1" class="slider light" id="slider1" style="width:75%"></div>
</div>
<div class="slidecontainer" <div="">Образование</div>
<div><input type="range" min="0" max="100" value="1" class="slider light" id="slider2" style="width:75%"></div>
<div class="slidecontainer">
<div class="slideLabel">Здоровье</div>
<div><input type="range" min="0" max="100" value="1" class="slider light" id="slider3" style="width:75%"></div>
</div>
<div class="slidecontainer">
<div class="slideLabel">Гуманность и сообщества</div>
<div><input type="range" min="0" max="100" value="1" class="slider light" id="slider4" style="width:75%"></div>
</div>
<div class="slidecontainer">
<div class="slideLabel">Искусство, культура, наследие, наука</div>
<div><input type="range" min="0" max="100" value="1" class="slider light" id="slider5" style="width:75%"></div>
</div>
<div class="slidecontainer">
<div class="slideLabel">Любительский спорт</div>
<div><input type="range" min="0" max="100" value="1" class="slider light" id="slider6" style="width:75%"></div>
</div>
<div class="slidecontainer">
<div class="slideLabel">Конец смертельного конфликта</div>
<div><input type="range" min="0" max="100" value="1" class="slider light" id="slider7" style="width:75%"></div>
</div>
<div class="slidecontainer">
<div class="slideLabel">Забота об окружающей среде</div>
<div><input type="range" min="0" max="100" value="1" class="slider light" id="slider8" style="width:75%"></div>
</div>
<div class="slidecontainer">
<div class="slideLabel">Старшие/Молодежь, Инвалиды, Затруднения</div>
<div><input type="range" min="0" max="100" value="1" class="slider dark" id="slider9" style="width:75%"></div>
</div>
<div class="slidecontainer">
<div class="slideLabel">Вооруженные силы, службы экстренной помощи</div>
<div><input type="range" min="0" max="100" value="1" class="slider dark" id="slider10" style="width:75%"></div>
</div>
<div class="slidecontainer">
<div class="slideLabel">Благополучие животных</div>
<div><input type="range" min="0" max="100" value="1" class="slider light" id="slider11" style="width:75%"></div>
</div>
<div class="slidecontainer">
<div class="slideLabel">Религия</div>
<div><input type="range" min="0" max="100" value="1" class="slider light" id="slider12" style="width:75%"></div>
</div>
</div>
<div id="piechart"></div>
<div id="chart_img"></div>
<!-- Вкладки -->
<div class="tab" style="display:none">
<button class="tablinks" onclick="openChart(event, 'Pie')">Круговая</button>
<button class="tablinks" onclick="openChart(event, 'Bar')">Столбчатая</button>
</div>
<!-- Содержимое вкладок -->
<div id="Pie" class="tabcontent active">
<div id="piechartxxx"></div>
</div>
<div id="Bar" class="tabcontent">
<div id="barchart"></div>
</div>
И javascript:
$(document).ready(function() {
$(".slider").change(function () {
drawChart();
});
// Загрузка google charts
google.charts.load('current', {'packages':['corechart']});
google.charts.setOnLoadCallback(drawChart);
// Нарисуйте диаграмму и установите значения диаграммы
function drawChart() {
var dataChart = new google.visualization.DataTable();
dataChart.addColumn('string', 'Мера'); // Имплицитный столбец меток домена.
dataChart.addColumn('number', 'Оценка'); // Имплицитный столбец данных серии 1.
dataChart.addRows([
['Предотвращение или устранение бедности',parseInt($("#slider1").val())],
['Образование',parseInt($("#slider2").val())],
['Здоровье и спасение жизней',parseInt($("#slider3").val())],
['Гражданство, развитие сообщества',parseInt($("#slider4").val())],
['Искусство, культура, наследие, наука',parseInt($("#slider5").val())],
['Любительский спорт',parseInt($("#slider6").val())],
['Права человека, урегулирование конфликтов, религиозная или расовая гармония, равенство, разнообразие',parseInt($("#slider7").val())],
['Охрана окружающей среды или её улучшение',parseInt($("#slider8").val())],
['Помощь нуждающимся: молодость, возраст, плохое здоровье, инвалидность, финансовые трудности',parseInt($("#slider9").val())],
['Вооруженные силы, полиция, скорая помощь, пожарные и спасательные службы',parseInt($("#slider10").val())],
['Благополучие животных',parseInt($("#slider11").val())],
['Религия',parseInt($("#slider12").val())]
]);
// Опционально; добавьте заголовок и установите ширину и высоту диаграммы
var pieOptions = {'title':'Ваши приоритетные предпочтения', 'width':900, 'height':700,
colors: ['#FFFF00','#FF86C1','#C71585','#0000FF','#800080','#EE82EE','#FF0000','#7FFF00','#FFDAB9','#EEE8AA','#DDA0DD','#FFA500']};
// Отобразите диаграмму внутри элемента <div> с id="piechart"
var my_img = document.getElementById('chart_img');
var my_chart = new google.visualization.PieChart(document.getElementById('piechart'));
google.visualization.events.addListener(my_chart, 'ready', function () {
my_img.innerHTML = '<a href="' + my_chart.getImageURI() +
'" Title="Скачать круговую диаграмму" download="MyPieChart.png">Скачать диаграмму</a>';
});
var barOptions = {
height: 1000,
colors: ['red', 'green'],
title: 'Насколько Вы заботитесь',
chartArea: {width: '80%'},
hAxis: {
title: 'Процент 100',
minValue: 0,
maxValue: 100
},
vAxis: {
title: 'Тема'
}
};
var barChart = new google.visualization.BarChart(document.getElementById('barchart'));
my_chart.draw(dataChart, pieOptions);
barChart.draw(dataChart, barOptions);
}
});
function openChart(evt, chartName) {
var i, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tabcontent");
for (i = 0; i < tabcontent.length; i++) {
tabcontent[i].style.display = "none";
}
tablinks = document.getElementsByClassName("tablinks");
for (i = 0; i < tablinks.length; i++) {
tablinks[i].className = tablinks[i].className.replace(" active", " active");
}
document.getElementById(chartName).style.display = "block";
evt.currentTarget.className += " active";
}
Ответ или решение
Отправка скриншота div элемента по электронной почте — это распространенная задача, с которой часто сталкиваются разработчики веб-приложений. Давайте рассмотрим, как можно решить эту задачу, используя технологии, которые могут быть интегрированы в ваш проект.
Теория
Чтобы отправить скриншот div элемента по электронной почте, необходимо выполнить несколько ключевых шагов:
-
Создание изображения из div элемента: первоочередная задача — преобразовать содержимое div элемента в изображение. Это можно сделать с помощью библиотек JavaScript, например,
html2canvas
илиdom-to-image
. Эти библиотеки позволяют визуализировать HTML содержимое в виде изображений, а затем извлечь данные изображения. -
Отправка изображения по электронной почте: после создания изображения его необходимо отправить по электронной почте. Для отправки почты может использоваться серверная технология, например, Node.js, PHP или Python. В большинстве случаев надо использовать SMTP сервер или сервисы, такие как SendGrid, Mailgun или другие, для отправки писем.
Пример
Рассмотрим пример, как можно реализовать данную функциональность на клиентской и серверной стороне.
Шаг 1: Генерация изображения из div элемента
Вы можете использовать библиотеку html2canvas
для создания изображения. Вот как это можно сделать:
<!-- HTML -->
<button id="capture">Создать изображение и отправить по почте</button>
// JavaScript
document.getElementById('capture').addEventListener('click', function() {
html2canvas(document.querySelector("#chart")).then(canvas => {
var imgData = canvas.toDataURL('image/png');
// Теперь вам нужно отправить это изображение на сервер
sendEmailWithImage(imgData);
});
});
Шаг 2: Отправка изображения по электронной почте
На серверной стороне вам нужен скрипт, который будет принимать ваш запрос и отправлять изображение по почте. Приведем пример с использованием Node.js и библиотеки nodemailer для отправки изображений по электронной почте:
// Серверная часть на Node.js
const nodemailer = require('nodemailer');
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json({limit: '10mb'}));
app.post('/send-email', (req, res) => {
let imgData = req.body.img;
let email = req.body.email;
// Настройки вашего почтового сервиса
let transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'your-email@gmail.com',
pass: 'your-email-password'
}
});
let mailOptions = {
from: 'your-email@gmail.com',
to: email,
subject: 'Скриншот диаграммы',
html: '<h1>Ваша диаграмма</h1><img src="' + imgData + '"/>'
};
transporter.sendMail(mailOptions, function(error, info){
if (error) {
res.status(500).send('Error while sending mail: ' + error);
} else {
res.status(200).send('Email sent: ' + info.response);
}
});
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
Шаг 3: Связывание клиентского и серверного кода
Обратимся к клиентскому JavaScript коду для отправки изображения на сервер:
function sendEmailWithImage(imgData) {
fetch('/send-email', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
img: imgData,
email: 'recipient@example.com'
})
}).then(response => {
if (response.ok) {
alert('Email отправлено успешно!');
} else {
alert('Ошибка при отправке email.');
}
});
}
Применение
Использование библиотеки html2canvas
позволяет создавать скриншоты любых HTML элементов в формате изображения. Вы можете использовать полученные изображения в различных приложениях: для создания отчетов, препроцессинга графических данных, усиления визуальной составляющей веб-документов или просто для предоставления пользователям возможности сохранять визуализированные данные.
Особого внимания требует аспект безопасности при отправке данных, связанных с использованием пользовательских учетных данных почтовых серверов. Рекомендуется применять проверенные механизмы аутентификации и защищенные соединения.
Заключение
Отправка скриншота div элемента по электронной почте — процесс многогранный, включающий создание, обработку и отправку изображений. Он требует координации клиентской и серверной частей приложения. Внедрение такой функциональности, как в рассмотренном выше примере, позволяет существенно расширить возможности веб-приложений, делая их более интерактивными и удобными для пользователей.