Get Exact child of their parent element. Jquery - javascript

Well I was having a hard time to call a certain element.
What I was supposed to do is get the
li.parent.iced-tea span a element. But the problem is it also affects the LEVEL2 li span a tag.
<li class="level1-parent has-children level1 parent iced-tea open">
<span class="vertnav-cat"><span>iced tea</span></span>
<ul>
<li class="first level2-active level2 active iced-ceylon-gold">
<span class="vertnav-cat"><span>iced ceylon silver</span></span>
</li>
</ul>
</li>
So I was wondering, how to get the exact child without going to other element.
Here's the code that I'm calling.
$("#vertnav ul li.iced-tea span a")
Any solution for this stuff?

Use a child selector (>):
$("#vertnav ul li.iced-tea > span a")
In other words, only select span links that are direct children of li.iced-tea elements.

Related

jquery slidetoggle list without list elements trigger the effect

I am quite new to everything about html/js/css. Right now i need a list so i decided to use a list that u can slidetoggle. I looked it up and found how to recreate that effect (the code below):
var subMenu = jQuery(".tableContainer ul li ul li");
var linkClick = jQuery(".tableContainer ul li").filter(":has(ul)");
linkClick.click(function () {
$(this).find('ul li').slideToggle(200);
});
(if you are wondering about the 2 ul and li, it is because i want that list in another list, but that doesn t change the question so i didn t include it in my explanation)
Since i am quite new to this topic, i only understand like 70% of what is happening. But for my project i need to work with the elements of the list(the ones which were hidden and after sliding down visible). I want to do stuff that requires clicking them like highlight on click, but now i encounter the problem, that the code i posted makes the slide effect being triggered not only by the headline, but also by the elements. So i cannot click elements without minimizing the list with the same click (obviously the elements are hidden again then). I hope you guys can explain me how to make the function only be triggered by the head object and not by the whole list element(head and the expanded list).
Look the slide effect is being triggered not only by the headline but also by the elements that are because the concept of event bubbling which basically means in case of click event if you clicked a child element the event is bubbled by default to the parent elements tree till the document level firing any registered event handler. so when you click the element you click the headline too, so you need to add another child element and handle the click on it something like this:-
<div class="tableContainer">
<ul>
<li> <span>menu 1</span>
<ul>
<li>link 1</li>
</ul>
</li>
<li><span> menu 2</span>
<ul>
<li>link 2</li>
</ul>
</li>
<li><span> menu 3</span>
<ul>
<li>link 3</li>
</ul>
</li>
<li> <span>menu 4</span>
<ul>
<li>link 4</li>
</ul>
</li>
</ul>
</div>
$(function() {
var subMenu = jQuery(".tableContainer ul li ul li");
var linkClick = jQuery(".tableContainer span");
console.log(linkClick.length);
linkClick.click(function() {
console.log('clicked');
$(this).siblings('ul').slideToggle(200);
});
});
Full Working Example Here
Hope this answers your question.

Move DOM element to top of the parent and after selected element

<ul class="level1">
<li>
<span>category name</span>
<ul class="level2"></ul>
<ul class="level2"></ul>
<ul class="level2"></ul>
<ul class="level2"></ul>
<ul class="level2"></ul>
<li>
</ul>
I want selected ul that is with level2 class to move to top of the
ul.level1 li but it should be after ul.level1 li span.
Actually this is regarding move elements in bootstrap tree
http://jsfiddle.net/umutc1/eyf9q87c/
See this JSFiddle, think it's what you're after: JSFiddle
Essentially, you hook onto the event that triggers the move, find the thing you want to move, find where you want to move it to and use the .after() jq function to do the move.
HTH
$(function(){
$("ul.level2").click(function(e){
var clickedUL = $(e.target).closest("UL");
$("ul > li > span").after(clickedUL);
});
});

Adding class to list with jQuery

