Поместите строки SVG поверх элементов HTML, сохраняя возможность взаимодействия с элементами HTMl [duplicate]

Если вы получаете эту ошибку при попытке ссылки на файл C, сначала дважды проверьте имена функций для опечаток. Затем дважды проверьте, что вы не пытаетесь вызвать функцию C из среды C ++ / Objective-C ++ без использования конструкции extern C {}. Я рвал волосы, потому что у меня был класс, который был в файле .mm, который пытался вызвать функции C. Это не работает, потому что в C ++ символы искажены. Фактически вы можете увидеть конкретные символы, созданные с помощью инструмента nm. Terminal на путь к файлам .o и запустите nm -g в файле, который вызывает символ, и тот, который должен иметь этот символ, и вы должны увидеть, совпадают ли они или нет, что может дать ключ к ошибке .

nm -g file.o

Вы можете проверить символы C ++, которые были запятыми:

nm -gC file.o
1274
задан pnuts 1 November 2015 в 02:51
поделиться

14 ответов

Да, вы МОЖЕТЕ это сделать.

Используя pointer-events: none вместе с условными операторами CSS для IE11 (не работает в IE10 или ниже), вы можете получить решение, совместимое с браузером для этой проблемы.

Используя AlphaImageLoader, вы можете даже поместить прозрачные .PNG/.GIF s в оверлей div и щелкнуть по элементам внизу.

CSS:

pointer-events: none;
background: url('your_transparent.png');

IE11 условно:

filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='your_transparent.png', sizingMethod='scale');
background: none !important;

Вот основная страница примера со всем кодом.

2134
ответ дан TylerH 18 August 2018 в 02:38
поделиться
  • 1
    Я не могу заставить примерную страницу работать в IE 9 вообще, будь то режим стандартов или режим совместимости. По-видимому, IE 9 поддерживает pointer-events:none, но документы утверждают, что это только для элементов SVG. – Andy E 6 August 2011 в 19:07
  • 2
    В зависимости от приложения / аудитории это может быть не очень много, но в Opera не работают функции указателя: developer.mozilla.org/en/CSS/pointer-events – nheinrich 29 October 2011 в 22:56
  • 3
    Я не совсем понимаю смысл использования этого в IE9. IE9 передает события через прозрачные div. На самом деле, во многих случаях мне приходилось делать фоновый цвет div с непрозрачностью: .01, чтобы IE9 прекратил передавать события мыши через него. Таким образом, решение было бы необходимо только в других браузерах, нет? – maulkye 25 March 2012 в 23:28
  • 4
    IE10 не поддерживает фильтры или указатели-события. К сожалению, это уже не приемлемое решение. Это позор. – superluminary 21 December 2012 в 14:26
  • 5
    IE11 полностью поддерживает указатели-события. Это означает, что все современные браузеры поддерживают его. Это приемлемое решение на конец 2014 года. caniuse.com/#search=pointer-events – Judah Himango 1 December 2014 в 23:07

Еще одна идея попробовать (ситуационная):

  1. Поместить содержимое, которое вы хотите в div;
  2. Поместить не щелканье наложения по всей странице с z-индексом выше,
  3. сделать другую обрезанную копию исходного div
  4. наложения и абс позиционировать копию div в том же месте, что и исходное содержимое, которое вы хотите кликать с помощью еще более высокий z-индекс?

Любые мысли?

3
ответ дан Adam 18 August 2018 в 02:38
поделиться
  • 1
    Это иногда самое простое кросс-браузерное решение. Вы даже можете добавить класс во все, что необходимо для интерактивного просмотра, а затем повторить повторное использование этих элементов в jquery при загрузке страницы – koosa 6 December 2013 в 18:31

просто оберните тэг вокруг всего извлечения html, например

<a href="/categories/1">
    <img alt="test1" class="img-responsive" src="/assets/photo.jpg" />
        <div class="caption bg-orange">
            <h2>
                test1
            </h2>
        </div>
</a>

в моем примере класс caption имеет эффекты зависания, что с указателями-событиями: none; вы просто потеряете

обертывание содержимого будет поддерживать ваши зависающие эффекты, и вы можете щелкнуть по всему изображению, включая div, !

2
ответ дан Alexis 18 August 2018 в 02:38
поделиться

