FusionCharts не отображается должным образом, когда тег ‹base› включен в заголовок HTML

Я использую AngularJS и FusionCharts вместе в своем веб-приложении. Предстоящий выпуск AngularJS v1.3.0 потребует наличия тега <base> в заголовке HTML < / a>, чтобы разрешить все относительные ссылки, независимо от того, где приложение размещено в каталоге сайта.

При включении тега <base> в последнюю версию FusionCharts (в настоящее время v3.4.0) 3D-диаграммы не отображаются должным образом. Например, появляется трехмерная круговая диаграмма с вращающимися и интерактивными фрагментами, а также всплывающими подсказками и цветом на внутренних краях фрагментов. Однако весь внешний цвет черный. введите здесь описание изображения

Исключение тега <base> приводит к тому, что диаграмма выглядит и ведет себя нормально.

Кто-нибудь знает, как это решить? К сожалению, у меня нет исходного кода, иначе я бы взломал его сам.

Вот ссылка на нерабочий jsFiddle: http://jsfiddle.net/aaronaudic/59Bmf/207 < / а>

РЕШЕНИЕ:

Первоначально я присудил правильное решение @pankaj, потому что его решение простого добавления следующей строки при загрузке страницы, казалось, решило проблему:

document.getElementsByTagName("base")[0].setAttribute("href", window.location.pathname+window.location.search);

Однако это работает только в том случае, если диаграммы находятся на изначально загруженной странице (когда пользователь переходит непосредственно на страницу с диаграммами); при переходе на страницу с помощью чего-то вроде ui-router я все еще видел черный цвет.

Правильный ответ от @Shamasis. Добавление следующего к загрузке страницы устранит проблему во всем приложении:

