Архив за месяц: Август 2014

Простой «drag and drop» скроллер по горизонтали на jQuery

Мне надо было сделать возможность прокрутки дива внутри другого дива по горизонтали. Для этого воспользуемся известным приемом из CSS и HTML

Много много контента

стили вынес в html для наглядности. Внутренний див в 10 раз шире внешнего, поэтому промотать обязательно придется. А теперь внимание. При небольшой высоте контейнера, пользователь сразу увидит внизу скроллер и потянет за него, а если высота большая, больше высоты страницы? Тогда надо будет опуститься вниз до скроллера, перемотать и снова подняться вверх по странице. Очень не юзабельно. Но слава богу, помимо html и css есть JavaScript. Сразу полез искать код, но почему-то не нашел простой реализации без плагинов и лишнего кода. Поэтому пришлось написать свою версию.

jQuery(document).ready(function(){
    var clicked = false, base = 0, base_scroll = 0;
    $('.scroll_me').on({
        mousemove: function(e) {
            clicked && function(xAxis) {
                var _this = $(this);
                $('.scroll_wrap').scrollLeft( base_scroll + base - xAxis )
            }.call($(this), e.pageX);
        },
        mousedown: function(e) {
            clicked = true;
            base = e.pageX;
            base_scroll = $('.scroll_wrap').scrollLeft()
        },
        mouseup: function(e) {
            clicked = false;
        }
    })
});

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

А для того, чтобы пользователям было сразу понятно, что можно прокручивать влево-вправо, изменил CSS стиль курсора мыши следующим образом:

.scroll_me{
    cursor: ew-resize;
}

Надеюсь веб-разработчикам приём, описанный выше, будет полезен. Приведенный выше код я использовал для прокрутки турнирной таблицы на сайте oball.ru. В виду того, что при большом количестве команд, разместить всех на одном листе невозможно и надо использовать скроллинг. Посмотреть на пример можно например в тестовом турнире по пляжному волейболу здесь.

Примеры запросов к графовой базе данных Neo4j

Стоит сразу отметить, что если представление ваших данных хорошо ложатся на реляционные базы данных, то пробовать Neo4j не стоит. Абсолютно точно вы проиграете в скорости. Однако, если хранимые объекты представляют собой иерархический граф с разными типами связей, то в этом случае можно сильно упростить и код и архитектуру приложения, а также получить выигрыш в скорости. На официальном сайте приводится пример с фильмами-актерами-режиссерами и в первую очередь советую посмотреть этот туториал. Он будет сразу доступен после запуска Neo4j и открытия интерактивной части в браузере. Тем не менее для себя я сделал небольшую шпаргалку по запросам, которую в дальнейшем планирую пополнять.

Выбрать в neo4j все вершины (ограничение по ):

MATCH n RETURN n LIMIT 25

Получить в neo4j вершину по ID:

START n = node(ID[,ID2]) RETURN n

по свойству:

MATCH (n) WHERE n.name = "профессия" RETURN n

Выбрать в neo4j пару элементов с определенными айдишниками

START a=node(9), b=node(18) RETURN a,b

Выбрать в neo4j такие ноды, у которых есть определенный атрибут:

MATCH (n) WHERE HAS (n.name) RETURN n
MATCH (n) WHERE (n)-[:HYPERONS]->() RETURN n

Удалить в neo4j все вершины и связи. Стоит отметить что нельзя удалить ноду без удаления связей. Возможно при разработке приложения эту операцию выполнять придется весьма часто.

MATCH (a) OPTIONAL MATCH (a)-[r1]-() DELETE a, r1

Подсчитать в neo4j количество вершин и связей соответственно:

START n=node(*) RETURN count(n)
START r=relationship(*) RETURN count(r)

Выбрать в neo4j такие вот связанные штуки:

MATCH (n)<-[]->(a) WHERE n.name = "воровать" RETURN n,a

Скобки, указывающие на тип связи можно опустить:

MATCH (n)(a) WHERE n.name = "воровать" RETURN n,a

Выбрать в neo4j изолированные вершины:

MATCH n WHERE not (n--()) RETURN n LIMIT 25

Удалить в neo4j изолированные вершины:

MATCH n WHERE not (n--()) DELETE n

Найти в neo4j самый короткий путь между двумя вершинами:

MATCH (a { name:"бежать" }),(b { name:"парить" }), p = shortestPath((a)-[*..5]-(b)) RETURN p

Найти все возможные пути из а в б, с ограничением на тип связи (или-или) и длину цепочки

MATCH (a { name:"прямой" }),(b { name:"толстый" }), p = allShortestPaths((a)<-[s:SYNONYMY|HYPERONYMY*..5]->(b)) RETURN p

Выбрать в neo4j вершину с максимальным айдишником:

MATCH (n) RETURN n ORDER BY id(n) DESC LIMIT 1