В настоящее время я работаю с воздушными шарами на холсте. Но поскольку баллон с указателем завернут в div, некоторые ссылки под ним больше не будут доступны. В этом случае я не могу использовать extjs. См. базовый пример для моего учебника по речевому шару , который требует HTML5

. Поэтому я решил собрать все координаты ссылок изнутри воздушных шаров в массиве.

var clickarray=[];
function getcoo(thatdiv){
         thatdiv.find(".link").each(function(){
                 var offset=$(this).offset();           
                 clickarray.unshift([(offset.left),
                                     (offset.top),
                                     (offset.left+$(this).width()),
                                     (offset.top+$(this).height()),
                                     ($(this).attr('name')),
                                     1]);
                                     });
         }

Я вызываю эту функцию на каждом (новом) шаре. Он захватывает координаты левого / верхнего и правого / нижних углов link.class - дополнительно атрибут name для того, что делать, если кто-то нажимает на эти координаты, и я любил устанавливать 1, что означает, что он не щелкнул струей , И переместите этот массив на клик. Вы можете использовать push тоже.

Чтобы работать с этим массивом:

$("body").click(function(event){
          event.preventDefault();//if it is a a-tag
          var x=event.pageX;
          var y=event.pageY;
          var job="";
          for(var i in clickarray){
              if(x>=clickarray[i][0] && x<=clickarray[i][2] && y>=clickarray[i][1] && y<=clickarray[i][3] && clickarray[i][5]==1){
                 job=clickarray[i][4];
                 clickarray[i][5]=0;//set to allready clicked
                 break;
                }
             }
          if(job.length>0){   
             // --do some thing with the job --
            }
          });

Эта функция проверяет координаты события щелчка тела или уже была нажата и возвращает атрибут имени , Я думаю, что нет необходимости идти глубже, но вы видите, что это не так сложно. Надеюсь, что это было ...

5
ответ дан B.F. 18 August 2018 в 02:38
поделиться

Также приятно знать ... Вы можете отключить указатели-события в родительском элементе (возможно, прозрачном div), но он все еще разрешен для его дочерних элементов. Это полезно, если вы работаете с несколькими перекрывающимися слоями div, где вы хотите иметь возможность нажимать дочерние элементы, в то время как родительские слои не реагируют на какие-либо события мыши вообще. Для этого все родительские divs получают pointer-events: none, а его интерактивные дочерние элементы возвращают события-указатели pointer-events: auto

.parent {
    pointer-events:none;        
}
.child {
    pointer-events:auto;
}

<div class="some-container">
   <ul class="layer-0 parent">
     <li class="click-me child"></li>
     <li class="click-me child"></li>
   </ul>

   <ul class="layer-1 parent">
     <li class="click-me-also child"></li>
     <li class="click-me-also child"></li>
   </ul>
</div>
190
ответ дан Blazemonger 18 August 2018 в 02:38
поделиться

Нет, вы не можете нажать «через» элемент. Вы можете получить координаты щелчка и попытаться определить, какой элемент находился под элементом clicked, но это действительно утомительно для браузеров, у которых нет document.elementFromPoint. Затем вам все равно придется эмулировать действие нажатия по умолчанию, которое не обязательно тривиально, в зависимости от того, какие элементы у вас там.

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

2
ответ дан bobince 18 August 2018 в 02:38
поделиться
  • 1
    Продвинутый ни для чего. Это правильно. В противном случае вы не можете правильно использовать кросс-браузер (например, Opera не работает, а также не имеет несколько более старых версий других браузеров, отличных от IE). – Jani Hartikainen 7 October 2011 в 13:25

Вы можете поместить AP-наложение, например ...

#overlay {
  position: absolute;
  top: -79px;
  left: -60px;
  height: 80px;
  width: 380px;
  z-index: 2;
  background: url(fake.gif);
}
<div id="overlay"></div>

просто переверните его туда, где вы не хотите, то есть клик. Работает во всех.

1
ответ дан Igor Ivancha 18 August 2018 в 02:38
поделиться

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

Вместо этого я предлагаю вам поставить невидимый сразу после изображения документа, но изменяя положение на абсолютное.

Обратите внимание, что вам нужен родительский элемент для размещения позиции: относительный, и тогда вы сможете использовать эту идею. В противном случае ваш абсолютный уровень будет размещен только в верхнем левом углу.

