Страницы

Поиск по вопросам

пятница, 23 ноября 2018 г.

Всплывающая подсказка на объекте с задержкой

Есть несколько рядом лежащих объектов, наводя на каждый из них возникает подсказка с анимацией (список ul, в котором li плавно появляются один за другим). Так как элементов много и пользователь может резко водить по ним, решил сделать задержку в виде debounce(f, 150ms). Но теперь если провести случайно мышкой по объекту и не взаимодействовать впринципе ни с чем то появляется подсказка последнего задетого объекта (оно и логично), так как debounce срабатывает позже чем сработал .stop().fadeOut(). А так же иногда появляется баг, что если в рукой дернуть например с одного объекта на другой (не стал воссоздавать здесь, может так кто то разберется, если нет то приведу пример постараюсь), то подсказка возникает под курсором, но так как она перекрывает объект, который показывает то она тут же исчезает и снова мышка на обекте, подсказка появляется и все зацикливается.
function debounce(f, ms) { let timer = null; return function (...args) { const onComplete = () => { f.apply(this, args); timer = null; } if (timer) { clearTimeout(timer); } timer = setTimeout(onComplete, ms); }; } function renderHint() { $('#hint').stop().append('123').fadeIn('100'); } let renderHintDebounce = debounce(renderHint, 150); $('.block').on('mouseenter', function(e) { $('#hint').empty(); $(this).mousemove(function(pos) { $("#hint") .css('left', (pos.pageX + 50)+'px') .css('top', (pos.pageY - 30)+'px'); }); renderHintDebounce(); }); $('.block').on('mouseleave', function(e) { $('#hint').stop().fadeOut(100).queue(function() { $(this).empty().dequeue(); }) }); .container { display: flex; justify-content: center; align-items: center; height: 100vh; width: 100vw; } .block { width: 100px; height: 100px; background: red; } #hint { position: absolute; display: none; background: #eee; }

123

Добавлено. Если у всплывающей подсказки убрать дополнения по расположению т.е. добавленные 50 и 30 пикселей то ошибка с появлением и исчезновением подсказки похожа на ту что у меня.


Ответ

$(function(){ let hint=$('#hint'), hintTimer, fadeTime=400 $('.block').on('mouseenter', function(e) { let el=$(this) el.mousemove(function(pos) { hint .css('left', (pos.pageX + 50)+'px') .css('top', (pos.pageY - 30)+'px'); }); hintTimer=setTimeout(()=>hint.html(el.attr('hint')).fadeIn(fadeTime),fadeTime) }); $('.block').on('mouseleave', function(e) { if(hintTimer) clearTimeout(hintTimer) hint.off('mousemove').fadeOut(fadeTime) }); }) .container { display: flex; justify-content: center; align-items: center; height: 100vh; width: 100vw; } .block { width: 100px; height: 100px; background: red; border:1px solid white; } #hint { position: absolute; display: none; background: #eee; }

123

Удалить все файлы кроме белого списка

Существует некая директория /var/recs содержащая 76763 файлов и 29400 вложенных директорий чей уровень вложенности не превышает -maxdepth 1. Так же, существует список "нужных файлов" (тех, что должны существовать в этой директории) из mysql содержащий 54721 basename (не содержащих путь к файлу) имён. Предо мной встала задача периодически удалять все файлы кроме тех, что есть в списке "нужных файлов". Пока для себя вижу простой путь: искать все файлы с помощью find, брать bash-скриптом basename и банально перебором искать его в списке "нужных файлов": При нахождении - переходить к следующему, в противном случае - удалять. Опционально, удалять пустые директории.
Собственно вопрос: может есть более правильный и/или быстрый способ это делать? Ну, например, привести списки к единому виду, отсортировать, с помощью comm сравнить и удалить лишнее. Может вообще не на bash делать? В общем, буду рад любым идеям :)


Ответ

Создаем файл whitelist.txt с содержимым:
file190 file195 file198
Создаем папку test_folder с файлами, названия некоторых из которых имеются в whitelist.txt :
touch /path/to/test_folder/file{190..200}
И удаляем все, кроме содержащихся в whitelist.txt
grep -vw "$(< whitelist.txt)" < <(find /path/to/test_folder -type f) | xargs rm
Ну или так:
xargs rm < <(grep -vw "$(< whitelist.txt)" < <(find /path/to/test_folder -type f))
Соответственно глубину поиска удаляемых файлов задаем параметром -maxdepth для find
Ну и зачистим пустые директории:
find /path/to/test_folder -type d -exec rmdir -p --ignore-fail-on-non-empty {} \;

Как определить что произошел импорт класса?

Есть ли библиотеки для java позволяющие на этапе компиляции определить, что некий класс импортируется там, где это не желательно?
Как я это вижу:
@VisibleFor(some.packagee.name) public class AlmostPublic { // ... }
И теперь попытка импортировать класс AlmostPublic в любом месте за пределами пакета some.packagee.name должна вызвать ошибку компиляции.


Ответ

Если вы хотите следить за командой разработчиков, к которым у вас есть доступ, то вы можете скачать расширение для IntelliJ - Chekstyle-IDEA(вы так же можете скачать его для Maven). Суть такая: вы запускаете проверку, и Chekstyle показывает вам ошибки, т.е. где по "её" мнению код написан в неверном стиле(это по умолчанию). Но вы можете добавить туда собственные фильтры, например import .... Вы даже можете настроить IDEA так, что бы проверки пред компиляцией выполняла Chekstyle(т.е. точно так же, как у вас из-за ошибки не компилируется код, у вас он не будет компилироваться из-за импорта класса, если вы это все настроили).
Если вы пишите (допустим) библиотеку, т.е. вы не сможете следить за разработкой программ, кот. используют ваш класс, то как уже писали, вы не можете запретить создание импортов на уровне компиляции. Тогда вы можете запретить создавать объекты своего класса, т.е. определить дефолтный конструктор как default(т.е., вообще без модификатора) - сделать его доступным только внутри пакета(package).

Как в Chrome убрать Flash, не пользуясь расширениями?

Как в Chrome убрать Flash, не пользуясь расширениями?


Ответ

Перейти на страницу chrome://plugins, найти Flash и отключить.

Как добавить возможность изменять размеры столбцов таблицы с помощью мыши в GWT?

Не хочу использовать gwt-ext и подобные ради этой цели. Как на чистом GWT реализовать ресайзеры для столбцов таблицы?


Ответ

Есть два основных варианта, как это можно сделать: Отслеживать сообщения MouseDown/Move/Up с помощью sinkEvents & onBrowserEvent в самой компоненте заголовка, и анализировать координату если она +/-5 от границы, то обрабатывать как при dnd. Использовать отдельные компоненты в качестве управляющих изменением размера, и поместить их поверх заголовка таблицы, например, с помощью layout panel, и сделать невидимыми (opacity = 0.0). Второй способ более правильный, он используется, например, в google-docs (главная таблица с файлами).