Svg clipPath в приложении AngularJS с базовым элементом HTML

Я использую svg clipPath в моем проекте AngularJS. У меня проблема с указанием относительного URL-адреса клипа, потому что мне нужно использовать элемент <base> в моем проекте.

Например, этот код работает в проекте без base, но не в проекте с <base href="/">

<svg width="120" height="120"
     viewPort="0 0 120 120" version="1.1"
     xmlns="http://www.w3.org/2000/svg">

    <defs>
        <clipPath id="myClip">
            <rect x="10" y="10" width="60" height="60"></rect>
        </clipPath>
    </defs>

    <g clip-path="url(#myClip)">
        <circle cx="30" cy="30" r="20"/>
        <circle cx="70" cy="70" r="20"/>
    </g>

</svg>

Как это можно решить? Я использую ui-router, если это имеет отношение к вопросу...

Этот вопрос примерно такой же, но "решение" найденное OP заключалось в том, чтобы удалить базу, которая не является решением в моем случае.

Ответ 1

Изменить

<g clip-path="url(#myClip)">

Итак, вы используете абсолютный URL + идентификатор фрагмента, а не только идентификатор фрагмента. Например. url (http://mydomain.com/mypage#myClip)

Возможно, вы сможете удалить некоторые части, например. http и домен, если базовый тег соответствует абсолютному URL-адресу, так что /mypage # myClip может работать.

Ответ 2

В случае, если кому-то нужна функция, чтобы сделать это здесь, в чистом JS:

Сохраняет исходный клип в атрибуте данных элемента и каждый раз вызывает его, использует document.location.href для использования абсолютных путей для url()

function fixClipPaths(svg, restore) {
    Array.prototype.forEach.call(svg.querySelectorAll('*[clip-path]'), function (el) {
        var clipUrl = el.getAttribute('clip-path');

        if(!el.getAttribute('data-original-clip-path')) {
            el.setAttribute('data-original-clip-path', clipUrl);
        }

        el.setAttribute('clip-path', 'url('+ (!restore ? document.location.href : '') + el.getAttribute('data-original-clip-path').substr(4));
    });
}

// usage example
fixClipPaths(document.getElementsByTagName('svg')[0]);