Игнорируйте отсутствующие изображения в SVG с данными D3 и введите методы [дубликаты]

1

EDIT: Я нашел решение для этой точной проблемы (которая не связана с проблемой "дублирования"). Я напишу в нижней части этого вопроса, так как я больше не могу добавить ответ, только отредактировать.

При использовании D3 я добавляю изображения в SVG из динамического источника данных. Что-то вроде этого:

var images = [
  'https://avatars2.githubusercontent.com/u/339630?v=3&s=460',
]

d3.select('svg')
  .data(images)
  .append('image')
  .attr('xlink:href', function(d) { return d; })
  .attr('width', 200)
  .attr('height', 200)

Когда изображение не существует, оно отображает сломанное изображение:

Изображение 174551

Как вообще ничего не сделать? Я знаю, что могу сделать что-то вроде этого:

const img = $('<img>')
img.on('load', () => {
    // image exists! use it...
})
img.on('error', () => {
    // image does not exist. do nothing...
})
img.attr({ src: 'the url' })

Но я не понимаю, как использовать эту технику с data D3 и enter.

Решение:

        node.append('image')
            .attr('id', (d, i) => 'image-' + i)

        data.forEach((d, i) => {
            const src = d.src
            var imgTest = new Image()
            imgTest.onload = function() {
                svg.select('#image-' + i).attr('xlink:href', src)
            }
            imgTest.onerror = function() {
                // imgTest.src = "fallback image url"
            }
            imgTest.src = src
        })
Теги:
d3.js
svg

1 ответ

0
Лучший ответ

вы можете найти решение своей проблемы здесь. Не самый красивый, но все еще работающий

Как поймать svg-изображение не загружается в D3?

Предупреждение о спойлере, вам может потребоваться предварительно загрузить изображения, чтобы обнаружить сбой или нет, то, что не существует в svg

  • 0
    Спасибо за Ваш ответ. Я думаю, что это то, что я собираюсь сделать, однако часть, в которой я запутался, это КАК это сделать, когда я использую D3 enter . т.е. для нескольких изображений. Некоторые могут потерпеть неудачу, а другие нет. В вашем связанном ответе есть только одно изображение. (хотя я по общему признанию поместил только одно изображение в массив в моем примере)
  • 0
    Еще раз спасибо. Я адаптировал связанный ответ, чтобы применить к этому сценарию.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню