Опубликовано 16 января 2011, 12:37 под The Prodigy - Omen Reprise

Переделанный плагин checkbox для jsTree. В оригинале чекбоксы служат для выделения элементов, здесь — для простановки им булевых атрибутов. Соответственно, изменения:

  • Работает использование выделения из плагина core
  • Клик по чекбоксу родителя не отражается на детях
  • Кликать нужно именно по чекбоксу, а не по всему элементу
  • Спрайт для полувыделенного элемента рисовать не нужно

/*
 * jsTree checkbox for attributes plugin 0.1
 * Inserts checkboxes in front of every node
 * Depends on the ui plugin
 * DON'T KNOW IF STILL DOES NOT WORK NICELY WITH MULTITREE DRAG'N'DROP
 */
(function ($) {
    $.jstree.plugin("checkbox-without-parent-child-interaction", {
        __init : function () {
            // this.select_node = this.deselect_node = this.deselect_all = $.noop;
            // this.get_selected = this.get_checked;

            this.get_container()
                .bind("open_node.jstree create_node.jstree clean_node.jstree", $.proxy(function (e, data) {
                        this._prepare_checkboxes(data.rslt.obj);
                    }, this))
                .bind("loaded.jstree", $.proxy(function (e) {
                        this._prepare_checkboxes();
                    }, this))
                .delegate("ins.jstree-checkbox", "click.jstree", $.proxy(function (e) {
                        if(this._get_node(e.target).hasClass("jstree-checked")) { this.uncheck_node(e.target); }
                        else { this.check_node(e.target); }
                        e.preventDefault();
                    }, this));
        },
        __destroy : function () {
            this.get_container().find(".jstree-checkbox").remove();
        },
        _fn : {
            _prepare_checkboxes : function (obj) {
                obj = !obj || obj == -1 ? this.get_container() : this._get_node(obj);
                var c, _this = this, t;
                obj.each(function () {
                    t = $(this);
                    c = t.is("li") && t.hasClass("jstree-checked") ? "jstree-checked" : "jstree-unchecked";
                    t.find("a").not(":has(.jstree-checkbox)").prepend("<ins class='jstree-checkbox'>&#160;</ins>").parent().not(".jstree-checked, .jstree-unchecked").addClass(c);
                });
                if(obj.is("li")) { this._repair_state(obj); }
                else { obj.find("> ul > li").each(function () { _this._repair_state(this); }); }
            },
            change_state : function (obj, state) {
                obj = this._get_node(obj);
                state = (state === false || state === true) ? state : obj.hasClass("jstree-checked");
                if (obj)
                {
                    if (state) { obj.removeClass("jstree-checked jstree-undetermined").addClass("jstree-unchecked"); }
                    else { obj.removeClass("jstree-unchecked jstree-undetermined").addClass("jstree-checked"); }
                }
                this.__callback(obj);
            },
            check_node : function (obj) {
                this.change_state(obj, false);
            },
            uncheck_node : function (obj) {
                this.change_state(obj, true);
            },

            is_checked : function(obj) {
                obj = this._get_node(obj);
                return obj.length ? obj.is(".jstree-checked") : false;
            },
            get_checked : function (obj) {
                obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);
                return obj.find("> ul > .jstree-checked, .jstree-undetermined > ul > .jstree-checked");
            },
            get_unchecked : function (obj) {
                obj = !obj || obj === -1 ? this.get_container() : this._get_node(obj);
                return obj.find("> ul > .jstree-unchecked, .jstree-undetermined > ul > .jstree-unchecked");
            },

            show_checkboxes : function () { this.get_container().children("ul").removeClass("jstree-no-checkboxes"); },
            hide_checkboxes : function () { this.get_container().children("ul").addClass("jstree-no-checkboxes"); },

            _repair_state : function (obj) {
                obj = this._get_node(obj);
                if(!obj.length) { return; }
                var a = obj.find("> ul > .jstree-checked").length,
                    b = obj.find("> ul > .jstree-undetermined").length,
                    c = obj.find("> ul > li").length;

                if(c === 0) { if(obj.hasClass("jstree-undetermined")) { this.check_node(obj); } }
                else if(a === 0 && b === 0) { this.uncheck_node(obj); }
                else if(a === c) { this.check_node(obj); }
                else {
                    obj.parentsUntil(".jstree","li").removeClass("jstree-checked jstree-unchecked").addClass("jstree-undetermined");
                }
            },
            reselect : function () {
                if(this.data.ui) {
                    var _this = this,
                        s = this.data.ui.to_select;
                    s = $.map($.makeArray(s), function (n) { return "#" + n.toString().replace(/^#/,"").replace('\\/','/').replace('/','\\/'); });
                    this.deselect_all();
                    $.each(s, function (i, val) { _this.check_node(val); });
                    this.__callback();
                }
            }
        }
    });
})(jQuery);
//*/

Не уверен, что обкромсал всё до конца, но вроде работает.

Комментарии (1)
Vidogs
16 января 2011, 17:40
S Q #1
Проще было с нуля написать
Проще было с нуля написать :-\
Добавить комментарий
Войдите через  Доступные тэги: <b>, <i>, <s>, <u>, <a href="">, <img src="" /> (загрузить), <pre>, <quote>
Теги
1nsk Alternative E-Business Embedded GNU/GPL-софт HTML/CSS ICQ KDE last.fm Linux Linuxnsk Live Lyceum game Microsoft Motivator MySQL New Age P2P Party Photoshop PHP Python Qt4/C++ SEO Sibnet thelogin.ru Timelapse Web 2.0 Webdev Webstream Windows Wireless А я говорил! Авто Админ Алексеев Аниме Атмосфера Безобразие Бесплатный Wi-Fi Блоги Большой бизнес Боты Бред Бухать Бытовуха Велосипед Весна Вечер Взлом Винил Винтаж Вконтакте Вода Воспоминания Гетто Гламур Гопота Горский Графити Грузовик Дача Двор Девушки Девченки!!! Деньги Дизайн Дом Домофоны Драка Драки Еда Железо Животные Заведения общественного отдыха Задроты Затулинка Зима Игрушки Игры Идея Интересно Интернет Исследование История Казань Карикатура Квартира Класс Компьютеры Коромшук Коты КПК Кран Красиво Криминал Крыша Курение Лето Литература Лицей Лицей НГТУ Лохи Магнитофоны Маркса Мат Математика Машинный перевод Мегафон Менты Метро Мечты Мифы Мне стыдно Мобайл Можга МТС Музыка Мультикасса Мультики Мы помним Надписи Наука НГТУ Недвижимость Непоняятно Новосибирск Носители Ноутбуки Ночь Обидно Обман Образование Общественный транспорт Омск Опечатки Орфография Осень Парк Периферия Пиратство Плохо Погода Поезд Помойка Праздники Презрение Природа Провайдеры Программирование Протест Радиотехника Растения Реклама Религия и вера Ретро Рисунок Руины Рэп Салют Сервер Серверы Сервис Сериалы Скринкаст Скриншоты Смешно СМИ Снег Собаки Совет Софт Спам Спасём Россию Спецтранспорт Стоп-ляп Стройка Студяга Танцы ТВ Типа страх Трамваи Транс Транспорт Уважаю Ужас Умный дом Утро Филдрепорты Философия Форум ФПМИ Хикки Хостинг Цитатник Школа Школа 208 ЭГ Эксперимент Юго-Западный
Twitter 16-01-2011
Lorem Ipsum
Иткина Национальный Банк, Шурина ЭлектроПроигрыватель
Lorem Ipsum
Холли как пара? Это наше дерьмо! viebivalsia вы - я дал мой кот! Вы сидите на пне - заключается в обеспечении газонокосилка! А вот Дик, так что менее уродливыми проститутками! Хм? Uebok! , Дима, ебать, ебать на дороге! Как веб, сука!
Lorem Ipsum
блядь ну пиздец же! :D
Lorem Ipsum
Учитель: Коноплев почему у тебя фамилия наркоманская? Ученик: Незнаю Кумар Гашишевич
Lorem Ipsum
Мои родители, судя по тому что я слышу с кухни, тоже упоротые :-\
Lorem Ipsum
(17:42:13) vb: нам до вс надо сделать админку 100% я еще пока не егаю в панике тока потому что они еще с праздников не вышли, но в пн уже выйдут
Lorem Ipsum
РУТЫ ОТ ДЕСЯТИ СЕРВЕРОВ, А Я ТУТ ТАКОЕ ТВОРЮ! Закладываю архитектуру проекта, мне страшно :-D
Lorem Ipsum
Бля, я опять забыл выйти из тела и поиграть в тетрис:(
Lorem Ipsum
ГДЕ Ж ТЫ БЫЛ САНЯ ТУТ БЕЗ ТЕБЯ ТАКОЕ БЛЯ БУДУ