February 10, 2013

  • 年廿九晚同年初一朝頭早就係整D咁既野=.=
    唔錯唔錯,加深左jQuery DOM traversal 既實戰經驗

    ==

    add完row同block之後,禁gen json,然後開console睇下result 呢個object
    不過仲有少少問題,應該限制user如果揀not既話唔可以有多過一條expression起入

    <!DOCTYPE html>
    <html>
    <head>
    <style>
    td{
    vertical-align: middle;
    }
    td.left{
    border-left: solid 1px;
    }
    </style>
    </head>
    <body>
    <input type = "button" value = 'genjson' onclick = 'genjson()' />
    </body>
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script>
    var logic = ['and','or','not'];
    var column = ['Column A','Column B','Column C'];
    var operator = ['<','=','>'];
    var value = [1,2,3];
    function genRow(){
    var row = '<span class = "exp expline"><select class = "col">';
    for (var i = 0; i < column.length; i++){
    row = row + '<option>' + column[i] + '</option>';
    }
    row = row + '</select><select class = "op">';
    for (var i = 0; i < operator.length; i++){
    row = row + '<option>' + operator[i] + '</option>';
    }
    row = row + '</select><select class = "value">';
    for (var i = 0; i < value.length; i++){
    row = row + '<option>' + value[i] + '</option>';
    }
    row = row + '<input type = "button" value = "remove row" onclick = "removeRow(this)"; />';
    row = row + '</select><br /></span>';
    return row;
    }
    function genLogic(){
    var row = '<span><select class = "logic">';
    for (var i = 0; i < logic.length; i++){
    row = row + '<option>' + logic[i] + '</option>';
    }
    row = row + '</select><br /><input type = "button" value = "remove block" onclick = "removeBlock(this)"; /></span>';
    return row;
    }
    function genAddRowBut(){
    var but = '<input type = "button" value = "add row" onclick = "addRow(this)" />';
    return but;
    }
    function genAddBlockBut(){
    var but = '<input type = "button" value = "add block" onclick = "addBlock(this,true)" />';
    return but;
    }
    function addRow(that){
    $(genRow()).insertBefore(that);
    }
    function addBlock(that,flag){
    if (flag) that = $(that).parent();
    $(that).append('<table class="exp expblock"><tr><td>'+genLogic()+'</td><td class = "left">'+genRow()+genAddRowBut()+genAddBlockBut()+'</td></tr></table>');
    }
    function removeRow(that){
    $(that).parent().remove();
    }
    function removeBlock(that){
    $(that).closest('table').remove();
    }
    function genjson(){
    $('span.expline').each(function(){$(this).attr('exp',genexp($(this)));});
    var i = 0;
    $('.expblock').each(function(){$(this).attr('order',i++)});
    for (i--;i>=0;i--){
    var current = $('.expblock[order='+i+']');
    $(current).attr('exp',genblockexp(current));
    }
    result = jQuery.parseJSON($('.expblock[order="0"]').attr('exp'));
    }
    function genblockexp(self){
    var counter = 0;
    var expJSONlist = [];
    var expObjlist = [];
    var logic = $(self).find('.logic').first().val();
    alert(logic);
    var firstexp = $(self).find('.exp').first();
    $(firstexp).siblings('.exp').andSelf().each(function(){
    alert($(this).attr('exp'));
    expJSONlist[counter] = $(this).attr('exp');
    $(this).css('border','solid red');
    expObjlist[counter] = jQuery.parseJSON($(this).attr('exp'));
    counter++;
    });
    expObjlist[counter] = logic;
    return JSON.stringify(expObjlist);
    }
    function genexp(self){
    var col = $(self).children('.col').val();
    var op = $(self).children('.op').val();
    var value = $(self).children('.value').val();
    var exp = {};
    exp.col = col; exp.op = op; exp.value = value;
    $(self).attr('exp',JSON.stringify(exp));

    }
    (function(){
    addBlock($('body'))
    }());
    </script>
    </html>

     

Recent Posts

Recent Comments

Categories