I have nested lists and I need to style every items. Normally I would do something like this:
$('#myList li').addClass('myClass');
However, because they are nested, I need to style just text, I suppose. How do I do this with jQuery? I thied this, but it did not work:
$('#myList li').text().addClass('myClass');
Here's HTML
<ul id="myList">
<li>
item 1
</li>
<li>
item 2
<ul>
<li>
asdasd
</li>
</ul>
</li>
</ul>
I NEED TO StYLE EVERY LIST ITEM
first level, direct child
$('#myList > li').addClass('myClass');
second level AND higher
$('#myList li li').addClass('myClass');
This subject is largely documented on jquery api selector page
Now your question has been edited : you need to style ALL list items :
CSS
li { /* will affect ALL list-items */}
Now you made it clearer :
Wrapping what's inside the LI element
$('li').wrapInner( "<span class='your-css-selector'></span>" );
Now you shown that you won't search more than a copy-paste solution :
Wrapping what's inside the LI element but not what resides in another inner-element
$('#myList li').each(function(){
$(this).contents().first().wrap("<span/>")
});
credit to user PLS copy-pasted from his comment.
You cannot just style text.
You can specifically style the nested list items by doing this:
$('ul#myList > li > ul > li').addClass('myClass');
This will add the myClass class to the item that has the text asdasd in your example
Just wrap your text in a span and apply class on them. When you apply class on li all of its contents gets impacted hence any descendants as well like nested ul under the li. Instead just wrap the texts in an element and apply class to them.
<ul id="myList">
<li>
<span>item 1</span>
</li>
<li>
<span>item 2</span>
<ul>
<li>
<span>asdasd</span>
</li>
</ul>
</li>
</ul>
and
$('#myList li > span').addClass("myClass");
With this you could just handle it using Css rule itself.

Removing parent elements and re-appending children

I have a navigation that's a unordered list, here's the simple structure I'm following / have to follow for my jQuery plugin to work correctly, therefore making this code structure a necessity:
<nav id="mp-menu" class="mp-menu">
<div class="mp-level">
<ul id="demo1" class="nav">
<li>
Devices
<div class="mp-level">
<h2>Devices</h2>
<a class="mp-back" href="#">back</a>
<ul>
<li>Mobile Phones</li>
<li>Televisions</li>
<li>Cameras</li>
</ul>
</div>
</li>
<li>
Magazines
<div class="mp-level">
<h2>Magazines</h2>
<a class="mp-back" href="#">back</a>
<ul>
<li>National Geographic</li>
<li>Scientific American</li>
</ul>
</div>
</li>
...
</ul>
</div>
</nav>
I need to provide a fallback and I have selected another jQuery plugin that needs to use a different structure to the above. I need to remove the DIV's with classname .mp-level but still keeping all unordered lists including .mp-level child lists.
The result will just be unordered lists without headings and DIV'S. My code below is removing the correct elements but my issue is with re-inserting the child unordered lists (specifically level 2):
$( "#demo1 h2, .mp-back" ).remove();
$( ".mp-level ul li .mp-level" ).detach();
$( ".mp-level ul li" ).append('.mp-level ul li .mp-level ul');
Anyone got any advice how to re-insert child UL's after I have removed their parents?
you can do this
$("#mp-menu").find(".mp-level").each(function(i,n){//each ".mp-level"
$(n).parent().append($(n).children());//append children to parent
$(n).remove();//remove actual div
});
http://jsfiddle.net/WBWwG/
You can save the detached nodes (wrapped inside a jQuery object) by assigning them to a variable and then using that variable in the .append() call.
Something like this:
// this selector doesn't select anything from the example html, btw
var $mp_level = $( ".mp-level ul li .mp-level" ).detach();
$(".mp-level ul li").append($mp_level);

jQuery : Removing parent tag not the child of that parent

i am trying to remove parent tag,
but removing parent tag should not remove their child element.
The child should get attached previous tag
Below is the code:
<div class="mask">
<ul id="TickerT" class="news">
<ul class="tweet_list">
<li class="first odd">
<span class="tweet_time">about 8 minutes ago</a></span>
<span class="tweet_join"></span>
<span class="tweet_text">test test…</a></span></li>
</ul>
</ul>
</div>
</div>
There are at-least 5 <li> and now i want to delete <ul class="tweet_list">.
I have tried it with jQuery's replaceWith but no result.
Here's the code i have used from a site
var jj = $("ul.tweet_list").contents()$(".tweet_list").replaceWith(jj);
But this didn't worked.
What i wanted is i want to remove <ul class="tweet_list"> but not <li> of that <ul>.
Help appreciated, Thanks..
You can call the unwrap() method on your list item:
$("ul.tweet_list > li").unwrap();
This will remove the .tweet_list <ul> element and reparent the <li> element (and its siblings, if any) under the #TickerT <ul> element.
Just use the .unwrap() method:
$('.tweet_list').children().unwrap();
DEMO
var jj = $("ul.tweet_list").html()
$("ul.tweet_list").replaceWith(jj)
There is no content method on jquery. Try the html method.
You could save the .html() content and the parent ul of the list you want to delete into a variable and then add the .html() to the parent ul.

Categories

Resources