7 марта 2012 г.

Виджет представления упакованных булевых значений на javascript

В продолжении темы упакованных булевых значений предлагаю свое решение на Javascript.

Общая идея в том, что в базе данных хранится только целое число и, соответственно, в интерфейс оно будет выводиться как input:text или input:hidden. Мы его скрываем и заменяем на представление из соответствий в виде чекбоксов.

Ниже пример и сам скрипт.

Пример:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Packaged Boolean Values</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">

$.fn.boolpack = function (theData) {
    var accum = 0;
    var valInput = $(this);
    var data = theData || [
        {'value': 1,    'labelText': 'Value 1'},
        {'value': 2,    'labelText': 'Value 2'},
        {'value': 4,    'labelText': 'Value 4'},
        {'value': 8,    'labelText': 'Value 8'},
        {'value': 16,   'labelText': 'Value 16'},
        {'value': 32,   'labelText': 'Value 32'},
        {'value': 64,   'labelText': 'Value 64'},
        {'value': 128,  'labelText': 'Value 128'},
        {'value': 256,  'labelText': 'Value 256'},
        {'value': 512,  'labelText': 'Value 512'},
        {'value': 1024, 'labelText': 'Value 1024'}
    ];
    
    var buildCheckboxes = function () {
        var newHtml = '<ul id="boolpack-values-set">';
        for (var i in data) {
            newHtml += '<li><input type="checkbox" id="boolpack-value-';
            newHtml += data[i].value + '" value="';
            newHtml += data[i].value + '"><label for="boolpack-value-';
            newHtml += data[i].value + '">'
            newHtml += data[i].labelText + '</label></li>';
        }
        newHtml += '</ul>';
        return newHtml;
    }
    
    var calcAccum = function () {
        $('#boolpack-values-set input:checked').each( function () {
            var v = parseInt( $(this).val() );
            accum = accum | (v || 0);
        });
    }
    
    var __init__ = function () {
        valInput.hide().parent().append( buildCheckboxes() ).ready( function () {
            $('#boolpack-values-set input:checkbox').click( function () {
                accum = 0;
                calcAccum();
                valInput.val(accum);
                console.log(valInput.val());
            });
            
            calcAccum();
        });
    }
    
    __init__();
    
}

$(document).ready( function () {
    $('#text-field').boolpack();
});
</script>
</head>
<body>
    <h1>Packaged Boolean Values</h1>
    <p>Paragraph before</p>
    <p><input id="text-field" type="text" style="width:30px;" value="0" disabled="true" /></p>
    <p>Paragraph after</p>
</body>
</html>

Скрипт:

/**
 * jQuery-plugin for packaged boolean values.
 * 
 * Usage: $(document).ready( function () { $(inputFieldSelector).boolpack(); });
 * 
 * Required: jQuery 1.4 or higher
 * 
 * Author: piksel@mail.ru
 */

$.fn.boolpack = function (theData) {
    var accum = 0;
    var valInput = $(this);
    var data = theData || [
        {'value': 1,    'labelText': 'Example value 1'},
        {'value': 2,    'labelText': 'Example value 2'},
        {'value': 4,    'labelText': 'Example value 4'},
        {'value': 8,    'labelText': 'Example value 8'},
        {'value': 16,   'labelText': 'Example value 16'},
        {'value': 32,   'labelText': 'Example value 32'}
    ];
    
    var buildCheckboxes = function () {
        var newHtml = '<ul id="boolpack-values-set">';
        for (var i in data) {
            newHtml += '<li><input type="checkbox" id="boolpack-value-';
            newHtml += data[i].value + '" value="';
            newHtml += data[i].value + '"><label for="boolpack-value-';
            newHtml += data[i].value + '">'
            newHtml += data[i].labelText + '</label></li>';
        }
        newHtml += '</ul>';
        return newHtml;
    }
    
    var calcAccum = function () {
        $('#boolpack-values-set input:checked').each( function () {
            var v = parseInt( $(this).val() ) || 0;
            accum = accum | (v || 0);
        });
    }
    
    var __init__ = function () {
        valInput.hide().parent().append( buildCheckboxes() ).ready( function () {
            $('#boolpack-values-set input:checkbox').click( function () {
                accum = 0;
                calcAccum();
                valInput.val(accum);
            });
            
            calcAccum();
        });
    }
    
    __init__();
    
}

2 комментария:

Владимир Игнатьев комментирует...

А вставьте пример виджета прямо в страницу! Это же... прикольно?

Иван комментирует...

Не знаю, наверное... Но движок этого блога почему-то не пропускает (по-крайней мере раньше не пропускал) тэг [script]. Может я что-то путаю...

Отправить комментарий