I am working within the constraints of a content management system that sometimes forces me to do some odd things because I don't have full control of the HTML code.
In this instance, I have a situation where I want one DIV to not be nested inside another DIV. Because of the CMS settings, I can't just re-order the DIVs in the HTML code.
So, I have this:
<div class="blog">
<div class="free-me">
Hello world
</div>
</div>
What I need is:
<div class="blog">
</div>
<div class="free-me">
Hello world
</div>
<div class="blog">
</div>
This would be as simple as copying and pasting some lines if I could access the HTML. But, since I can't just change the HTML, what I want to know is if there's any way I can use CSS or JavaScript to close off the blog
DIV so that free-me
can be a sibling.
I tried this (even though I kind of knew it wouldn't work):
.free-me::before {
content: '</div>';
}
As suspected, that just rendered text that said </div>
into the page.
For JavaScript, I'm certainly no expert, but it seems like you can only insert complete elements, with opening and closing tags, with a command like document.createElement('div');
I can't see a clear way to take an existing DIV and close it off.
Is there a way, either with CSS or JavaScript, I can force a DIV to close or insert an ending </div>
tag?
Note: Preferably a non-jQuery solution.
To hide a div using JavaScript, get reference to the div element, and assign value of "none" to the element. style. display property.
Div tag has both open(<div>) and closing (</div>) tag and it is mandatory to close the tag.
It is unnecessary to add an explicit closing “ </div> “ tag to the string you pass to . html() , because jQuery will take care of that for you. Beware: although this XML-like syntax (“ <div/> “) is accepted by jQuery, it is not valid HTML, and shouldn't be used in HTML files.
Nope! Divs can't be disabled. Only form and form elems. Actually in Quirks-mode IE can disable a div , but it only grays button texts, it doesn't prevent events firing.
If you just want to pop out one div out of the other after rendering I suggest you use jQuery insertAfter method. I also use a CMS and know exactly how you feel.
$(".free-me").insertAfter(".blog");
.blog {
border: 1px solid red;
width: 100px;
height: 20px;
text-align: center;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="blog">
<div class="free-me">
Hello world
</div>
</div>
You can achieve this with JavaScript by looping through all the elements with the classname .free-me
and inserting into them DOM before their parent elements' next siblings, which will also remove them from their parent elements at the same time.
(function(){
var children=document.querySelectorAll(".blog>.free-me"),
x=children.length,
child,parent;
while(x--){
child=children[x];
parent=child.parentNode;
// Uncomment below if you would prefer to
// explicitly remove the child from the parent.
//parent.removeChild(child);
parent.parentNode.insertBefore(child,parent.nextSibling);
}
})();
div{
margin:5px;
padding:10px;
}
.blog{
background:#000;
}
.free-me{
background:#090;
}
.ignore-me{
background:#f00;
}
<div class="free-me"></div>
<div class="blog"></div>
<div class="blog">
<div class="free-me"></div>
</div>
<div class="blog">
<div class="free-me"></div>
<div class="free-me"></div>
</div>
<div class="blog">
<div class="free-me"></div>
<div class="ignore-me"></div>
<div class="free-me"></div>
<div class="free-me"></div>
</div>
However, if your parent elements contain multiple children, some of which will have the .free-me
class and some of which won't, and you wish to maintain the order of all child elements then the solution is a little more complex (Note: this Snippet was a little rushed so could probably be cleaned up a good bit.)
(function(){
var blogs=document.querySelectorAll(".blog"),
x=blogs.length,
grandparent,parent,clone,children,child,y;
while(x--){
parent=blogs[x];
// You can remove the following if statement
// if you wish to have any pre-existing empty .blog
// elements removed from the DOM.
if(parent.querySelector(".free-me")){
grandparent=parent.parentNode;
children=parent.children;
y=children.length;
while(y--){
child=children[y];
if(child.classList.contains("free-me")){
if(clone){
grandparent.insertBefore(clone,parent.nextSibling)
clone=0;
}
grandparent.insertBefore(child,parent.nextSibling);
}else{
if(!clone)
clone=parent.cloneNode(0);
clone.insertBefore(child,clone.firstChild);
}
}
grandparent.removeChild(parent);
}
}
})();
div{
margin:5px;
padding:10px;
}
.blog{
background:#000;
}
.free-me{
background:#090;
}
.ignore-me{
background:#f00;
}
<div class="free-me">1</div>
<div class="blog"></div>
<div class="blog">
<div class="free-me">2</div>
</div>
<div class="blog">
<div class="free-me">3</div>
<div class="free-me">4</div>
</div>
<div class="blog">
<div class="free-me">5</div>
<div class="ignore-me">6</div>
<div class="ignore-me">7</div>
<div class="free-me">8</div>
</div>
<div class="blog">
<div class="ignore-me">9</div>
<div class="free-me">10</div>
<div class="ignore-me">11</div>
<div class="free-me">12</div>
</div>
<div class="blog">
<div class="ignore-me">13</div>
</div>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With