'onclick' не работает с объектом-элементом с svg-изображением

Когда я использую атрибут onclick элемента object в html-документе, он не реагирует на клики.

В моем документе у меня есть изображение svg, и я сохраняю его в элементе object, так как в изображении есть некоторая анимация, которая будет потеряна при простом использовании тега img.

В приведенном ниже упрощенном примере onmouseover работает с обоими объектами, но onclick работает только с object без svg-изображения.

document.getElementById('test1').onmouseover = hover;
document.getElementById('test1').onclick = click;
document.getElementById('test2').onmouseover = hover;
document.getElementById('test2').onclick = click;

function hover() { alert('Hovered');};
function click() { alert('Clicked');};
<object id='test1' data = "https://upload.wikimedia.org/wikipedia/commons/0/01/SVG_Circle.svg" height = "50px"></object>

<object id='test2' height = "50px" border = "1px solid black">some object</object>

Есть ли что-то, что я делаю неправильно здесь? Или есть альтернатива, которая работает?

Ответы, данные для этот (и сопутствующие вопросы), советуют использовать pointer-events: none на svg-изображении, обернуть его в div и применить прослушиватели к этому div. Но мне нужно, чтобы svg-изображение отвечало на mouse events, и поэтому я не могу установить pointier-events: none.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
1 532
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

После небольшого исследования я обнаружил, что ваша основная проблема:

The <object> tag can not be clicked. (*)

(*) Если тег <object> не пуст, его поведение будет таким же, как у тега <iframe>, что строго ограничено политикой CORS, и браузер будет блокировать любую попытку изменить источник.

Почему?

Политика безопасности CORS — это механизм, который использует дополнительный HTTP-заголовки, чтобы указать (или дать разрешение) браузеру использовать и управлять содержимым внешнего домена.

Это политика безопасности, потому что представьте себе это:

У кого-то есть вредоносный веб-сайт под названием stackoverflow.co. И этот злоумышленник решает загрузить через iframe веб-сайт stackoverflow.com и манипулировать его содержимым, чтобы обмануть пользователей на поддельной странице входа, и когда пользователи вводят свои личные учетные данные, он не входит на официальный сайт, поэтому его учетные данные будут украдены вредоносным сайтом. .

Ну, CORS здесь герой. Благодаря этой политике безопасности удаленные серверы могут отправлять дополнительный заголовок, который выглядит следующим образом: Access-Control-Allow-Origin: * и браузер определяет, что если какое-либо из этого содержимого загружается через тег <iframe> или <object>, любая попытка изменить его содержимое должна быть заблокирован.

Поскольку в 2019 году это стандартный в сети, большинство браузеров обнаруживают этот CORS-заголовок и предотвращают подобные эксплойты.

Итак, что нужно сделать?

Что ж, если ваша проблема заключается в том, что вам нужно загрузить svg, самое быстрое решение — загрузить его через тег <img>.

В противном случае вы не сможете внедрить, использовать, обрабатывать или что-то еще в теге <object> или <iframe> с включенным заголовком CORS. Кроме onload.

Дополнительные источники:

Пользователя, ответившего на аналогичный вопрос некоторое время назад, можно найти здесь.

Это дубликат, и по причине <object> не может быть click события. Неважно, используете ли вы jQuery или обычный javascript.

Asons 10.05.2019 21:23

Кроме того, не добавляйте шума, например, поясняйте, почему вопрос не является обманом, просто сосредоточьтесь на ответе.

Asons 10.05.2019 21:28

Следующий код должен помочь:

<div id='test1'>
    <object style = "pointer-events: none;" height = "50px" data = "https://upload.wikimedia.org/wikipedia/commons/0/01/SVG_Circle.svg"></object>
</div>

Почему минус?

Örvar 11.05.2019 22:32

Спасибо за комментарий. Если вы посмотрите на мой код, вы увидите, что элемент объекта заключен в элемент div, поэтому все внутри него будет реагировать на pointer-events. Я предполагаю, что вы не пробовали мой код до того, как проголосовали против. Я надеюсь, что вы попробуете это, так вы станете мудрее и сделаете stackoverflow лучше. Спасибо!

Örvar 18.05.2019 13:40

Но svg-изображение по-прежнему больше не будет реагировать на события мыши, даже на события наведения!

Fay Boisam 18.05.2019 16:18

Вы можете протестировать код здесь: jsfiddle.net/tvrxekbf

Örvar 19.05.2019 14:45

Я знаю, что ваше решение работает для этого примера. Но изображение svg, которое я использую, также использует javascript и css и, таким образом, реагирует на события мыши. Это больше невозможно, если для событий-указателей установлено значение none.

Fay Boisam 19.05.2019 15:26

Другие вопросы по теме