<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Martin Pešout &#187; SVG</title>
	<atom:link href="https://www.martinpesout.cz/tag/svg/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.martinpesout.cz</link>
	<description>Front-end vývojář</description>
	<lastBuildDate>Thu, 26 Jun 2025 22:12:07 +0000</lastBuildDate>
	<language>cs-CZ</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6</generator>
		<item>
		<title>Přidávání a odebírání tříd z SVG elementů pomcí jQuery</title>
		<link>https://www.martinpesout.cz/pridavani-a-odebirani-trid-z-svg-elementu-pomci-jquery/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=rss</link>
		<comments>https://www.martinpesout.cz/pridavani-a-odebirani-trid-z-svg-elementu-pomci-jquery/#comments</comments>
		<pubDate>Thu, 18 Jun 2015 07:37:23 +0000</pubDate>
		<dc:creator>Martin Pešout</dc:creator>
				<category><![CDATA[Kódování]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[kódování]]></category>
		<category><![CDATA[SVG]]></category>

		<guid isPermaLink="false">http://www.martinpesout.cz/?p=2231</guid>
		<description><![CDATA[Nedávno jsem se začal více zaměřovat na práci s SVG souborama a také na tvorbu SVG animací. Specializuju se převážně na UI a nepoužívám žádné složité Javascript frameworky. Dá se říct, že ke spokojenému životu front-end vývojáře si vystačím pouze]]></description>
				<content:encoded><![CDATA[<div class="l-submain"><div class="l-submain-h g-html i-cf"><p>Nedávno jsem se začal více zaměřovat na práci s SVG souborama a také na tvorbu SVG animací. Specializuju se převážně na UI a nepoužívám žádné složité Javascript frameworky. Dá se říct, že ke spokojenému životu front-end vývojáře si vystačím pouze s běžnou knihovnou jQuery. Před nedávnem jsem narazil na zajímavý problém. Potřeboval jsem po kliknutí přidat třídu do SVG elementu na stránce, abych mohl nechat proběhnout CSS3 animaci. Všechny knihovny jsem měl načtené. Nicméně po zavolání <code>$('#js-svg-element').toggleClass('element--animated');</code> se nestalo vůbec nic.<span id="more-2231"></span></p>
<p>Přiznám se, že jsem nad tím strávil dost času, než mně došlo, že bude zakopaný pes někde jinde. Stále jsem si myslel, že chyba musí být ukrytá v mém kódu. Nakonec jsem však našel vysvětelní. Manipulace s třídami v jQuery nefunguje na SVG elementech, protože jQuery k tomuto účelu používá vlastnost <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/className">className</a>. O konkrétní volání v jQuery se stará tato část kódu <a href="https://github.com/jquery/jquery/blob/53aa87f3bf4284763405f3eb8affff296e55ba4f/src/attributes/classes.js#L29-L32">attributes/classes.js</a></p>
<pre class="brush: jscript; title: ; notranslate">
cur = elem.nodeType === 1 &amp;&amp; ( elem.className ?
    ( &quot; &quot; + elem.className + &quot; &quot; ).replace( rclass, &quot; &quot; ) :
    &quot; &quot;
);
</pre>
<p>Toto volání funguje na běžných HTML elementech. Avšak vlastnost <code>className</code> se na SVG elementu chová trochu jinak. Nevrací totiž běžný string, ale instanci <a href="https://developer.mozilla.org/en-US/docs/Web/API/SVGAnimatedString">SVGAnimatedString</a>.</p>
<p>Autoři jQuery o tomto problému ví, nicméně mají tento problém umístěný na <a href="https://contribute.jquery.org/wont-fix/">seznamu požadavků, které nechtějí řešit</a>. Naštěstí existuje jednoduchý trik, s kterým se dá tento problém obejít:</p>
<h2>jQuery .attr()</h2>
<p>Asi nejjednodušším řešením je použití jQuery metody <code>.attr()</code>:</p>
<pre class="brush: jscript; title: ; notranslate">
/**
 * Místo volání metody .addClass('element--animated')
 */
$('#js-svg-element').attr('class', 'element--animated');

/**
 * Místo volání metody .removeClass('element--animated')
 */
$('#js-svg-element').attr('class', '');
</pre>
<p>Volání metody <code>.attr()</code> nahradí celý atribut <code>class</code>, takže pokud již máte na vybraném elementu nějakou třídu a nechcete o ní přijít, budete muset zápis trochu rozšířit:</p>
<pre class="brush: jscript; title: ; notranslate">
/**
 * Místo volání metody .addClass('element--animated')
 */
var element = $('#js-svg-element');
var classes = element.attr('class');
element.attr('class', classes + ' element--animated');
</pre>
<h2>classList</h2>
<p>Druhým řešením, které jsem našel, je použít <a href="https://developer.mozilla.org/en-US/docs/Web/API/Element/classList">classList</a> dostupný ve <em>Web API Interface</em>. <code>classList</code> je považován jako alternativa k běžnému volání, které vrací string tříd oddělených mezerami. Pro manipulaci s třídami nabízí tři metody: <code>.add</code>, <code>.remove</code> a <code>.toggle</code>.</p>
<pre class="brush: jscript; title: ; notranslate">
// div je objekt, který ukazuje na element &lt;div class=&quot;foo bar&quot;&gt;&lt;/div&gt;
div.classList.remove(&quot;foo&quot;);
div.classList.add(&quot;anotherclass&quot;);

// Pokud je třída visible dostupná, tak ji odebere.
// V opačném případě ji přidá.
div.classList.toggle(&quot;visible&quot;);
</pre>
<p>Bohužel Microsoft tuto možnost <a href="http://caniuse.com/#search=classList">podporuje ve svých prohlížečích velice slabě</a>. Pokud budeme chtít toto volání podporovat pro Internet Explorer 9, je třeba své stránky rozšířit o <em>Javascrit Shim</em>, který nám zajístí potřebnou dostupnost pro IE9 a Opera Mini.</p>
<h2>Závěrem</h2>
<p>Na první pohled je druhé řešení mnohem elegantnější a dovolí nám mnohem kratší zápis. Ale řekněme si na rovinu, že v dnešní době je stále nutné zajišťovat podporu pro prohlížeče Internet Explorer 9. Osobně zastávám názor, že přidávání dalších knihoven (jako <em>Javascript Shim</em>) do projektu mně za tu snahu nestojí. Snažím se totiž držet počet pluginů a závislostí na možném minimu. První řešení pomocí jQuery <code>.attr()</code> je za mě jasným vítězem.</p>
<h2>Zdroje</h2>
<ul>
<li><a href="http://stackoverflow.com/a/29525743">http://stackoverflow.com/a/29525743</a></li>
<li><a href="https://contribute.jquery.org/wont-fix/">jQuery Won&#8217;t Fix</a></li>
<li><a href="http://martinwolf.org/2014/12/11/adding-and-removing-classes-from-svg-elements-with-jquery/">Článek na blogu Martin Wolf</a></li>
<li><a href="http://www.whoishostingthis.com/resources/jquery/">Learn and Master jQuery</a></li>
</ul>
<div class="w-actionbox color_alternate controls_aside"><div class="w-actionbox-h"><div class="w-actionbox-text"><h3>Novinky ze světa front-endu</h3><p>Pokud vás zajímají další novinky ze světa front-endu, můžete sledovat můj profil na Twitteru</p></div><div class="w-actionbox-controls at_right"><a class="w-actionbox-button g-btn type_default" href="https://twitter.com/martinpesout"><span>@martinpesout</span></a></div></div></div>
</div></div>]]></content:encoded>
			<wfw:commentRss>https://www.martinpesout.cz/pridavani-a-odebirani-trid-z-svg-elementu-pomci-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
