Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как обмануть jQ при помощи jQ? (CamelCase в атрибутах) (https://javascript.ru/forum/jquery/49294-kak-obmanut-jq-pri-pomoshhi-jq-camelcase-v-atributakh.html)

Mitrich 06.08.2014 16:13

Попробую поковырять в этом направлении... Спасибо

Octane 06.08.2014 16:41

https://twitter.com/DmitryKorobkin/s...95877626855424

Mitrich 07.08.2014 15:53

Короче, трезво оценив свои силы, совершил акт вандализма по отношению к jQuery...

Заменил где нужно было toLowerCase() на нейтральный toString()...
Пока так... Мне же не шашечки... мне ехать... ;)

PS. Нормальное решение ждёт своего героя...

Octane 07.08.2014 16:02

если есть метод toLowerCase, то это уже строка, строку в строку через toString преобразовывать бессмысленно :)

Я бы добавил в jQuery.attr проверку
elem.constructor.toString().indexOf('SVG') == 9 // 'function SVG...'

рядом с nType !== 1 и isXMLDoc

или там еще есть места, где арибуты в lowercase переделываются?

Mitrich 07.08.2014 16:23

toLowerCase() по коду более 40.
Мне хватило для своих целей пары исправлений (возможно хватило бы и одного, я вчера ночью уже запутался в своих экспериментах).

На toString заменил именно по тому, что это бессмысленно и ничего не делает в данном случае.

Проверка конечно намного более правильное решение, но всё равно нарушает аутентичность библиотеки... Эх... вот если бы патч какой сделать... Но пока видимо так придётся работать.

devote 07.08.2014 18:01

Все что нужно сделать для 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>

Mitrich 08.08.2014 21:34

То, что доктор прописал... Работает... Спасибо. :)

ЗЫ: У меня правда всплыли ещё проблемы, но это уже другая песня...

ixth 09.08.2014 11:04

Я вот, кстати, не пойму: как так получилось, что я ни разу не сталкивался с такой проблемой? Как эта проблема решается в svg-фреймворках?

devote 09.08.2014 13:13

Цитата:

Сообщение от ixth
Как эта проблема решается в svg-фреймворках?

тем что не используют jQuery

Mitrich 10.08.2014 00:43

;) Ето да...
Я тож раньше обходил тем что просто нативный js использовал...


Часовой пояс GMT +3, время: 03:26.