You are viewing limited content. For full access, please sign in.

Question

Question

Form JS taking extremely long to load

asked on February 24, 2016

Hello everyone,

 

I noticed that my JS is taking over 15 seconds (at it's fastest) to load on my form. I am fairly new to JS and was wondering if someone could take a quick look and see if I am making some obvious mistakes that are causing this to take so long.

Thank you in advance to anyone who takes a look or makes an attempt!

 

/////////////////Auto Generate Tables for each section////////////////////////
// eiTables.js version 2.0.6
function eiTables() {
    this.self = this;
    self.workers = [];
    var rows = [];
    var fieldReplace = function(source, field, row) {
        var temp = $(field).html();
        if (temp !== undefined) {
            if (source['Fields'] !== undefined) {
                source['Fields'].forEach(function(item, idx) {
                    if (item !== null) {
                        if ((row) && (row.constructor === Array) &&
                            (row[idx] !== undefined)) {
                            if (row[idx] !== "") {
                                temp = temp.replace("%" + item +
                                    "%", row[idx]);
                            }
                        }
                    }
                });
                $(field).html(temp);
            }
        }
    }
    var resizeTable = function(selector, newSize) {
        var oldSize = $(selector + " tbody tr").length;
        if (newSize > oldSize) {
            for (i = 0; i < newSize - oldSize; i++) {
                $(selector + " a.cf-table-add-row").click();
            }
        } else if (newSize < oldSize) {
            for (i = 0; i < oldSize - newSize; i++) {
                $(selector + " span.form-del-field").last().click();
            }
        }
    }
    var resizeCollection = function(selector, newSize) {
        var oldSize = $(selector + " .rpx").length;
        if (newSize > oldSize) {
            for (i = 0; i < newSize - oldSize; i++) {
                $(selector + " a.cf-collection-append").click();
            }
        } else if (newSize < oldSize) {
            for (i = 0; i < oldSize - newSize; i++) {
                $(selector + " span.cf-collection-delete").last().click();
            }
        }
    }
    var popoluteTarget = function(target, source, data) {
        if (target['Type'] === "collection") {
            resizeCollection(target['Selector'], data.length);
            var blocks = $(target['Selector'] + " .rpx");
            rows.forEach(function(row, index) {
                $(blocks.get(index)).find(
                    ":input[id], .eiField").each(function(
                    idx, item) {
                    if ($(item).hasClass("eiField")) {
                        fieldReplace(source, item, row);
                    } else {
                        $(item).val(row[idx]);
                    }
                });
            });
        } else if (target['Type'] === "table") {
            resizeTable(target['Selector'], data.length);
            var blocks = $(target['Selector'] + " tbody tr");
            rows.forEach(function(row, index) {
                $(blocks.get(index)).find(
                    ":input[id], .eiField").each(function(
                    idx, item) {
                    if ($(item).hasClass("eiField")) {
                        fieldReplace(source, item, row);
                    } else {
                        $(item).val(row[idx]);
                    }
                });
            });
        } else if (target['Type'] === "text") {
            if (target.master === undefined) {
                target.master = $(target['Selector']).html();
            } else {
                $(target['Selector']).html(target.master);
            }
            fieldReplace(source, target['Selector'], rows[0]);
        }
    }
    var extractSource = function(source) {
        rows = [];
        if (source['Type'] === "dropdown") {
            $(source['Selector'] + " option").each(function(idx, item) {
                if ((item.value === "") && (source[
                    'IgnoreBlank'] === true)) {} else {
                    if (source['SplitOn'] === undefined) {
                        rows.push(item.value);
                    } else {
                        row = []
                        item.value.split(source['SplitOn']).forEach(
                            function(item) {
                                row.push(item);
                            });
                        rows.push(row);
                    }
                }
            });
        } else if (source['Type'] === "text") {
            $(source['Selector']).val().split("\n").forEach(function(
                item) {
                if ((item.value === "") && (source[
                    'IgnoreBlank'] === true)) {} else {
                    if (source['SplitOn'] === undefined) {
                        rows.push(item.value);
                    } else {
                        row = []
                        item.value.split(source['SplitOn']).forEach(
                            function(item) {
                                row.push(item);
                            });
                        rows.push(row);
                    }
                }
            });
        } else if (source['Type'] === "fields") {
            var row = [];
            $(source['Selector']).find("input").each(function(idx, item) {
                row.push($(item).val());
            });
            rows.push(row);
        }
        return rows;
    }
    var executeWorker = function(worker) {
        var rows = extractSource(worker['Source']);
        if (worker['Target'].constructor === Array) {
            worker['Target'].forEach(function(item) {
                popoluteTarget(item, worker['Source'], rows);
            });
        } else {
            popoluteTarget(worker['Target'], worker['Source'], rows);
        }
    };
    var changeTrigger = function() {
        self.workers.forEach(function(worker) {
            if (worker['Trigger']['Type'] === "change") {
                executeWorker(worker);
            }
        });
    };
    var ajaxTrigger = function() {
        self.workers.forEach(function(worker) {
            if (worker['Trigger']['Type'] === "ajax") {
                executeWorker(worker);
            }
        });
    };
    this.create = function(workerdef) {
        self.workers.push(workerdef);
        if (workerdef['Trigger']['Type'] === "ajax") {
            $(document).bind("ajaxComplete", ajaxTrigger);
        } else if (workerdef['Trigger']['Type'] === "change") {
            $(workerdef['Trigger']['Selector']).bind("change",
                changeTrigger);
        }
    };
}
eiTables.prototype['create'] = eiTables.prototype.create;
$ei = new eiTables();
$ei2 = new eiTables();
$ei3 = new eiTables();
$ei4 = new eiTables();
$ei5 = new eiTables();
$ei6 = new eiTables();
$ei7 = new eiTables();
$ei8 = new eiTables();
$ei9 = new eiTables();
//////////////// On Change of each Table and Field/////////////////
$(document).ready(function() {
    $(document).on('blur change', '#q3 input', autofill);
    $('#q10.cf-table-block').on('blur', 'input', avg1);
    $('#q43.cf-table-block').on('blur', 'input', avg2);
    $('#q51.cf-table-block').on('blur', 'input', avg3);
    $('#q59.cf-table-block').on('blur', 'input', avg4);
    $('#q67.cf-table-block').on('blur', 'input', avg5);
    $('#q75.cf-table-block').on('blur', 'input', avg6);
    $('#q83.cf-table-block').on('blur', 'input', avg7);
    $('#q92.cf-table-block').on('blur', 'input', avg8);
    $('#q101.cf-table-block').on('blur', 'input', avg9);
    $('.cf-table-block').on('blur', 'input', subAvg);
    $(document).ajaxComplete(function() {
        if ($('#q97 option').text() === '') {
            $(".janitor2").hide();
        } else {
            $(".janitor2").show();
        }
        if ($('#q88 option').text() === '') {
            $(".pink2").hide();
        } else {
            $(".pink2").show();
        }
        if ($('#q79 option').text() === '') {
            $(".van2").hide();
        } else {
            $(".van2").show();
        } 
       
});
////////////////////////Hide Buttons not relevant to a Program/////////////////
toggleFields(); //call this first so we start out with the correct visibility depending on the selected form values
//this will call our toggleFields function every time the selection value of our underAge field changes
$("#q3").change(function() {
    toggleFields();
});
//this toggles the visibility of our parent permission fields depending on the current selected value of the underAge field
function toggleFields() {
    if ($(".program option:selected").text() == 'Quille') $("#q114").show();
    else $("#q114").hide();
}

function autofill() {
        $('.autofill').trigger('click');
    }
    //////////////////Hide Sections of Form until a Program is selected/////////////////
toggleForm(); //call this first so we start out with the correct visibility depending on the selected form values
//this will call our toggleFields function every time the selection value of our underAge field changes
$("#q3").change(function() {
    toggleForm();
});
//this toggles the visibility of our parent permission fields depending on the current selected value of the underAge field
function toggleForm() {
        if ($(".program option:selected").text() === '') $(
            "#q26, #q113, .living2, .computer2, .laundry2, .bathroom2, .kitchen2, .bedrooms2, .van2, .pink2, .janitor2"
        ).hide();
        else $(
            "#q26, #q113, .living2, .computer2, .laundry2, .bathroom2, .kitchen2, .bedrooms2, .van2, .pink2, .janitor2"
        ).show();
    }
    //////////////////////// Fill table elements based on Button Clicked/////////////////
$('#q3').change(autofill);
$ei.create({
    Trigger: {
        Type: "ajax"
    },
    Source: {
        //source field
        Selector: "#q37",
        SplitOn: "+",
        IgnoreBlank: true,
        Type: "dropdown",
        Fields: ["LR_Comp"]
    },
    Target: {
        //Target cf-block
        Selector: "#q10",
        Type: "table",
    },
});
$ei2.create({
    Trigger: {
        Type: "ajax"
    },
    Source: {
        //source field
        Selector: "#q39",
        SplitOn: "+",
        IgnoreBlank: true,
        Type: "dropdown",
        Fields: ["PC_Comp"]
    },
    Target: {
        //Target cf-block
        Selector: "#q43",
        Type: "table",
    },
});
$ei3.create({
    Trigger: {
        Type: "ajax"
    },
    Source: {
        //source field
        Selector: "#q47",
        SplitOn: "+",
        IgnoreBlank: true,
        Type: "dropdown",
        Fields: ["Laundry_Comp"]
    },
    Target: {
        //Target cf-block
        Selector: "#q51",
        Type: "table",
    },
});
$ei4.create({
    Trigger: {
        Type: "ajax"
    },
    Source: {
        //source field
        Selector: "#q55",
        SplitOn: "+",
        IgnoreBlank: true,
        Type: "dropdown",
        Fields: ["Bath_Comp"]
    },
    Target: {
        //Target cf-block
        Selector: "#q59",
        Type: "table",
    },
});
$ei5.create({
    Trigger: {
        Type: "ajax"
    },
    Source: {
        //source field
        Selector: "#q63",
        SplitOn: "+",
        IgnoreBlank: true,
        Type: "dropdown",
        Fields: ["Kitchen_Comp"]
    },
    Target: {
        //Target cf-block
        Selector: "#q67",
        Type: "table",
    },
});
$ei6.create({
    Trigger: {
        Type: "ajax"
    },
    Source: {
        //source field
        Selector: "#q71",
        SplitOn: "+",
        IgnoreBlank: true,
        Type: "dropdown",
        Fields: ["Bed_Comp"]
    },
    Target: {
        //Target cf-block
        Selector: "#q75",
        Type: "table",
    },
});
$ei7.create({
    Trigger: {
        Type: "ajax"
    },
    Source: {
        //source field
        Selector: "#q79",
        SplitOn: "+",
        IgnoreBlank: true,
        Type: "dropdown",
        Fields: ["Van_Comp"]
    },
    Target: {
        //Target cf-block
        Selector: "#q83",
        Type: "table",
    },
});
$ei8.create({
    Trigger: {
        Type: "ajax"
    },
    Source: {
        //source field
        Selector: "#q88",
        SplitOn: "+",
        IgnoreBlank: true,
        Type: "dropdown",
        Fields: ["Pink_Comp"]
    },
    Target: {
        //Target cf-block
        Selector: "#q92",
        Type: "table",
    },
});
$ei9.create({
    Trigger: {
        Type: "ajax"
    },
    Source: {
        //source field
        Selector: "#q97",
        SplitOn: "+",
        IgnoreBlank: true,
        Type: "dropdown",
        Fields: ["Janitor_Comp"]
    },
    Target: {
        //Target cf-block
        Selector: "#q101",
        Type: "table",
    },
});
///////////////////Buttons for Each Section and Next Section Buttons///////////////////////////
var section1 = $('.section1 h1:first').text();
var section2 = $('.section2 h1:first').text();
var section3 = $('.section3 h1:first').text();
var section4 = $('.section4 h1:first').text();
var section5 = $('.section5 h1:first').text();
var section6 = $('.section6 h1:first').text();
var section7 = $('.section7 h1:first').text();
var section8 = $('.section8 h1:first').text();
var section9 = $('.section9 h1:first').text();
$('<div class="navbar"><div class="navitem living2">' + section1 +
    '</div><div class="navitem computer2">' + section2 +
    '</div><div class="navitem laundry2">' + section3 +
    '</div><div class="navitem bathroom2">' + section4 +
    '</div><div class="navitem kitchen2">' + section5 +
    '</div><div class="navitem bedrooms2">' + section6 +
    '</div><div class="navitem van2">' + section7 +
    '</div><div class="navitem pink2">' + section8 +
    '</div><div class="navitem janitor2">' + section9 + '</div></div>').insertBefore(
    '#q26');
$('<input class="navitem computer2" value="Next: ' + section2 +
    '" type="button">').appendTo('.section1');
$('<input class="navitem laundry2" value="Next: ' + section3 +
    '" type="button">').appendTo('.section2');
$('<input class="navitem bathroom2" value="Next: ' + section4 +
    '" type="button">').appendTo('.section3');
$('<input class="navitem kitchen2" value="Next: ' + section5 +
    '" type="button">').appendTo('.section4');
$('<input class="navitem bedrooms2" value="Next: ' + section6 +
    '" type="button">').appendTo('.section5');
$('<input class="navitem van2" value="Next: ' + section7 + '" type="button">').appendTo(
    '.section6');
$('<input class="navitem pink2" value="Next: ' + section8 + '" type="button">')
    .appendTo('.section7');
$('<input class="navitem janitor2" value="Next: ' + section9 +
    '" type="button">').appendTo('.section8');
$('.navitem').on('touchstart click', function() {
    $(
        '.section1, .section2, .section3, .section4, .section5, .section6, .section7, .section8, .section9'
    ).hide();
    $('.navbar').find('.navitem').removeClass('selected');
    if ($(this).hasClass('living2')) {
        $('.section1').show();
        $('.navbar').find('.living2').addClass('selected');
    } else if ($(this).hasClass('computer2')) {
        $('.section2').show();
        $('.navbar').find('.computer2').addClass('selected');
    } else if ($(this).hasClass('laundry2')) {
        $('.section3').show();
        $('.navbar').find('.laundry2').addClass('selected');
    } else if ($(this).hasClass('bathroom2')) {
        $(".section4").show();
        $('.navbar').find('.bathroom2').addClass('selected');
    } else if ($(this).hasClass('kitchen2')) {
        $(".section5").show();
        $('.navbar').find('.kitchen2').addClass('selected');
    } else if ($(this).hasClass('bedrooms2')) {
        $(".section6").show();
        $('.navbar').find('.bedrooms2').addClass('selected');
    } else if ($(this).hasClass('van2')) {
        $(".section7").show();
        $('.navbar').find('.van2').addClass('selected');
    } else if ($(this).hasClass('pink2')) {
        $(".section8").show();
        $('.navbar').find('.pink2').addClass('selected');
    } else if ($(this).hasClass('janitor2')) {
        $(".section9").show();
        $('.navbar').find('.janitor2').addClass('selected');
    }
})
$('.navitem.living2').trigger('click');
});
////////////////////Addition and Average of Tables//////////////////
function avg1() {
    var sum = 0;
    $('#q10.cf-table-block tbody tr').each(function() {
        var s = 0;
        var q = 0;
        var r = 0;
        $(this).find('.livingscore input').each(function() {
            s += parseNumber($(this).val());
            $(this).val(s);
        });
        //$(this).find('.subtotal input').val((s).toFixed(2));
        sum += s;
        //$('.priority option').text('Urgent');
    });
    sum = sum / ($('#q10.cf-table-block tr').length - 1);
    $('.total1 input').val(sum.toFixed(2));
}

function avg2() {
    var sum = 0;
    $('#q43.cf-table-block tbody tr').each(function() {
        var s = 0;
        var q = 0;
        var r = 0;
        $(this).find('.pcscore input').each(function() {
            s += parseNumber($(this).val());
            $(this).val(s);
        });
        //$(this).find('.subtotal input').val((s).toFixed(2));
        sum += s;
        //$('.priority option').text('Urgent');
    });
    sum = sum / ($('#q43.cf-table-block tr').length - 1);
    $('.total2 input').val(sum.toFixed(2));
}

function avg3() {
    var sum = 0;
    $('#q51.cf-table-block tbody tr').each(function() {
        var s = 0;
        var q = 0;
        var r = 0;
        $(this).find('.laundryscore input').each(function() {
            s += parseNumber($(this).val());
            $(this).val(s);
        });
        //$(this).find('.subtotal input').val((s).toFixed(2));
        sum += s;
        //$('.priority option').text('Urgent');
    });
    sum = sum / ($('#q51.cf-table-block tr').length - 1);
    $('.total3 input').val(sum.toFixed(2));
}

function avg4() {
    var sum = 0;
    $('#q59.cf-table-block tbody tr').each(function() {
        var s = 0;
        var q = 0;
        var r = 0;
        $(this).find('.bathscore input').each(function() {
            s += parseNumber($(this).val());
            $(this).val(s);
        });
        //$(this).find('.subtotal input').val((s).toFixed(2));
        sum += s;
        //$('.priority option').text('Urgent');
    });
    sum = sum / ($('#q59.cf-table-block tr').length - 1);
    $('.total4 input').val(sum.toFixed(2));
}

function avg5() {
    var sum = 0;
    $('#q67.cf-table-block tbody tr').each(function() {
        var s = 0;
        var q = 0;
        var r = 0;
        $(this).find('.kitchenscore input').each(function() {
            s += parseNumber($(this).val());
            $(this).val(s);
        });
        //$(this).find('.subtotal input').val((s).toFixed(2));
        sum += s;
        //$('.priority option').text('Urgent');
    });
    sum = sum / ($('#q67.cf-table-block tr').length - 1);
    $('.total5 input').val(sum.toFixed(2));
}

function avg6() {
    var sum = 0;
    $('#q75.cf-table-block tbody tr').each(function() {
        var s = 0;
        var q = 0;
        var r = 0;
        $(this).find('.bedscore input').each(function() {
            s += parseNumber($(this).val());
            $(this).val(s);
        });
        //$(this).find('.subtotal input').val((s).toFixed(2));
        sum += s;
        //$('.priority option').text('Urgent');
    });
    sum = sum / ($('#q75.cf-table-block tr').length - 1);
    $('.total6 input').val(sum.toFixed(2));
}

function avg7() {
    var sum = 0;
    $('#q83.cf-table-block tbody tr').each(function() {
        var s = 0;
        var q = 0;
        var r = 0;
        $(this).find('.vanscore input').each(function() {
            s += parseNumber($(this).val());
            $(this).val(s);
        });
        //$(this).find('.subtotal input').val((s).toFixed(2));
        sum += s;
        //$('.priority option').text('Urgent');
    });
    sum = sum / ($('#q83.cf-table-block tr').length - 1);
    $('.total7 input').val(sum.toFixed(2));
}

function avg8() {
    var sum = 0;
    $('#q92.cf-table-block tbody tr').each(function() {
        var s = 0;
        var q = 0;
        var r = 0;
        $(this).find('.pinkscore input').each(function() {
            s += parseNumber($(this).val());
            $(this).val(s);
        });
        //$(this).find('.subtotal input').val((s).toFixed(2));
        sum += s;
        //$('.priority option').text('Urgent');
    });
    sum = sum / ($('#q92.cf-table-block tr').length - 1);
    $('.total8 input').val(sum.toFixed(2));
}

function avg9() {
    var sum = 0;
    $('#q101.cf-table-block tbody tr').each(function() {
        var s = 0;
        var q = 0;
        var r = 0;
        $(this).find('.janitorscore input').each(function() {
            s += parseNumber($(this).val());
            $(this).val(s);
        });
        //$(this).find('.subtotal input').val((s).toFixed(2));
        sum += s;
        //$('.priority option').text('Urgent');
    });
    sum = sum / ($('#q101.cf-table-block tr').length - 1);
    $('.total9 input').val(sum.toFixed(2));
}

function subAvg() {
        var sum = 0,
            n = 0;
        var aTotal = [$('.total1 input').val(), $('.total2 input').val(), $(
                '.total3 input').val(),
            $('.total4 input').val(), $('.total5 input').val(), $(
                '.total6 input').val(), $('.total7 input').val(), $(
                '.total8 input').val(), $('.total9 input').val()
        ];
        for (i = 0; i < aTotal.length; i++) {
            if (aTotal[i] !== '') {
                sum += parseFloat(aTotal[i]);
                n += 1;
                console.log(aTotal[i]);
            }
        }
        console.log(sum);
        console.log(n);
        console.log(sum / n);
        $('.total input').val(sum / n).toFixed(2);
    }
    /////////////////////////// Parse Number Code/////////////////////

function parseNumber(n) {
    var f = parseFloat(n); //Convert to float number.
    return isNaN(f) ? 0 : f; //treat invalid input as 0;
}

 

0 0

Replies

replied on March 1, 2016

Hi, why don't you run your code in chrome and perform a profile on it?  You should be able to see which function takes the most time.

0 0
You are not allowed to follow up in this post.

Sign in to reply to this post.