Элемент абсолютной позиции позиционируется относительно первого родительского элемента, который имеет позицию, отличную от статической. Если такой элемент не найден, то содержащий блок является html

Надеюсь, что это поможет. См. здесь для получения дополнительной информации о позиционировании CSS.

1
ответ дан julianm 18 August 2018 в 02:38
поделиться

Я думаю, что event.stopPropagation(); следует упомянуть здесь. Добавьте это к функции щелчка вашей кнопки.

Предотвращает появление пузырьков в дереве DOM, предотвращая уведомление любого из обработчиков родительских событий.

1
ответ дан kenny 18 August 2018 в 02:38
поделиться

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

, занятая элементом, может быть найдена найденным 1. Получает местоположение элемента относительно вершины слева от страницы и 2. ширина и высота. библиотека, подобная jQuery, делает это довольно простым, хотя это можно сделать в простых js. добавление обработчика событий для mousemove объекта document обеспечит непрерывное обновление положения мыши сверху и слева от страницы. решая, находится ли мышь над любым данным объектом, состоит в проверке, находится ли положение мыши между левым, правым, верхним и нижним краями элемента.

4
ответ дан lincolnk 18 August 2018 в 02:38
поделиться
  • 1
    Думаете, вы могли бы объяснить немного больше об определении области, занимаемой элементом? благодаря – Ryan 9 September 2010 в 22:11
  • 2
    Как упоминалось выше, вы можете достичь этого, используя CSS {pointer-events: none;} в своем прозрачном контейнере. – Empereol 3 December 2012 в 17:51

Мне нужно было это сделать и решил пойти по этому пути:

$('.overlay').click(function(e){
    var left = $(window).scrollLeft();
    var top = $(window).scrollTop();

    //hide the overlay for now so the document can find the underlying elements
    $(this).css('display','none');
    //use the current scroll position to deduct from the click position
    $(document.elementFromPoint(e.pageX-left, e.pageY-top)).click();
    //show the overlay again
    $(this).css('display','block');
});
6
ответ дан Nathan Arthur 18 August 2018 в 02:38
поделиться

Я добавляю этот ответ, потому что я не видел его здесь полностью. Я смог сделать это, используя elementFromPoint. Итак, в основном:

  • присоединить клик к div, на который вы хотите нажать
  • скрыть его
  • определить, на каком элементе указатель находится
  • выстрелил по элементу там.
var range-selector= $("")
    .css("position", "absolute").addClass("range-selector")
    .appendTo("")
    .click(function(e) {
        _range-selector.hide();

        $(document.elementFromPoint(e.clientX,e.clientY)).trigger("click");
    });

В моем случае оверлейный div абсолютно позиционирован - я не уверен, что это имеет значение. Это работает на IE8 / 9, Safari Chrome и Firefox по крайней мере.

16
ответ дан SombreErmine 18 August 2018 в 02:38
поделиться
  • 1
    Мне нравится это решение! Я просто хочу, чтобы мы могли получить элемент из координат x, y, игнорируя один или несколько элементов, вместо того чтобы скрывать их. – Luke 20 March 2013 в 21:35

Щелчок через DIV на базовый элемент работает в браузерах. Opera нуждается в ручной переадресации событий, Firefox и Chrome понимают CSS pointer-events:none;, а IE ничего не нужно с прозрачным фоном; с. background:white; opacity:0; filter:Alpha(opacity=0); IE нуждается в переадресации, как Opera.

См. тест пересылки в http://jsfiddle.net/vovcat/wf25Q/1/ и http://caniuse.com/pointer-events. Свойство CSS-указателя-событий перенесено из CSS3-UI в CSS4-UI.

37
ответ дан Vladimir Prodan 18 August 2018 в 02:38
поделиться
  1. Скрыть наложение элемента
  2. Определить координаты курсора
  3. Получить элемент в этих координатах
  4. Триггер щелкнуть по элементу
  5. Показать повторно наложенный элемент

    $('#elementontop).click(function (e) {
        $('#elementontop).hide();
        $(document.elementFromPoint(e.clientX, e.clientY)).trigger("click");
        $('#elementontop').show();
    });

11
ответ дан wcloister 18 August 2018 в 02:38
поделиться
  • 1
    Это было мое решение, мне все же интересно, как управлять курсором: указатель на закрытые элементы, которые находятся под любым sugestion? – Macumbaomuerte 3 April 2014 в 12:18