我一直在慢慢弄明白这件事。要提出我的问题,需要做很多准备工作:
SVG
我有一个生成 SVG 的 Web 服务器。针对这个问题,它生成了一个非常简单的测试 SVG……
<svg xmlns="http://www.w3.org/2000/svg" stroke-linejoin="round" viewBox="0 0 100 100">
<path d="M50,4L4,50L50,96L96,50Z" stroke="#40638C" stroke-width="3"></path>
<path d="M50,5L5,50L50,95L95,50Z" stroke="#333" fill="#40638C" stroke-width="3"></path>
<path d="M37,42c-1,0,11-20,13-20c1,0,15,20,13,20h-9c0,8,9,22,12,25l-4,4l-8,-7v13h-10v-35z" stroke="#40495E" fill="#40495E"></path>
<path d="M35,40c-1,0,11-20,13-20c1,0,15,20,13,20h-9c0,8,9,22,12,25l-4,4l-8,-7v13h-10v-35z" stroke="#333" fill="#555"></path>
</svg>
这只是一个看起来花哨的“合并”标志。请注意,它有四个 PATH 元素。
内联
为了将 SVG 放入帖子中,我使用了通过主题添加的一些 JavaScript。
最终目标是制作一个合适的插件。但我目前只是在构建一个概念验证。所以它只是简单地粘贴到我主题自定义的 <head> 部分中:
<script type="text/discourse-plugin" version="0.8">
var UMB = {
svgload: function(base, target) {
var url = base + $(target).text();
$(target).html('');
$.ajax({
method: "GET",
url: url,
async: false,
dataType: "text",
success: function(data) { $(target).append(data); }
});
alert('loaded!');
$(target).children('path').each(function(){alert('here is a path element');});
},
}
$.fn.umbdv = function() {
this.each(
function() {
UMB.svgload('__URL_REDACTED__', this);
}
);
return this;
};
api.decorateCooked(
$elem => $elem.children('.cooked div[data-custom="umbdv"]').umbdv(),
{ id: 'umbdv' }
);
</script>
其中…
var UMB = { 只是一个全局变量,避免我在各处使用巨大的匿名函数。
$.fn.umbdv = 是 [我认为被称为] 扩展 JQuery 的“插件”。
api.decorateCooked( 让我可以在帖子发送到浏览器之前对其进行操作。
调用
在主题中,我随后写入…
<div data-custom="umbdv">/vtest</div>
针对该 DIV 调用了 UMB.svgload('__URL_REDACTED__', this)。
UMB.svgload() 正确解析了 /vtest 字符串,组合出 URL 并发出 AJAX 请求。它成功执行了 append(data),boop 我的 SVG 就内联了……
我 UMB.svgload() 内部的 alert() 随后按预期触发了。(这显然是一个调试 hack,对吧?:))
问题(终于)
我在托管的 Discourse 论坛中有一个仅限员工的主题,您可以在其中看到实际效果。(我正在与 Discourse 员工/支持人员交谈,他们可以以管理员身份闯入我的安装环境。)
https://forum.moversmindset.com/t/svg-experimentation-in-progress/1109
为什么……
$(target).children('path').each(function(){alert('here is a path element');});
……没有选中任何 PATH 元素?
它没有任何反应——没有错误。什么都没有。
下一步
如果我能让这个简单的 alert() 概念验证正常工作,我接下来的计划是……
我知道我正在“操作”的 DOM 片段(在调用 UMB.svgload() 时)尚未连接到实际的文档 DOM。这就是为什么我期望 $(target)… 是我需要的东西。
最终,我将内联极其复杂的 SVG,并且需要使用更复杂的 JQuery 选择器。我想在 $(target) 内部找到许多元素,并附加事件处理程序(例如 onclick),这些处理程序将调用其他 UMB.… 全局函数。