just wanted to pipe in here, i'm using $.nextUntil and $.wrapAll in the custom paginator i'm building and it worked great. thanks, john.
-p On Oct 18, 2006, at 12:21pm, John Resig wrote: > Ok, I did some more digging and you're right. I don't think I ever > actually tested nextUntil (oops!) > > The full implementation can be found here: > http://john.jquery.com/jquery/test/nextuntil.html > > This includes a working version of nextUntil: > $.fn.nextUntil = function(expr) { > var match = []; > > // We need to figure out which elements to push onto the array > this.each(function(){ > // Traverse through the sibling nodes > for( var i = this.nextSibling; i; i = i.nextSibling ) { > // Make sure that we're only dealing with elements > if ( i.nodeType != 1 ) continue; > > // If we find a match then we need to stop > if ( jQuery.filter( expr, [i] ).r.length ) break; > > // Otherwise, add it on to the stack > match.push( i ); > } > }); > > return this.pushStack( match, arguments ); > }; > > Additionally, I realized that .wrap() isn't going to do what you need > it to. .wrap() wraps each matched element with the same structure. So > if you matched 3 paragraphs, you'd have three surrounding divs too. > Since you want it to wrap all of the matched elements with a single > element, I made a new .wrapAll() plugin: > > $.fn.wrapAll = function() { > // There needs to be at least one matched element for this to work > if ( !this.length ) return this; > > // Find the element that we're wrapping with > var b = jQuery.clean(arguments)[0]; > > // Make sure that its in the right position in the DOM > this[0].parentNode.insertBefore( b, this[0] ); > > // Find its lowest point > while ( b.firstChild ) b = b.firstChild; > > // And add all the elements there > return this.appendTo(b); > }; > > So - all of that should help you along now. Let me know if this > works for you. > > --John > > On 10/18/06, Greg Bird <[EMAIL PROTECTED]> wrote: >> >> Thanks for this Blair.....a really interesting approach and one I >> wouldn't >> have thought of myself. >> >> At the moment, I am having problems with the NextUntil function, >> but once I >> have this solved, your suggestion may be a really neat >> implementation. >> >> Cheers, Greg >> >> >> >> Blair McKenzie-2 wrote: >>> >>> 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/ >>> >>> >> >> -- >> View this message in context: http://www.nabble.com/Please-help%21- >> Dynamically-Wrapping-DIV%27s-around-structural-markup.- >> tf2464168.html#a6870801 >> Sent from the JQuery mailing list archive at Nabble.com. >> >> >> _______________________________________________ >> jQuery mailing list >> discuss@jquery.com >> http://jquery.com/discuss/ >> > > > -- > John Resig > http://ejohn.org/ > [EMAIL PROTECTED] > > _______________________________________________ > jQuery mailing list > discuss@jquery.com > http://jquery.com/discuss/ > > _______________________________________________ jQuery mailing list discuss@jquery.com http://jquery.com/discuss/