eve.on('raphael.new', function () {
    this.raphael._url = this.raphael._g.win.location.href.replace(/#.*?$/, '');
});

В его первоначальном предупреждении упоминалось, что функции экспорта могут быть затруднены из облака, и это может быть (я не экспортирую из облака). Однако локальный экспорт, как видно из этого jsFiddle, работает отлично: http://jsfiddle.net/aaronaudic/Gs6sN/14

Мой базовый тег в заголовке страницы выглядит просто:

<base href="/">

person Aaron Jessen    schedule 07.09.2014    source источник
comment
Проверьте примененные стили, посмотрите на сетевой панели на предмет неудачных запросов файлов CSS, возможно, что-то в Fusion Charts необходимо обновить, чтобы использовать абсолютный путь. Если вы видите какие-либо ошибки 404 на консоли или сетевой панели в инструментах отладки Chrome, вы можете отправить отчет об ошибке в Fusion Charts или выполнить поиск указанного URL-адреса в источнике и исправить его.   -  person shaunhusain    schedule 07.09.2014
comment
Можете ли вы поместить код на jsfiddle?   -  person pankaj    schedule 07.09.2014
comment
@pankaj Вот самый простой пример проблемы: jsfiddle.net/aaronaudic/59Bmf/207 . Все, что я сделал, это взял собственный пример FusionChart и добавил тег ‹base href = /› в раздел заголовка. Удаление решит проблему. Эта проблема, по-видимому, существует без AngularJS, поэтому пока просто игнорируйте этот аспект.   -  person Aaron Jessen    schedule 07.09.2014
comment
Есть подсказки для Angular 2+? Я не мог найти способ получить eve ссылку.   -  person BrunoJCM    schedule 25.03.2019


Ответы (5)


Проблема в первую очередь не в FusionCharts - это общая SVG проблема. В SVG, когда цвет градиента применяется к элементу, он фактически «относится» к другому элементу градиента на странице. Это несколько похоже на то, как ссылки могут ссылаться на хэштеги, использующие <a id="hash" /> на странице.

Теперь, когда вы устанавливаете <base> на страницу, ссылки становятся халявными. Теперь градиенты относятся к элементу с URL-адресом, указанным в вашем теге base.

Один из способов исправить это - получить доступ к внутреннему средству визуализации графики и жестко установить URL-адрес на абсолютное местоположение страницы. Для этого нужно обратиться к объекту RedRaphael в ядре FusionCharts и установить для него переменную _url.

Следующий код должен сделать это за вас.

eve.on('raphael.new', function () {
    this.raphael._url = this.raphael._g.win.location.href.replace(/#.*?$/, '');
});

Единственное предостережение: указание абсолютного URL-адреса в качестве ссылки на элементы градиента не работает в некоторых старых браузерах (я не уверен точно - это может быть Safari 5 или FF 3.0). Это также может иметь некоторые негативные последствия при экспорте FusionCharts как изображения - относительные URL-адреса будут недействительными, когда SVG будет растеризован на серверах экспорта FusionCharts Cloud.

person Shamasis Bhattacharya    schedule 07.09.2014
comment
Первоначально я присудил ответ @pankaj, потому что его манипуляции с базовым тегом работали, если текущая загруженная страница содержит диаграммы. Но если вы перейдете на страницу с другой страницы (например, с помощью сторонней директивы Angular ui-router), диаграммы все равно будут черными. Ваше решение - единственное, которое работает во всем SPA. Хотя я не могу подтвердить ваше предостережение об экспорте из облака, я провел здесь тест jsfiddle.net/aaronaudic/Gs6sN / 14, чтобы доказать, что экспорт действительно работает на местном уровне. Ваше здоровье! - person Aaron Jessen; 08.09.2014
comment
отличное решение. У меня возникла проблема, когда я перешел с Fusionchart 3.3.1, который использовал холст для рендеринга на 3.4. - person Anirudha; 27.04.2017
comment
Спасибо, Шамасис. Это решение решило мою проблему в проекте Ionic 4 + Angular 8. Я только что добавил это в свой app.component.ts import { Component } from '@angular/core'; declare var eve; @Component({...}) export class AppComponent { `constructor () {this.initializeApp (); } `initializeApp () {` this.platform.ready (). then (() = ›{` this.statusBar.styleDefault (); `this.splashScreen.hide ();` eve.on ( 'raphael.new', function () {`` this.raphael._url = this.raphael._g.win.location.href.replace (/#.*?$/, ''); ``});} );}} ` - person Fehim; 18.12.2019

Я исправляю эту проблему на Angular 7 и FusionCharts здесь, FusionCharts.options.SVGDefinitionURL='absolute' мало помогло. Он исправил Safari, но только на первом маршруте с круговыми диаграммами. Любая дальнейшая навигация снова сломалась, и теперь Chrome также ломается после навигации.

Я рассмотрел обходной путь Рафаэля, но не смог найти способ получить eve ссылку, поэтому решил попробовать удалить baseHref, который, кажется, является «причиной» проблемы.

Вот что я сделал:

  1. Удалил base из index.html (оставил там комментарий, чтобы все знали почему), а также поместил значок в качестве абсолютного ресурса.
    <!-- Configuring deployUrl and APP_BASE_HREF in the main module, 
         see [[this stackoverflow link]] -->
    <!--<base href="/">-->
    ...
    <link rel="icon" type="image/x-icon" href="/favicon.ico">
  1. Настроен deployUrl на angular.json (см. этот вопрос)

Здесь я использую макет нескольких проектов, поэтому для меня он был добавлен по пути projects.my-project.architect.build.options.deployUrl, что должно быть проще в проекте по умолчанию.

    "deployUrl": "/",
  1. Настроил модуль моего приложения для внедрения конфигурации для маршрутизатора (docs)
import { APP_BASE_HREF } from '@angular/common'
...

@NgModule({
    ...
    providers: [
        { provide: APP_BASE_HREF, useValue: '/' },
        ...
    ],
    ...
})

Сейчас все выглядит хорошо, все браузеры работают, роутер Angular вроде тоже работает нормально.

person BrunoJCM    schedule 29.03.2019
comment
Android работает нормально, в iOS я получаю круговые и кольцевые диаграммы черного цвета, я реализовал ваше решение, теперь моя проблема исправлена, спасибо за ваше решение. - person Mohan; 02.04.2019

TL; DR: установите FusionCharts.options.SVGDefinitionURL='absolute'; в своем JavaScript, чтобы решить эту проблему.

Подробно:

Для этого есть решение FusionChart.

Упомянутая вами проблема возникает из-за использования SVG относительных ссылок на такие вещи, как градиенты, которые разрешаются неправильно из-за наличия тега.

Эта проблема описана на странице https://github.com/angular/angular.js/issues/8934. Одно из возможных решений - установить $locationProvider.html5Mode({ enabled: true, requireBase: false }); и использовать абсолютные пути.

Хотя это действительно решает проблему, есть решение FusionCharts, установив FusionCharts.options.SVGDefinitionURL='absolute'; в вашем JavaScript. (http://www.fusioncharts.com/dev/api/fusioncharts/fusioncharts-properties.html#FusionCharts.options-attributes-SVGDefinitionURL)

person Aides    schedule 01.03.2016

Вы можете просто установить абсолютный URL-адрес в базовом теге

document.getElementsByTagName("base")[0].setAttribute("href", window.location.pathname+window.location.search);

Вот jsfiddle: http://jsfiddle.net/59Bmf/208/

В angular вы можете использовать привязку URL-адреса, используя свойство в контроллере.

$scope.absurl=$location.absUrl()

И использовать его изнутри

<base href="{{absurl}}">
person pankaj    schedule 07.09.2014
comment
Хорошо, @pankaj, первая часть вашего ответа работает, если страница с диаграммой (ами) является изначально загруженной страницей. Но при переходе с другой страницы на страницу с диаграммами с помощью ui-router диаграммы снова становятся черными. Не могли бы вы объяснить, где и как мне использовать часть $ scope.absurl = $ location.absUrl ()? Могу ли я реализовать это с каждым контроллером? - person Aaron Jessen; 08.09.2014

@ Шамасис Бхаттачарья спас мне жизнь.

Это решение решило мою проблему с fusioncharts в проекте Ionic4 + Angular8.

Вот что я сделал в компоненте app.component.ts:

import { Component } from '@angular/core';
import { Platform } from '@ionic/angular';

declare var eve;

@Component({
  selector: 'app-root',
  templateUrl: 'app.component.html',
  styleUrls: ['app.component.scss']
})
export class AppComponent {
  constructor() {
    this.initializeApp();
  }

  initializeApp() {
    this.platform.ready().then(() => {
      eve.on('raphael.new', function() {
        this.raphael._url = this.raphael._g.win.location.href.replace(/#.*?$/, '');
      });
    });
  }
}
person Fehim    schedule 18.12.2019