WedX - журнал о программировании и компьютерных науках

SVG Uncaught TypeError при использовании Snap.Select

Обратите внимание, что я не получаю эту ошибку, когда мой код svg встроен в мой файл HTML. У меня есть много файлов svg, которые мне нужно использовать в моем HTML, поэтому будет ужасно неудобно хранить все это в одном файле.

В одной из моих функций JavaScript я использую следующий код:

var svgT = Snap("#redBar");
var line = svgT.select("#line");  // exception occurs here

Вот код svg для справки в собственном файле:

<svg version="1.1" id="redBar" xmlns="https://www.w3.org/2000/svg" xmlns:xlink="https://www.w3.org/1999/xlink" x="0px" y="0px"
     viewBox="0 0 113.9 3.7" style="enable-background:new 0 0 113.9 3.7;" xml:space="preserve">
<style type="text/css">
    .st0{fill:url(#SVGID_1_);}
</style>
<g id="line">

        <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="1.239177e-04" y1="29.3381" x2="113.9399" y2="29.3381" gradientTransform="matrix(1 0 0 1.3293 0 -37.1699)">
        <stop  offset="1.075269e-02" style="stop-color:#EC1C24"/>
        <stop  offset="0.1548" style="stop-color:#EC2026"/>
        <stop  offset="0.2961" style="stop-color:#ED2C2A"/>
        <stop  offset="0.436" style="stop-color:#EE3F32"/>
        <stop  offset="0.5" style="stop-color:#EF4B37"/>
        <stop  offset="0.5483" style="stop-color:#EE4334"/>
        <stop  offset="0.7058" style="stop-color:#ED2D2B"/>
        <stop  offset="0.8586" style="stop-color:#EC2026"/>
        <stop  offset="1" style="stop-color:#EC1C24"/>
    </linearGradient>
    <path class="st0" d="M113,3.7H1c-0.5,0-1-0.4-1-1L0,1c0-0.5,0.4-1,1-1l112,0c0.5,0,1,0.4,1,1v1.7C113.9,3.2,113.5,3.7,113,3.7z"/>
</g>
</svg>

Теперь, когда я запускаю функцию в JavaScript для выбора элемента группы (#line), я получаю это исключение: Uncaught TypeError: Cannot read property of 'select' of null

Кажется, я должен сделать что-то еще, чтобы правильно читать элементы из svg.

Кто-нибудь имел дело с манипулированием файлом svg с помощью Snap.svg, который может дать мне совет, что еще можно попробовать?

РЕДАКТИРОВАТЬ:

Я также пытался использовать Snap.load() в функции загрузки Windows.

var svgT;
var line;
window.onload = function() {
    Snap.load("/svg/RedBar-01.svg", function (f) {
        var g = f.select("g");
        svgT = Snap("#redBar");
        line = svgT.select("#line");
    });

Я попытался использовать Snap.animate() по нажатию кнопки после загрузки:

line.animate({
                fill: "pink",
                transform: 't0,0'
            }, 1000);

Однако на данный момент я не получаю никакого ответа от функции .animate().

РЕДАКТИРОВАТЬ 2:

Мой текущий JS-код:

window.onload = function() {
    Snap.load("/svg/RedBar-01.svg", function (f) {
        var s = Snap(800,800);
        s.append(f);
        var l = Snap("#redBar");

        var line = l.select("#line");
        line.animate({
                fill: "pink",
                transform: 't0,0'
            }, 1000);
    });
27.10.2016

  • Как вы ссылаетесь на файл svg, если он не встроен? Проблема в том, что Snap не может найти этот элемент svg, поэтому вам нужно уточнить, как вы его загружаете или ссылаетесь на него. 27.10.2016
  • @Ian Ну, я понял, что вызов функции Snap(/*elementID*/) - это то, как я на него ссылаюсь. Я должен был упомянуть, что я также пробовал Snap.load(). Я отредактирую пост. 27.10.2016
  • Вы не сможете Snap(), пока не 'append()' (вы можете выбрать из фрагмента f), поэтому попробуйте добавить (f) после загрузки к элементу svg где-нибудь. Итак, сначала создайте документ, например, var s = Snap(800,800) или var s = Snap('#somesvgelementsomewherealreadyonthepage'), а затем s.append(f) в обратном вызове load. Тогда вы должны быть в состоянии выбрать его. 27.10.2016
  • @Ian Не уверен, правильно ли я следовал твоей инструкции. Что я сделал: var s = Snap(800,800); s.append(f); var l = Snap("#redBar"); var line = l.select("#line"); line.animate({ fill: "pink" }, 1000); Я не получаю никаких исключений, но цвет не меняется на розовый при загрузке страницы. Я использую неправильную переменную для чего-то? 28.10.2016
  • Не ясно, делаете ли вы загрузку или что-то еще, возможно, добавьте редактирование внизу. 28.10.2016
  • @Ian только что добавил еще одно редактирование. Большое спасибо, что нашли время, чтобы помочь мне. 28.10.2016
  • @Ian Я только что удалил css-часть кода svg, и кажется, что теперь цвет меняется. Я думаю, теперь со всем разобрались. Если хотите, создайте ответ, потому что я думаю, что ваши советы были весьма полезны. 28.10.2016

Ответы:


1

Убедитесь, что вы добавляете() загруженный фрагмент svg f.

Общий формат

var s = Snap(800,800); // or Snap('#mySvg') an existing svg element, not a div

Snap.load( filename, function( fragment ) {
    s.append( f ); //add the loaded svg fragment into the DOM
    var element = s.select('#myId');
    element.animate(....)
});

Также убедитесь, что какой-либо стиль css не заменяет атрибуты svg.

28.10.2016
  • Спасибо еще раз за помощь! 28.10.2016
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]