Предыстория: Я пытался решить проблему добавления существующих локальных файлов SVG
в контейнер SVG d3
в настольном приложении Electron
. Я обнаружил, что не могу использовать d3.svg()
в локальных файлах, потому что fetch
не работает с протоколом file
(так сказано в сообщении об ошибке).
Я наткнулся на этот суть, на который ссылается этот вопрос, для расширения d3.selection
, и, похоже, он делает именно то, что мне нужно, добавляя функции appendHTML
и appendSVG
.
Тем не менее, когда я протестировал код (внизу внизу), он выдал ошибку: «Невозможно прочитать свойство 'prototype of undefined» — задыхается в этой строке:
d3.selection.enter.prototype.appendHTML
Я немного поковырялся в процессе входа в консоль и нашел это изменение, и, похоже, оно работает:
d3.selection.prototype.enter.prototype.appendHTML
Мой вопрос: Правильно ли я делаю? Что-то изменилось в d3
, что требует дополнительной ссылки prototype
? Я не герой Javascript или d3 и хотел бы понять, в чем здесь разница.
d3.selection.prototype.appendHTML =
d3.selection.prototype.enter.prototype.appendHTML = function (HTMLString) {
return this.select(function () {
return this.appendChild(document.importNode(new DOMParser().parseFromString(HTMLString, 'text/html').body.childNodes[0], true));
});
};
Исходный код
d3.selection.prototype.appendHTML =
d3.selection.enter.prototype.appendHTML = function(HTMLString) {
return this.select(function() {
return this.appendChild(document.importNode(new DOMParser().parseFromString(HTMLString, 'text/html').body.childNodes[0], true));
});
};
d3.selection.prototype.appendSVG =
d3.selection.enter.prototype.appendSVG = function(SVGString) {
return this.select(function() {
return this.appendChild(document.importNode(new DOMParser()
.parseFromString('<svg xmlns="http://www.w3.org/2000/svg">' + SVGString + '</svg>', 'application/xml').documentElement.firstChild, true));
});
};
Возвращаясь к вопросу, который послужил толчком к исследованию, можете ли вы запустить приложение Electron на небольшом сервере, а затем получать локальные файлы, используя их расположение относительно: где бы вы ни определили корень
localhost
?@ialarmedalien спасибо. Я не хотел усложнять запуск локального сервера, если это вообще возможно. Похоже, расширение
selection
работает очень хорошо.