我正在尝试覆盖一些 JavaScript 代码以优化我无法访问原始源代码的现有解决方案。它是一个基于 Liferay 的门户,带有一些渲染 SVG 图像的 portlet。SVG 用作图形导航元素,可用于深入研究技术服务模型。由于实现方式的原因,SVG 图像的加载和刷新可能会很慢。SVG 消失了几秒钟,因为刷新实际上向网络服务器发出了 2 个请求。首先,完整的对象标签在服务器端重新生成并重新插入到 dom 中。第一个请求的响应如下所示:
<div><object type="image/svg+xml" data="generateSvg.svg” width="100" height="300" name="svgId"> <param name="wmode" value="transparent"></object></div>
SVG 的实际请求从第一个响应文本插入 DOM 并删除原始对象标签时开始。因为 SVG 图像可能会变得相当复杂,并且软件的一些普遍缓慢,所以 SVG 会在 Web 浏览器接收和呈现时消失并返回。我想跳过第一步,并通过异步刷新 SVG 来确保图像不会“闪烁”。使用 jQuery,我能够覆盖原始 JavaScript 代码并获取 SVG 的 url 并执行 jQuery ajax 请求。我还可以将结果插入 DOM,但是当我将其作为内联 SVG 插入时,图像的呈现方式与嵌入对象标签时不同。svg 内容元素的某些部分被截断,当 SVG 作为带有外部 url 的对象标签添加时,不会发生这种情况。
我要么想将 SVG 嵌入到对象标签中并异步加载它的 url,要么想解决内联 SVG 的渲染问题。我无法更改 SVG 代码,因为它是现有软件的一部分。我有办法将异步加载的数据添加到对象标记而不将 url 添加到数据属性吗?
我用于添加 SVG 的 javascript 如下所示:
indentifier.loadSvg = (function(){
if(this.svgUrl){
$.ajax({
url: this.svgUrl,
//enclose the right div in which the svg should be loaded as a context
context: $('#_layout_WAR_Portlets_INSTANCE_' + this.portalId + '_plugin'),
dataType: 'xml'
}).done(function(svgDoc) {
//construct an svg node and add it to the DOM
var svgNode = $('svg', svgDoc);
var docNode = document.adoptNode(svgNode[0]);
$(docNode).attr('width', '100%').attr('height', '300');
this.html(docNode);
});
}
});