Попробую поковырять в этом направлении... Спасибо
|
|
Короче, трезво оценив свои силы, совершил акт вандализма по отношению к jQuery...
Заменил где нужно было toLowerCase() на нейтральный toString()... Пока так... Мне же не шашечки... мне ехать... ;) PS. Нормальное решение ждёт своего героя... |
если есть метод toLowerCase, то это уже строка, строку в строку через toString преобразовывать бессмысленно :)
Я бы добавил в jQuery.attr проверку
elem.constructor.toString().indexOf('SVG') == 9 // 'function SVG...'
рядом с nType !== 1 и isXMLDoc или там еще есть места, где арибуты в lowercase переделываются? |
toLowerCase() по коду более 40.
Мне хватило для своих целей пары исправлений (возможно хватило бы и одного, я вчера ночью уже запутался в своих экспериментах). На toString заменил именно по тому, что это бессмысленно и ничего не делает в данном случае. Проверка конечно намного более правильное решение, но всё равно нарушает аутентичность библиотеки... Эх... вот если бы патч какой сделать... Но пока видимо так придётся работать. |
Все что нужно сделать для jQuery, что бы он не тупил с SVG
jQuery.extend({
_originalAttr: jQuery.attr,
attr: function(elem, name, value) {
if (typeof SVGElement !== 'undefined' && elem instanceof SVGElement) {
if (typeof value === 'undefined') {
value = elem.getAttribute(name);
} else if (value === null) {
elem.removeAttribute(name);
} else {
elem.setAttribute(name, value + "");
}
return value;
}
return jQuery._originalAttr(elem, name, value);
}
});
тест:
<!DOCTYPE html>
<html lang="en">
<head>
<title>…</title>
<meta charset="UTF-8">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
</head>
<body>
<script>
jQuery.extend({
_originalAttr: jQuery.attr,
attr: function(elem, name, value) {
if (typeof SVGElement !== 'undefined' && elem instanceof SVGElement) {
if (typeof value === 'undefined') {
value = elem.getAttribute(name);
} else if (value === null) {
elem.removeAttribute(name);
} else {
elem.setAttribute(name, value + "");
}
return value;
}
return jQuery._originalAttr(elem, name, value);
}
});
var inlineSVG = '<svg baseProfile="full" WIDTH="300" HEIGHT="200"><polygon points="100,10 40,198 190,78 10,78 160,198" style="fill:lime;stroke:purple;stroke-width:5;fill-rule:evenodd;" /></svg>',
tmpContainer = document.createElement('div'),
svgElement;
tmpContainer.innerHTML = inlineSVG;
document.body.appendChild(tmpContainer.firstChild);
tmpContainer = null;
svgElement = jQuery('svg');
alert([
'baseprofile: ' + svgElement.attr('baseprofile'),
'baseProfile: ' + svgElement.attr('baseProfile'),
'width: ' + svgElement.attr('width'),
'height: ' + svgElement.attr('height')
].join('\n'));
</script>
</body>
</html>
|
То, что доктор прописал... Работает... Спасибо. :)
ЗЫ: У меня правда всплыли ещё проблемы, но это уже другая песня... |
Я вот, кстати, не пойму: как так получилось, что я ни разу не сталкивался с такой проблемой? Как эта проблема решается в svg-фреймворках?
|
Цитата:
|
;) Ето да...
Я тож раньше обходил тем что просто нативный js использовал... |
| Часовой пояс GMT +3, время: 13:12. |