jQuery包括在结果中创建的子节点

时间:2015-03-13 19:25:23

标签: javascript jquery html scroll

我插入一个div,每个n-child,然后调用父节点的子节点,但jQuery插入的元素不在这个新列表中。我怎样才能获得插入的元素。

对不起,如果这没有意义。

这在代码中可能更容易,所以你走了。



jQuery(document).ready(function () {
    alignMultiGrid(4, 5, 5, 1);
});

/**
 * Aligns a grid of objects
 *
 * @param cols       The number of columns in the grid
 * @param cellWidth  the width of each cell
 * @param cellHeight the height of each cell
 * @param padding    the padding between the cells
 */
function alignGrid( /*string*/ id, /*int*/ cols, /*int*/ cellWidth, /*int*/ cellHeight, /*int*/ padding) {

    var x = 0;
    var y = 0;
    var count = 1;

    jQuery("#" + id).each(function () {
        jQuery(this).css("position", "relative");

        jQuery(this).children("div").each(function () {
            jQuery(this).css("width", cellWidth + "em");
            jQuery(this).css("height", cellHeight + "em");
            jQuery(this).css("position", "absolute");

            jQuery(this).css("left", x + "em");
            jQuery(this).css("top", y + "em");

            if ((count % cols) == 0) {
                x = 0;
                y += cellHeight + padding;
            } else {
                x += cellWidth + padding;
            }

            count++;
        });
    });
}

/* 
 * Variables for handling the dynamic multigrid
 */
var gridcount = 0;
var gridwidth;
var gridheight;
var currentgrid = 0;

/* 
 * Positions the grid to a specific grid index.
 */
function positionGrid( /* int */ gridpos) {
    jQuery("#gridnav" + currentgrid).removeClass("gridnavitemselected");
    currentgrid = gridpos;
    jQuery(".multigrid").each(function () {
        jQuery(this).animate({
            left: "-" + (gridwidth * currentgrid) + "em"
        }, 1500);
    });

    /*
     * Set the next and previous links to be visible as needed
     */
    if (currentgrid == 0) {
        jQuery("#prevcontainer").hide(0);
    } else {
        jQuery("#prevcontainer").show(0);
    }

    if (currentgrid == (gridcount - 1)) {
        jQuery("#nextcontainer").hide(0);
    } else {
        jQuery("#nextcontainer").show(0);
    }

    jQuery("#gridnav" + currentgrid).addClass("gridnavitemselected");

    return false;
}

/* 
 * Goes to the next grid position.  The is move right button
 */
function positionGridNext() {
    if (currentgrid == (gridcount - 1)) {
        return false;
    }

    positionGrid(currentgrid + 1);
    return false;
}

/* 
 * Goes to the previous grid position.  The is move left button
 */
function positionGridPrev() {
    if (currentgrid == 0) {
        return false;
    }

    positionGrid(currentgrid - 1);

    return false;
}

/* 
 * Adds an item to the grid navigation bar
 */
function addNavItem(index) {
    jQuery("#gridnav").append("<div id=\"gridnav" + (index - 1) + "\" class=\"gridnavitem\"><a href=\"#\" " +
        "onclick=\"positionGrid(" + (index - 1) + "); return false;\">" + index + "</a></div>");

    /*
     * The navigation area needs to grow wide enough to hold all the items so we'll
     * dynamically set the position of it based on the number of child nav items.
     */
    jQuery("#gridnavcontainer").css("right", ((jQuery("#gridnav").children().length * 3) + 0.5) + "em");
}

/**
 * Aligns a grid that spans multiple pages with dynamic links for
 * navigation between the pages.
 *
 * @param cols       The number of columns in the grid
 * @param cellWidth  the width of each cell
 * @param cellHeight the height of each cell
 * @param padding    the padding between the cells
 */
