Используя ваш код, проблема в том, что вы не дождались назначения сокета для запроса, прежде чем пытаться установить материал на объект сокета. Это все async так:
var options = { ... }
var req = http.request(options, function(res) {
// Usual stuff: on(data), on(end), chunks, etc...
});
req.on('socket', function (socket) {
socket.setTimeout(myTimeout);
socket.on('timeout', function() {
req.abort();
});
});
req.on('error', function(err) {
if (err.code === "ECONNRESET") {
console.log("Timeout occurs");
//specific error treatment
}
//other error treatment
});
req.write('something');
req.end();
Событие 'socket' запускается, когда запросу присваивается объект сокета.
Есть 5 шагов. Я часто использую этот метод для вывода inline svg.
//get svg element.
var svg = document.getElementById("svg");
//get svg source.
var serializer = new XMLSerializer();
var source = serializer.serializeToString(svg);
//add name spaces.
if(!source.match(/^<svg[^>]+xmlns="http\:\/\/www\.w3\.org\/2000\/svg"/)){
source = source.replace(/^<svg/, '<svg xmlns="http://www.w3.org/2000/svg"');
}
if(!source.match(/^<svg[^>]+"http\:\/\/www\.w3\.org\/1999\/xlink"/)){
source = source.replace(/^<svg/, '<svg xmlns:xlink="http://www.w3.org/1999/xlink"');
}
//add xml declaration
source = '<?xml version="1.0" standalone="no"?>\r\n' + source;
//convert svg source to URI data scheme.
var url = "data:image/svg+xml;charset=utf-8,"+encodeURIComponent(source);
//set url value to a element's href attribute.
document.getElementById("link").href = url;
//you can download svg file by right click menu.
Я знаю, что на это уже был дан ответ, и этот ответ хорошо работает большую часть времени. Однако я обнаружил, что это не удалось в Chrome (но не в Firefox), если изображение svg было большим (примерно 1 МБ). Он работает, если вы вернетесь к использованию конструкции Blob
, как описано здесь здесь и здесь . Единственное отличие - это аргумент типа. В моем коде я хотел нажать одну кнопку, чтобы загрузить svg для пользователя, который я выполнил с помощью:
var svgData = $("#figureSvg")[0].outerHTML;
var svgBlob = new Blob([svgData], {type:"image/svg+xml;charset=utf-8"});
var svgUrl = URL.createObjectURL(svgBlob);
var downloadLink = document.createElement("a");
downloadLink.href = svgUrl;
downloadLink.download = "newesttree.svg";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
downloadLink
в document.body
– piotr_cz
22 August 2017 в 10:26
.outerHTML
не работает в Internet Explorer. Но вы можете использовать XMLSerializer()
как defghi1977 . Все остальное сохраняет то же самое.
– roland
23 October 2017 в 13:06
Сочетание ответов Дэйва и Дегги1977. Вот многократно используемая функция:
function saveSvg(svgEl, name) {
svgEl.setAttribute("xmlns", "http://www.w3.org/2000/svg");
var svgData = svgEl.outerHTML;
var preface = '<?xml version="1.0" standalone="no"?>\r\n';
var svgBlob = new Blob([preface, svgData], {type:"image/svg+xml;charset=utf-8"});
var svgUrl = URL.createObjectURL(svgBlob);
var downloadLink = document.createElement("a");
downloadLink.href = svgUrl;
downloadLink.download = name;
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
}
Пример вызова:
saveSvg(svg, 'test.svg')