Search code examples
jquerydelegatesmaster-pages

jquery hide() not working on dynamically generated DIV


Tried to hide a dynamically generated DIV with id lineID that's called from aspx backend but it's not working. The function is called but the line in function 6 is not hidden when function 7 is called.

lineArea is basically the HTML body where the lines are drawn.

Code that draws the line

//show line connecting 2 nodes
    function displayInst6Line() {
        var calcNode = new calculateLine();
        $('.lineArea').line(calcNode.displayInst6LineX, calcNode.displayInst6LineY, calcNode.displayInst6LineX2, calcNode.displayInst6LineY, { color: line_colour, stroke: 5, zindex: line_zindex });           
         $('#lineID').show();
    }

 //hide line
    function displayInst7Line() {     
        var calcNode = new calculateLine();
        $('.lineArea').line(calcNode.displayInst6LineX, calcNode.displayInst6LineY, calcNode.displayInst6LineX2, calcNode.displayInst6LineY, { color: '#868e96', stroke: 5, zindex: line_zindex });
        $('#lineID').hide();
    }

Backend code that does calculations for line

        //math function to draw lines
    (function ($) {

        var helpers = {
            createLine: function (x1, y1, x2, y2, options) {

                // Check if browser is Internet Exploder ;)
                var isIE = navigator.userAgent.indexOf("MSIE") > -1;
                if (x2 < x1) {
                    var temp = x1;
                    x1 = x2;
                    x2 = temp;
                    temp = y1;
                    y1 = y2;
                    y2 = temp;
                }
                var line = document.createElement("div");
                line.id = "lineID";
                line.className = options.class;

                // Formula for the distance between two points
                // http://www.mathopenref.com/coorddist.html
                var length = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));

                line.style.width = length + "px";
                line.style.borderBottom = options.stroke + "px " + options.style;
                line.style.borderColor = options.color;
                line.style.position = "absolute";
                line.style.zIndex = options.zindex;

                if (isIE) {
                    line.style.top = (y2 > y1) ? y1 + "px" : y2 + "px";
                    line.style.left = x1 + "px";
                    var nCos = (x2 - x1) / length;
                    var nSin = (y2 - y1) / length;
                    line.style.filter = "progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=" + nCos + ", M12=" + -1 * nSin + ", M21=" + nSin + ", M22=" + nCos + ")";
                } else {
                    var angle = Math.atan((y2 - y1) / (x2 - x1));
                    line.style.top = y1 + 0.5 * length * Math.sin(angle) + "px";
                    line.style.left = x1 - 0.5 * length * (1 - Math.cos(angle)) + "px";
                    line.style.transform = line.style.MozTransform = line.style.WebkitTransform = line.style.msTransform = line.style.OTransform = "rotate(" + angle + "rad)";
                }
                return line;
            }
        }


        $.fn.line = function (x1, y1, x2, y2, options, callbacks) {
            return $(this).each(function () {
                if ($.isFunction(options)) {
                    callback = options;
                    options = null;
                } else {
                    callback = callbacks;
                }
                options = $.extend({}, $.fn.line.defaults, options);

                $(this).append(helpers.createLine(x1, y1, x2, y2, options)).promise().done(function () {
                    if ($.isFunction(callback)) {
                        callback.call();
                    }
                });


            });
        };
        $.fn.line.defaults = {
            zindex: 10000,
            color: '#000000',
            stroke: "1",
            style: "solid",
            class: "line",
        };
    })(jQuery);

Solution

  • This tells us you're duplicating IDs by calling helpers.createLine more than once. You can't have more than one element with the same ID. The whole purpose of IDs is to be unique identifiers.

    jQuery optimizes $("#lineID") into (effectively) $(document.getElementById("lineID")) and getElementById can only return one element. Typically that's the first one with the ID when you break the "you can't have more than one element with the same ID" rule. So $("#lineID").hide(); will hide the first element with that ID (even if it's already hidden).

    You'll need to either give the elements distinct IDs, or identify them in another way. Or, if there's only meant to be a single one of these, use remove rather than hide to actually remove the element.