function alignMultiGrid( /*int*/ cols, /*int*/ cellWidth, /*int*/ cellHeight, /*int*/ padding) {

    var xoffset = padding;
    var x = xoffset;
    var y = padding;
    var cellcount = 1;
    var rowcount = 1;
    var maxrows = 3;

    gridwidth = (cols * (cellWidth + padding)) + padding;
    gridheight = (maxrows * (cellHeight + padding)) + padding;

    currentgrid = 0;


    var n = $(".cell").length;
    var c = (cols * maxrows);

    if (n > c) {
        jQuery(".cell:nth-child(" + c + "n)").before("<div class=\"next\">NEXT</div>");
    }
    /* 
     * First we add the styles and the navigation components to the main grid container
     */
    jQuery(".maingridcontainer").each(function () {
        jQuery(this).css("position", "relative");
        jQuery(this).css("width", (gridwidth + 5) + "em");
        jQuery(this).css("height", (gridheight + 5) + "em");

        /* 
         * Now we'll add the next and previous links
         */

        jQuery(this).append("<div class=\"nextprev\" id=\"nextcontainer\">" +
            "<a href=\"#\" class=\"next\"> > </a>" +
            "</div>");
        jQuery(this).append("<div class=\"nextprev\" id=\"prevcontainer\">" +
            "<a href=\"#\" class=\"prev\"> < </a>" +
            "</div>");


        /* 
         * And now the previous and next link styling
         */
        jQuery("#prevcontainer").each(function () {
            jQuery(this).css("width", "4em");
            jQuery(this).css("height", "2em");
            jQuery(this).css("position", "absolute");

            jQuery(this).css("top", ((maxrows / 2) * (cellHeight + padding) - 0.5) + "em");
            jQuery(this).css("left", "0em");
        });

        jQuery("#nextcontainer").each(function () {
            jQuery(this).css("width", "4em");
            jQuery(this).css("height", "2em");
            jQuery(this).css("position", "absolute");

            jQuery(this).css("top", ((maxrows / 2) * (cellHeight + padding) - 0.5) + "em");
            jQuery(this).css("left", (gridwidth + 2) + "em");
        });
    });

    /* 
     * Now we style the grid container itself and add the navigation bar
     */
    jQuery(".multigridcontainer").each(function () {
        jQuery(this).css("overflow", "hidden");
        jQuery(this).css("position", "relative");
        jQuery(this).css("left", "2em");
        jQuery(this).css("width", gridwidth + "em");
        jQuery(this).css("height", (gridheight + 5) + "em");

        /* 
         * Add the grid navigation bar
         */

        jQuery(this).append("<div id=\"gridnavcontainer\"><div id=\"gridnav\" class=\"grid\"></div></div>");
        jQuery("#gridnavcontainer").each(function () {
            jQuery(this).css("position", "absolute");
            jQuery(this).css("top", (gridheight + 3) + "em");
        });

    });

    /* 
     * And now we are ready to align the grid.  This is where
     * the magic happens
     */
    jQuery(".multigrid").each(function () {
        jQuery(this).css("position", "relative");
        console.log($(".cell").length);
        jQuery(this).children("div").each(function () {
            jQuery(this).css("width", cellWidth + "em");
            jQuery(this).css("height", cellHeight + "em");
            jQuery(this).css("position", "absolute");

            jQuery(this).css("left", x + "em");
            jQuery(this).css("top", y + "em");

            if ((cellcount % cols) == 0) {
                if ((rowcount % maxrows) == 0) {
                    /* 
                     * This means we have added the maximum number of rows to
                     * this page in the grid and we need to push everything
                     * over to the next grid;
                     */
                    y = padding;
                    xoffset += gridwidth;
                    x = xoffset;
                    gridcount++;
                    addNavItem(gridcount);

                } else {
                    x = xoffset;
                    y += cellHeight + padding;
                }

                rowcount++;
            } else {
                x += cellWidth + padding;
            }
            cellcount++;
        });

        /* 
         * This is a little hacky.  I need to see if I have to add a
         * grid to the grid count for a partial grid at the end.  I could
         * make this code a bit cleaner if JQuery has a do/while construct
         * instead of just a for each
         */
        if ((cellcount - 1) % (maxrows * cols) != 0) {
            gridcount++;
            addNavItem(gridcount);
        }

    });

    /*
     * Now we have to align a simple grid for the navigation controls
     */
    alignGrid("gridnav", 6, 2, 2, 1);

    /* 
     * Add listeners for the next and previous links
     */
    jQuery(".next").click(function () {
        positionGridNext();
        return false;
    });

    jQuery(".prev").click(function () {
        positionGridPrev();
        return false;
    });

    /*
     * The last step is to position the grid to the 0 index so the first
     * control will be properly highlighted
     */
    positionGrid(0);
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<main>
    <div class="maingridcontainer">
        <div class="multigridcontainer">
            <div class="multigrid">
                <div class="cell">1</div>
                <div class="cell">2</div>
                <div class="cell">3</div>
                <div class="cell">4</div>
                <div class="cell">5</div>
                <div class="cell">6</div>
                <div class="cell">7</div>
                <div class="cell">8</div>
                <div class="cell">9</div>
                <div class="cell">10</div>
                <div class="cell">11</div>
                <div class="cell">1</div>
                <div class="cell">2</div>
                <div class="cell">3</div>
                <div class="cell">4</div>
                <div class="cell">5</div>
                <div class="cell">6</div>
                <div class="cell">7</div>
                <div class="cell">8</div>
                <div class="cell">9</div>
                <div class="cell">10</div>
                <div class="cell">11</div>
                <div class="cell">1</div>
                <div class="cell">2</div>
                <div class="cell">3</div>
                <div class="cell">4</div>
                <div class="cell">5</div>
                <div class="cell">6</div>
                <div class="cell">7</div>
                <div class="cell">8</div>
                <div class="cell">9</div>
                <div class="cell">10</div>
                <div class="cell">11</div>
            </div>
        </div>
    </div>
</main>
&#13;
&#13;
&#13;

这两个主要部分是元素插入:

&#13;
&#13;
    var n = $(".cell").length;
    var c = (cols * maxrows);

    if (n > c) {
        jQuery(".cell:nth-child(" + c + "n)").before("<div class=\"next\">NEXT</div>");
    }
&#13;
&#13;
&#13;

并且忽视了上述的孩子的召唤。

&#13;
&#13;
jQuery(".multigrid").each(function() {
  jQuery(this).css("position", "relative");
  console.log($(".cell").length);
  jQuery(this).children("div").each(function() {
    jQuery(this).css("width", cellWidth + "em");
    jQuery(this).css("height", cellHeight + "em");
    jQuery(this).css("position", "absolute");

    jQuery(this).css("left", x + "em");
    jQuery(this).css("top", y + "em");

    if ((cellcount % cols) == 0) {
      if ((rowcount % maxrows) == 0) {
        /* 
         * This means we have added the maximum number of rows to
         * this page in the grid and we need to push everything
         * over to the next grid;
         */
        y = padding;
        xoffset += gridwidth;
        x = xoffset;
        gridcount++;
        addNavItem(gridcount);

      } else {
        x = xoffset;
        y += cellHeight + padding;
      }

      rowcount++;
    } else {
      x += cellWidth + padding;
    }
    cellcount++;
  });

  /* 
   * This is a little hacky.  I need to see if I have to add a
   * grid to the grid count for a partial grid at the end.  I could
   * make this code a bit cleaner if JQuery has a do/while construct
   * instead of just a for each
   */
  if ((cellcount - 1) % (maxrows * cols) != 0) {
    gridcount++;
    addNavItem(gridcount);
  }

});
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

这确实非常简单。而不是插入所需的&#34; next&#34;在第12项之前的div,我在11日之后插入了它,而且似乎都没问题。

感谢您提供非常有建设性的答案。我现在可以开始清理代码并在需要的地方帮助他人。 /讽刺。

&#13;
&#13;
    var n = jQuery(".release").length;
    var c = (cols * maxrows);
    
    if (n > c) {
        jQuery(".release:nth-child(" + (c -1) + "n)").after('<div class="next release"> NEXT </div>');
    }
&#13;
&#13;
&#13;