Я использую jQuery SVG. Я не могу добавить или удалить класс для объекта. Кто-нибудь знает мою ошибку?
SVG:
<rect class="jimmy" id="p5" x="200" y="200" width="100" height="100" />
JQuery, который не добавляет класс:
$(".jimmy").click(function() {
$(this).addClass("clicked");
});
Я знаю, что SVG и jQuery прекрасно работают вместе, потому что я могу целиться в объект и выдавать предупреждение при нажатии:
$(".jimmy").click(function() {
alert('Handler for .click() called.');
});
javascript
jquery
css
svg
jquery-svg
Дон П
источник
источник
Ответы:
Изменить 2016: прочитайте следующие два ответа.
element.classList.add('newclass')
работает в современных браузерахJQuery (менее 3) не может добавить класс в SVG.
.attr()
работает с SVG, так что если вы хотите зависеть от jQuery:И если вы не хотите зависеть от jQuery:
источник
.attr("class", "oldclass")
(или более громоздким.setAttribute("class", "oldclass")
) на самом деле не эквивалентно удалениюnewclass
!В DOM API есть элемент element.classList, который работает как с элементами HTML, так и с элементами SVG. Нет необходимости для jQuery SVG плагин или даже jQuery.
источник
JQuery 3 не имеет этой проблемы
Одно из изменений, перечисленных в ревизиях jQuery 3.0 :
Одним из решений этой проблемы было бы обновление до jQuery 3. Он прекрасно работает:
Эта проблема:
Причина, по которой функции манипуляции с классом jQuery не работают с элементами SVG, заключается в том, что версии jQuery до 3.0 используют
className
свойство для этих функций.Выдержка из jQuery
attributes/classes.js
:Это ведет себя, как и ожидалось, для элементов HTML, но для элементов SVG
className
немного отличается. Для элемента SVGclassName
это не строка, а экземплярSVGAnimatedString
.Рассмотрим следующий код:
Если вы запустите этот код, вы увидите что-то вроде следующего в консоли разработчика.
Если бы мы приводили этот
SVGAnimatedString
объект к строке, как это делает jQuery, мы бы это сделали[object SVGAnimatedString]
, где jQuery терпит неудачу.Как плагин jQuery SVG справляется с этим:
Плагин jQuery SVG работает вокруг этого, исправляя соответствующие функции для добавления поддержки SVG.
Выдержка из jQuery SVG
jquery.svgdom.js
:Эта функция обнаружит, является ли элемент элементом SVG, и, если это так, будет использовать
baseVal
свойствоSVGAnimatedString
объекта, если оно доступно, прежде чем обратиться кclass
атрибуту.Историческая позиция jQuery по этому вопросу:
В настоящее время jQuery перечисляет эту проблему на своей странице « Не исправить» . Вот соответствующие части.
Очевидно, jQuery считал полную поддержку SVG вне области действия ядра jQuery и лучше подходил для плагинов.
источник
Если у вас есть динамические классы или вы не знаете, какие классы уже могут быть применены, то этот метод, я считаю, является лучшим подходом:
источник
На основе приведенных выше ответов я создал следующий API
источник
После загрузки
jquery.svg.js
вы должны загрузить этот файл:http://keith-wood.name/js/jquery.svgdom.js
.Источник: http://keith-wood.name/svg.html#dom
Рабочий пример: http://jsfiddle.net/74RbC/99/
источник
Просто добавьте отсутствующий конструктор прототипа ко всем узлам SVG:
Затем вы можете использовать его таким образом, не требуя jQuery:
Весь кредит идет на Тодда Мото .
источник
jQuery не поддерживает классы элементов SVG. Вы можете получить элемент напрямую
$(el).get(0)
и использоватьclassList
иadd / remove
. С этим тоже есть хитрость: верхний элемент SVG на самом деле является обычным объектом DOM и может использоваться как любой другой элемент в jQuery. В моем проекте я создал это, чтобы позаботиться о том, что мне нужно, но в документации, представленной в Mozilla Developer Network, есть прокладка, которую можно использовать в качестве альтернативы.пример
Альтернативой, более сложной, является использование D3.js в качестве механизма выбора. Мои проекты имеют графики, которые построены с его помощью, так что это также входит в сферу моего приложения. D3 правильно изменяет атрибуты класса ванильных элементов DOM и SVG. Хотя добавление D3 только для этого случая, вероятно, будет излишним.
источник
JQuery 2.2 поддерживает манипуляции с классом SVG
В выпущенном посте jQuery 2.2 и 1.12 есть следующая цитата:
Пример использования jQuery 2.2.0
Это тесты:
Если вы нажмете на этот маленький квадрат, он изменит свой цвет, потому что
class
атрибут добавлен / удален.источник
Вот мой довольно не элегантный, но рабочий код, который решает следующие проблемы (без каких-либо зависимостей):
classList
не существует на<svg>
элементах в IEclassName
не представляющийclass
атрибут на<svg>
элементах в IEgetAttribute()
иsetAttribute()
реализацииОн использует,
classList
где это возможно.Код:
Пример использования:
источник
className
свойство, а не пытается установить атрибут. Причина, по которой «LTE IE7 требует, чтобы strAttributeName было« className »при установке, получении или удалении атрибута CLASS», заключается в том, что эти браузеры имеют некорректную реализациюgetAttribute(x)
иsetAttribute(x)
просто получают или устанавливают свойство с именемx
, так что это проще и более совместимо. установить свойство напрямую.<svg>
элемент на страницу, предназначенную для работы в IE 7. Для чего он стоит, мой код действительно добавляет атрибут класса к<svg>
элементам в IE 7, так как такой элемент ведет себя как любой другой пользовательский элемент.Я использую Snap.svg, чтобы добавить класс и SVG.
http://snapsvg.io/docs/#Element.addClass
источник
Одним из обходных путей может быть добавление класса в контейнер элемента svg:
источник
Я написал это в моем проекте, и это работает ... вероятно;)
Примеры
источник
Вдохновленный ответами выше, особенно Сагар Гала, я создал этот API . Вы можете использовать его, если вы не хотите или не можете обновить версию JQuery.
источник
Или просто используйте методы старой школы DOM, когда у JQ где-то посередине обезьяна.
Узнайте DOM людей. Даже в рамках 2016-palooza это помогает довольно регулярно. Кроме того, если вы когда-нибудь слышали, чтобы кто-нибудь сравнил DOM со сборкой, пните их для меня.
источник