jquery - 分段进度条(jQuery UI)

标签 jquery jquery-ui user-interface progress-bar progress

我正在尝试将 jQuery UI 进度条分成几个部分。

有人知道我该怎么做吗?

示例:(2 - 视觉设计:03 http://wiki.jqueryui.com/w/page/12138028/Progressbar )

(我目前正在使用背景图像,但这不实用。)

最佳答案

这是我正在制作的原型(prototype)......

CSS:

div { margin:10px 10px 0px 10px; height:24px; }
div.progressContainer { clear:both; display:block; }
label { float:left; width:200px; display:block; }
input { float:left; width:100px; text-align:center; display:inline; }
input[type=button] { margin-right:1.5px; }

HTML:

<!-- Options -->
<div> <!-- Maximum -->
    <label> Maximum ProgressBar Value </label>
    <input id="max" type="text" value="100" />
</div>
<div> <!-- Initial Value -->
    <label> Initial Value </label>
    <input id="val" type="text" value="43" />
</div>
<div> <!-- Width -->
    <label> ProgressBar Width </label>
    <input id="width" type="text" value="304" />
</div>
<div> <!-- Height -->
    <label> ProgressBar Height </label>
    <input id="height" type="text" value="30" />
</div>
<div> <!-- Multiply -->
    <label> Segmented ProgressBar </label>
    <input id="seg" type="text" value="4" />
</div>
<!-- Create ProgressBar by given options -->
<div>
    <input type="button" value="Create" />
</div>
<!-- ProgressBar Container -->
<div class="progressContainer"> </div>
<!-- Action Buttons -->
<div>
    <input type="button" value="Start" /> <input type="button" value="Stop" /> <input type="button" value="Reset" />
</div>

jQuery:

var i; // Define a global counter
var tmr; // Define timer

// Create Function
function create() {
    var max = parseInt($("input#max").val(),10),
        val = parseInt($("input#val").val(),10),
        seg = parseInt($("input#seg").val(),10),
        width = parseInt($("input#width").val(),10),
        height = parseInt($("input#height").val(),10);
    $(".progressContainer").empty().height(height).width(width);
    // Get size for each progressbar
    var size = max / seg;
    // Get width for each progressbar
    // -2 for left/right borders of progressbars
    // -1 for margin-right
    // = -3px each of their width to fit exact location
    width = (width / seg) - 3;
    for(i=0; i<seg; i++) {
        // Create segmented progressbars
        $(".progressContainer").append(
            '<div class="progress' + i + '"></div>');
        // Add their size
        $(".progress" + i).progressbar({
            max: size, value: 0
        }).css({
            margin: '0 1px 0 0',
            width: width,
            height: height,
            float:'left'
        });
    }
    // Get initial value
    var init = val;
    if (init < size) {
        // if smaller than size
        // than only 1 bar gonna get filled
        $(".progress0").progressbar({ value: init });
    } else if (init > size) {
        // else calgulate how many bars
        // gonna be effected
        var bars = Math.floor(init / size);
        for(i=0; i<bars; i++) {
            init = Math.abs(init - size);
            $(".progress" + i).progressbar({ value: size });
        }
        // fill the value left to the last bar
        $(".progress" + i).progressbar({ value: init });
    }
    // Now get the hell out of here!
}

function inc() {
    // Define required values
    var max = parseInt($("input#max").val(),10),
        seg = parseInt($("input#seg").val(),10),
        val = parseInt($("input#val").val(),10);
    // Get size for each progressbar
    var size = max / seg;
    // Get initial value
    var init = val;
    var next = val + 1;
    // If progress is at max then reset it
    if (init >= max) {
        init = 1;
        next = 1;
        for (i=0;i<seg;i++) {
            $(".progress" + i).progressbar({ value: 0 });
        }
    }
    if (init < size) {
        // if smaller than size
        // than only 1 bar gonna get filled
        $(".progress0").progressbar({ value: init });
    } else if (init > size) {
        // else calgulate how many bars
        // gonna be effected
        var bars = Math.floor(init / size);
        for(i=0; i<bars; i++) {
            init = Math.abs(init - size);
            $(".progress" + i).progressbar({ value: size });
        }
        // fill the value left to the last bar
        // +1 here is just for making bar look fullfilled
        $(".progress" + i).progressbar({ value: init + 1});
    }
    // Next value
    $("input#val").val(next);
    // Loop
    tmr = setTimeout(inc, 1000);
    // Now get the hell out of here!
}

// Start Function
function start() {
    // Set's interval to timer and starts
    tmr = setTimeout(inc, 1000);
    // Now get the hell out of here!
}

// Stop Function
function stop() {
    // Stops the timer
    clearTimeout(tmr);
    // Now get the hell out of here!
}

// Reset Function
function reset() {
    var seg =  parseInt($("input#seg").val(),10);
    // For segmented bars
    $("input#val").val(0);
    // Get initial value
    for(i=0; i<seg; i++) {
        $(".progress" + i).progressbar({ value: 0 });
    }
    // Now get the hell out of here!
}

// Validate Function
function validate(element) {
    var obj = $(element);
    if(!/[0-9]$/.test(obj.val())) {
        // Invalid
        obj.css('box-shadow', '0px 0px 8px #FAC3C3');
        if(!obj.next().hasClass('error'))
        { obj.after('<span class="error error-keyup-1">Please use numbers only</span>'); }
    } else {
        // Valid
        obj.css('box-shadow', '0px 0px 8px lightgreen');
        if(obj.next().hasClass('error'))
        { obj.next().remove(); }
    }
    // Now get the hell out of here!
}

// Document Ready
$(document).ready(function(){
    // Validate Inputs
    $("input[type=text]").each(function() {
        $(this).keyup(function(){
            validate(this);
            $(this).focusout(function() {
                $(this).css('box-shadow', '0px 0px 0px #ffffff');
            });
        });
    });
    // Action Buttons
    $("input[type=button]").each(function() {
        // alert($(this).val());
        $(this).click(function(){
            if ($(this).val() == "Create") { create(); }
            if ($(this).val() == "Start") { start(); }
            if ($(this).val() == "Stop") { stop(); }
            if ($(this).val() == "Reset") { reset(); }
        });
    });
    // Now get the hell out of here!
});

jsfiddle:http://jsfiddle.net/BerkerYuceer/QZMMx/

关于jquery - 分段进度条(jQuery UI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13623987/

相关文章:

javascript - jquery datatable - 将 jquery UI 模式放置在所选记录下方

jquery-ui - 为什么单击拖动 handle 不会窃取文本焦点?

javascript - Jquery 附加到(按 id 动态)

jquery - Jquery UI 可选的自定义验证

python - 动态缩进和突出显示 tkinter 文本框中的单词

javascript - "Swapping"AngularJS 中的 div 和数据

winforms - 编码自动 UITest + Windows 窗体 + Exe 文件?

javascript - 如何使打印字符与声音同步?

javascript - 使用 JS 和 jQuery 搜索 HTML 表格

javascript - 使用 jQuery 将超大的 Div 元素居中