我责怪自己的愚蠢,但我无法理解为什么jQuery (2.1.4)不能使用它的类函数直接更改SVG元素(或子元素)的类?我在试图为jQuery制作一个SVG操作插件,我正在测试各种东西以使类变(是的,我尝试过普通的SVG库;不,我不关心它们)。最后,我选择了我的当前版本,它智能地覆盖了原始的jQuery.addClass()
函数。我检查jQuery元素的数组是否包含SVG类型节点,如果包含,则使用自定义函数,否则,将其传递回原始的jQuery函数。到目前为止这似乎是可行的。尽管如此,我的“自定义”函数与jQuery函数的代码完全相同,因为我从GitHub上的源代码中复制了它。那么,如果它适用于我的“自定义”函数,为什么它不能简单地与默认的jQuery函数一起工作呢?
这是我到目前为止的密码。在语法上,我的代码与我的风格不同,但实际上它与原始的jQuery代码完全相同。
(function ($) {
var element,
jQueryFunctions = {
addClass: $.fn.addClass
};
var addClass = function (
elements,
value) {
var proceed = typeof (value) === "string" && value;
if (!proceed) {
return this;
}
for (var i = 0, j, l = elements.length, element, klasses = (value || "").match(/\S+/g) || [], klass, currentValue, current, finalValue; element = elements[i], i < l; i++) {
currentValue = element.getAttribute && element.getAttribute("class") || "",
current = element.nodeType === 1 && (" " + currentValue + " ").replace(/[\t\r\n\f]/g, " ");
if (!current) {
return;
}
j = 0;
while (klass = klasses[j++]) {
if (current.indexOf(" " + klass + " ") < 0) {
current += klass + " ";
}
finalValue = jQuery.trim(current);
if (currentValue !== finalValue) {
element.setAttribute("class", finalValue);
}
}
}
};
var hasSvgNodes = function (
elements) {
var returnValue = true;
for (var i = 0, l = elements.length, element; element = elements[i], i < l; i++) {
returnValue = returnValue && (element.nodeName === "svg");
}
return returnValue;
};
$.fn.svg = function () {
return element = this;
};
$.fn.addClass = function (
value) {
if (!hasSvgNodes(this)) {
jQueryFunctions.addClass.apply(this, arguments);
} else {
addClass(this, value);
}
return this;
};
$.fn.svg.test = function () {
element.addClass("Red");
};
}(jQuery));
发布于 2015-08-27 13:30:18
@Paul的回答让我有点好奇,因为我所取的代码来自GitHub上的当前源代码。我检查了两遍,以防万一是从旧版本中提取出来的,当然这是最新版本。因此,我决定再次检查3.0.0 a1的发行说明,并找到了我的答案。很明显,jQuery团队决定稍微改变他们对Won修复策略的立场,并允许直接操作SVG元素的类属性。这就是目前在上面的代码以及我正在复制的内容。
这里是讨论线和提交供参考。因此,jQuery在默认情况下确实做类操作,只是在下一个版本中。对于我正在做的事情,我不介意去阿尔法,所以它对我来说是可行的。
我仍然会为特定于我的需要的SVG特定的任务做我自己的插件,但是随着类问题的解决,现在应该更容易了。
发布于 2015-08-26 18:01:24
@Alex是对的。它不起作用(演示)。过去很久以前的事。(在1.1分支中),但是它不再这样做了。
这主要是因为className
属性的类型对于SVG元素和HTML来说是不同的。在HTML元素中,它是一个字符串。在SVG元素中,它是一个SVGAnimatedString
。
addClass()
代码希望它是一个字符串。
var htmlelem = document.getElementById("htmlelem"),
svgelem = document.getElementById("svgelem");
alert("HTML = "+(typeof htmlelem.className) + ". SVG = "+(typeof svgelem.className));
<svg>
<rect id="svgelem" width="300" height="150"/>
</svg>
<div id="htmlelem"></div>
您自己的版本之所以起作用,是因为看起来您已经从jQuery的一个旧分支中获取了代码。它绝对不是addClass
的2.1.4版本。
发布于 2015-08-26 19:04:57
注意,解决办法;svg
,jsfiddle从@PaulLeBeau的答案中分叉而来。
尝试利用HTMLElement.dataset
应用css
$().ready(function() {
$("#test")[0].dataset.class = "red";
});
[data-class="red"] {
fill: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js">
</script>
<svg>
<rect id="test" width="300" height="150" />
</svg>
https://stackoverflow.com/questions/32239095
复制相似问题