This is just a guess:

function BuildNav() {
   $("#content h2").each(function(){
      $(this).before("<div class='note newdivmarker'></div>").nextUntil("h2").appendTo(".newdivmarker");
      $("div.newdivmarker").removeClass("newdivmarker);
   });
}

It relies on the assumption that appendTo moves the origonal element list, rather than clones them. Basically:
  1. It adds your div before the heading, with a temporary marker so we can find it again
  2. Selects all elements until the next heading
  3. Moves them to the div
  4. Removes the marker from the div

Blair


On 10/18/06, Greg Bird <[EMAIL PROTECTED]> wrote:

Hi John,


thanks again for your help, unfortunately I have deployed your suggestions
and am still unable to get it to work.  You can view my testpage at:
http://members.optusnet.com.au/greg.bird/mm/collapse.html

My .js now reads:

$(document).ready(function(){
  BuildNav();
});
//DEFINE NextUntil FUNCTION

$.fn.nextUntil = function(expr) {
    var match = [];

    this.each(function(){
        var cur = this.nextSibling;
        while ( cur && jQuery.filter( expr, [cur] ).r.length ) {
            match = jQuery.merge( match, [ cur ] );
            cur = cur.nextSibling;
        }
                console.log(this,cur,match);
    });

    return this.pushStack( match, arguments );
};

/*BUILD SIDE NAVIGATION*/
function BuildNav() {
$("#content h2").each(function(){
    $(this).nextUntil("h2").wrap("<div class='note'></div>");
});
}

I have logged the script and it appears that the "match" array is not being
populated.  I suspect that the Jquery.merge function is not triggering
properly

Does this function work with JQUERY 1.0.2?  In note in the JQUERY doco that
the function call is now $.merge.  Trialled this without success.

My aim here is to put a unique div around each section of the page and then
dynamically create an expand/collapse navigation system.  Have already
achieved a similar result with a sliding navigation system.  You can see
this at:

http://members.optusnet.com.au/greg.bird/mm/index.html

This was easier as I didn't need to wrap div's around anything, but simply
anchor to the existing H2's


Have you got any suggestions?  Do you have any test pages so that I can view
your implementation?

Thanks in advance, Greg

John Resig wrote:
>
> Hi Greg -
>
> I created a plugin a while back that can help with this, called nextUntil:
>
> $.fn.nextUntil = function(expr) {
>     var match = [];
>
>     this.each(function(){
>         var cur = this.nextSibling;
>         while ( cur && jQuery.filter( expr, [cur] ).r.length ) {
>             match = jQuery.merge( match, [ cur ] );
>             cur = cur.nextSibling;
>         }
>     });
>
>     return this.pushStack( match, arguments );
> };
>
> Just include that after you include jquery.js then do the following:
>
> $("#content h2").each(function(){
>     $(this).nextUntil("h2").wrap("<div class='note'></div>");
> });
>
> Just 3 lines! Not too shabby :)
>
> --John
>
> On 10/18/06, Greg Bird < [EMAIL PROTECTED]> wrote:
>>
>> Hi everyone.
>>
>> I am attempting to develop some dynamic "in page" navigation. I am a big
>> fan of structural markup.
>>
>> Each H2 represents a new section of the current document.
>>
>> I wish to:
>> 1. Find each H2
>> 2. Wrap this in a unique div, up to (but not including) the next H2. This
>> will then be used to further manipulate the page
>>
>>
>>
>> <div id="content>
>> ........
>> <h2>First section</h2>
>> ...[arbitary HTML]....
>> <h2>second section</h2>
>> ...[arbitary HTML]....
>> <h2>third section</h2>
>> .........
>> </div>
>>
>> Becomes:
>> <div id="content>
>> ........
>> <div id="1">
>> <h2>First section</h2>
>> ...[arbitary HTML]....
>> </div>
>>
>> <div id="2">
>> <h2>second section</h2>
>> ...[arbitary HTML]....
>> </div>
>> <h2>third section</h2>
>> .........
>> </div>
>>
>> Here is the JQuery that I have developed to date:
>>
>> $(document).ready(function(){
>> BuildNav();
>> });
>> /*BUILD SIDE NAVIGATION*/
>> function BuildNav() {
>> //add back to top links before each H2
>> $('#content h2').each(function(i){
>> if(i==0){//FIRST H2
>> $(this).before('<div id="'+ i +'" class="note">')//START A NEW DIV WITH
>> UNIQUE ID
>> }
>> else {
>> $(this).before('</div><div id="'+ i +'" class="note">');//TERMINATE
>> PREVIOUS DIV, BEGIN NEW ONE
>> }
>> })
>> $('#content').append('</div>');//TERMINATE FINAL DIV
>> }
>>
>> This looks sensible to me but fails. It appears you cannot inject
>> unterminated tags and that JQUERY automatically closes tags on insertion,
>> resulting in:
>>
>> <div id="content>
>> ........
>> <div id="1"></div>
>> <h2>First section</h2>
>> ...[arbitary HTML]....
>> <div id="2"></div>
>> <h2>second section</h2>
>> ...[arbitary HTML]....
>> <div id="3"></div>
>> <h2>third section</h2>
>> .........
>> </div>
>>
>> Can anyone give me any clues? Thanks in advance, Greg Bird
>
> _______________________________________________
> jQuery mailing list
> discuss@jquery.com
> http://jquery.com/discuss/
>
>
Quoted from:
http://www.nabble.com/Please-help%21-Dynamically-Wrapping-DIV%27s-around-structural-markup.-tf2464168.html#a6869443

--
View this message in context: http://www.nabble.com/Please-help%21-Dynamically-Wrapping-DIV%27s-around-structural-markup.-tf2464168.html#a6870422
Sent from the JQuery mailing list archive at Nabble.com.


_______________________________________________
jQuery mailing list
discuss@jquery.com
http://jquery.com/discuss/

_______________________________________________
jQuery mailing list
discuss@jquery.com
http://jquery.com/discuss/

Reply via email to