Построение термостата ui, перекрытие двух элементов, но невозможность доступа к элементу ползунка [дубликат]

TL; DR

Повторно создайте теги с новыми желаемыми данными. Но если кто-то еще имел их раньше, они не могут принять ваших новых. Или они могут! Это [до g5] их .

Описание

Я знаю, что вы можете изменить автора и имя / дату коммиттера Git Commit

blockquote>

На самом деле, вы не можете , и тот факт, что вы не можете (и что вы можете сделать вместо этого), играет важную роль в остальной части ответа.

Все объекты Git имеют идентификатор хэша как свое «истинное имя». Хэш формируется путем вычисления криптографической контрольной суммы содержимого объекта. Это означает, что вы никогда не сможете вообще изменить какой-либо объект Git.1 То, что вы можете выполнить , - это создать новый объект , а затем убедить всех, у кого старый объект прекратил его использовать, и использовать вместо этого новый объект.

Это то, что делает git commit --amend (и что могут делать различные варианты интерактивной переадресации, такие как edit и reword). Сначала мы извлекаем исходный объект Git в обычные данные, где мы можем манипулировать им; то мы делаем манипуляции и просим Git построить новый объект; и, наконец, мы прекращаем использовать старый объект и вместо этого начинаем использовать новый.

Для фиксации, которая является командой commit (см. определение главы в gitglossary ), все это проходит довольно легко и гладко, если мы еще не подтолкнули это сообщение. Нет никаких дополнительных коммитов, ссылающихся на этот коммит, поэтому мы создаем новый коммит, который «так же хорош», перенаправляет название ветки ( head ) на новый коммит и забывает о оригинале мы только что заменили. Это выглядит как , мы изменили фиксацию, но вместо этого получим новый хеш-идентификатор.

Как это относится к тэгам

Git имеет два типа тегов, легкий тег и аннотированный тег . Разница между ними заключается в том, что аннотированный тег состоит из легкого тега, указывающего на объект тега . Это объект тега, который имеет информацию тегов. (Легкий тег не имеет такой информации, он просто указывает на объект фиксации.)

Следовательно, чтобы «изменить» объект тега, мы должны сделать то же самое, что и мы, чтобы «изменить» «объект фиксации: скопируйте его в объект тега new .

Для этого нет встроенной команды, но легко построить один из git cat-file -p - это позволяет извлекать исходный тег в обычные данные и git mktag, что позволяет превращать обычные данные в новый объект тега. Например, тег v2.2.1 в репозитории Git для Git начинается с:

$ git cat-file -p v2.2.1
object 9b7cbb315923e61bb0c4297c701089f30e116750
type commit
tag v2.2.1
tagger Junio C Hamano <...

Линией object является фиксация, на которую указывает тег:

$ git cat-file -t 9b7cbb315923e61bb0c4297c701089f30e116750
commit

, поэтому мы можем скопировать этот тег в новый с другим tagger:

$ new_hash_id=$(git cat-file -p v2.2.1 | sed -e .... | git mktag)
$ git update-ref refs/tags/$name $new_hash_id

, где sed делает все, что необходимо (см. ниже), а $name - имя тег. Затем мы сделаем легкий тег v2.2.1 укажем на этот новый объект тега в $new_hash_id. Но есть две проблемы (только один из которых, вероятно, применим к вашему делу).

Метки могут быть PGP-подписанными

Вышеупомянутый тег далее говорит:

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

, а затем в нем есть подпись PGP. Эта подпись охватывает все данные, за исключением самой подписи. Если вы копируете и изменяете этот тег, вы должны полностью отменить оригинальную подпись (это будет недействительным и не будет применено к тестированию); вы можете и должны заменить его новой подписью, и если да, то чей, зависит от вас.

Теги не должны изменять целевые объекты

Существующий легкий тег v2.2.1 в настоящее время указывает на существующий объект тега:

$ git rev-parse v2.2.1
7c56b20857837de401f79db236651a1bd886fbbb

Это данные, которые мы просматривали до этой точки.

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

Метки, однако, являются довольно часто «хорошо известно». Фактически, точка тегов, в частности PGP-подписанные аннотированные теги, где подпись PGP позволяет проверить, что никто не обезглавил данные тега, - это гарантировать , что вы можете быть уверены, что этот тег является правым тегом и что объект фиксации, на который он указывает, является исходным фиксатором, а не некоторым троянским коньком. Если вы измените существующий тег, вы пресекаете это намерение. Более того, некоторые люди, которые знают значение предыдущего тега, просто откажутся принять новое значение: вы не будете способным , чтобы заставить их обновить существующий тег. Пока вы это делаете перед , у кого-либо еще есть тег, они никогда не узнают, и все будет хорошо.


1Or, вы не можете измените содержимое объекта Git, если вы не можете сломать хэш . См. Также . Как недавно обнаруженное столкновение sha1 влияет на git?

1277
задан 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;

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

2135
ответ дан TylerH 23 August 2018 в 01:25
поделиться
  • 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 23 August 2018 в 01:25
поделиться
  • 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 23 August 2018 в 01:25
поделиться

В настоящее время я работаю с воздушными шарами на холсте. Но поскольку баллон с указателем завернут в 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. 23 August 2018 в 01:25
поделиться

Также приятно знать ... Вы можете отключить указатели-события в родительском элементе (возможно, прозрачном 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>
191
ответ дан Blazemonger 23 August 2018 в 01:25
поделиться

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

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

2
ответ дан bobince 23 August 2018 в 01:25
поделиться
  • 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 23 August 2018 в 01:25
поделиться

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

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

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

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

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

1
ответ дан julianm 23 August 2018 в 01:25
поделиться

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

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

1
ответ дан kenny 23 August 2018 в 01:25
поделиться

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

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

4
ответ дан lincolnk 23 August 2018 в 01:25
поделиться
  • 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 23 August 2018 в 01:25
поделиться

Я добавляю этот ответ, потому что я не видел его здесь полностью. Я смог сделать это, используя 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 23 August 2018 в 01:25
поделиться
  • 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 23 August 2018 в 01:25
поделиться
  1. Скрыть наложение элемента
  2. Определить координаты курсора
  3. Получить элемент в этих координатах
  4. Триггер щелкнуть по элементу
  5. Показать повторно наложенный элемент

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

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

Похожие вопросы: