Oh crap. Just realized saving index won’t work if context node’s previous 
siblings are passed as arguments. Looks like inserting transient node is still 
the best way.

> On Jan 18, 2015, at 11:40 AM, Glen Huang <curvedm...@gmail.com> wrote:
> 
> To generalize the use case, when you have a bunch of nodes, some of which 
> need to be inserted before a node, and some of which after it, you are likely 
> to want `replaceWith` could accept the context node as an argument.
> 
> I just realized another algorithm: Before running the macro, save the context 
> node’s index and its parent, and after running it, pre-insert node into 
> parent before parent’s index’th child (could be null). No transient node 
> involved and no recursive finding.
> 
> Hope you can reconsider if this edge case should be accepted.
> 
>> On Jan 16, 2015, at 5:04 PM, Glen Huang <curvedm...@gmail.com> wrote:
>> 
>> Oh, right. Trying to be smart and it just proved otherwise. :P
>> 
>>> I don't really see a good reason to complicate the algorithm for this 
>>> scenario, personally.
>> 
>> This edge case may seem absurd at first sight. Let me provide a use case:
>> 
>> Imagine you have this simple site
>> 
>> ```
>> <ul>
>>      <li><a href=“blog.html”>Blog</li>
>>      <li><a href=“blog.html”>About</li>
>>      <li><a href=“blog.html”>Contact</li>
>> </ul>
>> <main>About page content</main>
>> ```
>> 
>> You are currently at the about page. What you are trying to do is that when 
>> the user clicks a nav link, the corresponding page is fetched via ajax, and 
>> inserted before or after the current main element, depending on whether the 
>> clicked nav link exists before or after the current nav link.
>> 
>> So when the page is first loaded, you first loop over the nav links to 
>> create empty mains for placeholder purposes.
>> 
>> ```
>> <ul>
>>      <li><a href=“blog.html”>Blog</li>
>>      <li><a href=“about.html”>About</li>
>>      <li><a href=“contact.html”>Contact</li>
>> </ul>
>> <main></main>
>> <main>About page content</main>
>> <main></main>
>> ```
>> 
>> How do you do that? Well, ideally, you should be able to just do (in pseudo 
>> code):
>> 
>> ```
>> currentMain = get the main element
>> links = get all a elements
>> mains = []
>> 
>> for i, link in links
>>      if link is current link
>>              mains[i] = currentMain
>>      else
>>              mains[i] = clone currentMain shallowly
>> 
>> currentMain.replaceWith(…mains)
>> ```
>> 
>> This way you are inserting nodes in batch, and not having to deal with 
>> choosing insertBefore or appendChild.
>> 
>> Without `replaceWith` supporting it, in order to do batch insertions (nav 
>> links could be a large list, imagining a very long TOC links), you are 
>> forced to manually do the steps I mentioned in the first mail.
>> 
>>> On Jan 16, 2015, at 4:22 PM, Anne van Kesteren <ann...@annevk.nl> wrote:
>>> 
>>> On Fri, Jan 16, 2015 at 8:47 AM, Glen Huang <curvedm...@gmail.com> wrote:
>>>> Another way to do this is that in mutation method macro, prevent `oldNode` 
>>>> from being added to the doc frag, and after that, insert the doc frag 
>>>> before `oldNode`, finally remove `oldNode`. No recursive finding of next 
>>>> sibling is needed this way.
>>> 
>>> But then d2 would no longer be present?
>>> 
>>> I don't really see a good reason to complicate the algorithm for this
>>> scenario, personally.
>>> 
>>> 
>>> -- 
>>> https://annevankesteren.nl/
>> 
> 


Reply via email to