我有一个SVG外部文件,该文件在<object>
标签中调用。
<object data="Img/PumpStation/Interfata.svg" type="image/svg+xml" id="p1"></object>
SVG包含两个组。
<svg>
<g id="g1">
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="6.8694" y1="93.75" x2="30.2922" y2="93.75" gradientTransform="matrix(1 0 0 -1 0 112.5)">
<stop offset="0.01" style="stop-color:#4F4D4D" />
<stop offset="0.51" style="stop-color:#F5F5F5" />
<stop offset="1" style="stop-color:#4D4D4D" />
</linearGradient>
<path fill="url(#SVGID_2_)" stroke="#4C4C4C" stroke-width="0.25" d="M6.869,3.266V37.5h23.423v-0.45V3.266l-1.577-2.703L27.59,0 h-0.676h-1.239H10.248L7.545,1.577L6.982,2.703L6.869,3.266" />
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="6.8694" y1="78.1523" x2="30.2922" y2="78.1523" gradientTransform="matrix(1 0 0 -1 0 112.5)">
<stop offset="0.01" style="stop-color:#4D4D4D" />
<stop offset="0.51" style="stop-color:#F5F5F5" />
<stop offset="1" style="stop-color:#4D4D4D" />
</linearGradient>
<path fill="url(#SVGID_3_)" stroke="#4C4C4C" stroke-width="0.25" d="M6.869,34.347h23.423" />
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="6.8694" y1="105.8555" x2="30.2922" y2="105.8555" gradientTransform="matrix(1 0 0 -1 0 112.5)">
<stop offset="0.01" style="stop-color:#4D4D4D" />
<stop offset="0.51" style="stop-color:#F5F5F5" />
<stop offset="1" style="stop-color:#4D4D4D" />
</linearGradient>
<path fill="url(#SVGID_4_)" stroke="#4C4C4C" stroke-width="0.25" d="M6.869,6.645h23.423" />
</g>
<g id="g2">
<linearGradient id="linearColors" x1="0" y1="0" x2="1" y2="1">
<stop offset="5%" stop-color="#01E400"></stop>
<stop offset="25%" stop-color="#FEFF01"></stop>
<stop offset="40%" stop-color="#FF7E00"></stop>
<stop offset="60%" stop-color="#FB0300"></stop>
<stop offset="80%" stop-color="#9B004A"></stop>
<stop offset="100%" stop-color="#7D0022"></stop>
</linearGradient>
<circle r="120" cx="150" cy="150" class="external-circle" stroke-width="4" fill="none" stroke="url(#linearColors)"></circle>
</g>
</svg>
还有一个按钮:
<asp:Button ID="StartP1" class="startP btn btn-light" runat="server" Text="Start P1" Style="width: 100%" />
我知道如何在点击操作中替换stop-color
标签中的所有stop
。我通过使用以下jQuery函数来做到这一点:
jQuery('.startP').on('click', function () {
$("object").contents().find('stop').each(function () {
var color = jQuery(this).css('stop-color');
if (color === 'rgb(77, 77, 77)') {
jQuery(this).css('stop-color', '#00ff00');
}
});
});
我的问题是我该如何仅对具有id="g1"
的组而不对两个SVG组实现jQuery函数?
答案 0 :(得分:0)
代码需要引用要转换的对象。您需要记住Jquery
中的how that works:$("object")
选择任何object
,$(".object")
选择任何具有object
类和$("#object")
的元素选择ID为object
的任何元素。说$("object").contents().find('stop')
时,可以选择stop
元素内的任何object
元素。如果您只想引用stop
元素内的#g1
,则可以通过几种方式来实现,例如:
$("object").contents().find('#g1').contents().find('stop')
$("object #g1 stop")
我准备了一个codepen link,其中您的功能已通过多种方式进行了调整。您有四个按钮可以更改两个对象的颜色(我必须更改第二个对象的渐变的末端以使其与第一个具有相同的颜色),仅第一个,仅第二个或重置为默认值。 / p>
评论后编辑
现在的问题是更笼统的。问题不仅在于如何选择一个特定的对象。问题:
您的svg文件需要一个xmlns
链接。
您需要在设置事件之前确保加载object
内容(例如,使用$(window).load()
。
jQuery并不总是能很好地处理对象的内容(例如this)。
这是一种混合解决方案(并非唯一可行的解决方案):
HTML:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
$(window).load(function(){
var svg = document.getElementById("p1").contentDocument.documentElement;
$('.startP').on('click', function () {
$(svg).contents().find("stop").each(function () {
var color = jQuery(this).css('stop-color');
if (color === 'rgb(77, 77, 77)') {
jQuery(this).css('stop-color', '#00ff00');
}
});
});
$('.startOne').on('click', function () {
$(svg).contents().find("#SVGID_2_ stop,#SVGID_3_ stop,#SVGID_4_ stop").each(function () {
var color = jQuery(this).css('stop-color');
if (color === 'rgb(77, 77, 77)') {
jQuery(this).css('stop-color', '#00ff00');
}
});
});
$('.startTwo').on('click', function () {
$(svg).contents().find("#linearColors stop").each(function () {
var color = jQuery(this).css('stop-color');
if (color === 'rgb(77, 77, 77)') {
jQuery(this).css('stop-color', '#00ff00');
}
});
});
$('.restart').on('click', function () {
$(svg).contents().find('stop').each(function () {
var color = jQuery(this).css('stop-color');
if (color === 'rgb(0, 255, 0)') {
jQuery(this).css('stop-color', '#4D4D4D');
}
});
});
});
</script>
</head>
<body>
<button class="startP">both</button>
<button class="startOne">one</button>
<button class="startTwo">two</button>
<button class="restart">restart</button>
<div></div>
<object data="delme.svg" type="image/svg+xml" id="p1"><img src="tfs860830.jpg" /></object>
</body>
</html>
SVG:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="300" height="300" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" id="objsvg">
<defs>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="6.8694" y1="93.75" x2="30.2922" y2="93.75" gradientTransform="matrix(1 0 0 -1 0 112.5)">
<stop offset="0.01" style="stop-color:#4F4D4D" />
<stop offset="0.51" style="stop-color:#F5F5F5" />
<stop offset="1" style="stop-color:#4D4D4D" />
</linearGradient>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="6.8694" y1="78.1523" x2="30.2922" y2="78.1523" gradientTransform="matrix(1 0 0 -1 0 112.5)">
<stop offset="0.01" style="stop-color:#4D4D4D" />
<stop offset="0.51" style="stop-color:#F5F5F5" />
<stop offset="1" style="stop-color:#4D4D4D" />
</linearGradient>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="6.8694" y1="105.8555" x2="30.2922" y2="105.8555" gradientTransform="matrix(1 0 0 -1 0 112.5)">
<stop offset="0.01" style="stop-color:#4D4D4D" />
<stop offset="0.51" style="stop-color:#F5F5F5" />
<stop offset="1" style="stop-color:#4D4D4D" />
</linearGradient>
<linearGradient id="linearColors" x1="0" y1="0" x2="1" y2="1">
<stop offset="5%" stop-color="#01E400"></stop>
<stop offset="25%" stop-color="#FEFF01"></stop>
<stop offset="40%" stop-color="#FF7E00"></stop>
<stop offset="60%" stop-color="#FB0300"></stop>
<stop offset="80%" stop-color="#4D4D4D"></stop>
<stop offset="100%" stop-color="#7D0022"></stop>
</linearGradient>
</defs>
<g id="g1">
<path fill="url(#SVGID_2_)" stroke="#4C4C4C" stroke-width="0.25" d="M6.869,3.266V37.5h23.423v-0.45V3.266l-1.577-2.703L27.59,0 h-0.676h-1.239H10.248L7.545,1.577L6.982,2.703L6.869,3.266" />
<path fill="url(#SVGID_3_)" stroke="#4C4C4C" stroke-width="0.25" d="M6.869,34.347h23.423" />
<path fill="url(#SVGID_4_)" stroke="#4C4C4C" stroke-width="0.25" d="M6.869,6.645h23.423" />
</g>
<g id="g2">
<circle r="120" cx="150" cy="150" class="external-circle" stroke-width="4" fill="none" stroke="url(#linearColors)"></circle>
</g>
</svg>
我也将linearGradient
元素移到了defs
部分。现在,代码直接引用了它们,而不是#g1
或#g2
。
编辑2
我已经设法通过示例设置了plunker。请注意,我叫svg delme.svg
。
编辑3
如果您不能修改svg
,我将使用Jquery获取svg代码,然后将其内联插入DOM。这样,您就不需要xlmns
(并且您可以根据需要添加它)。我已经用新代码分叉了unk夫(link)。现在,svg文件没有xmlns
属性。注意,makeInline
函数接受object
id,然后在svg
内用修改后的div
创建内联id
。之后,您可以使用新的id
(或添加的类)来标识新创建的元素。该功能还可以删除原始对象,以免造成混乱。