Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript: can't add href to list item

I am trying to add a new item to a list item. But the below code isn't adding Hyperlink to the list item I want. Can someone please advise what's wrong?

HTML:

<div>
    <ul id="list1">
      <li>Ut enim ad minim veniam.</li>
      <li>Excepteur sint occaecat cupidatat non proident.</li>
    </ul>
</div>

JavaScript:

//create new li element
var newListItem = document.createElement("li");
newListItem.textContent = "...ooo";
var ulist = document.getElementById("list1");
console.log("adding link..");
newListItem.setAttribute('href', "http://www.msn.com");
ulist.appendChild(newListItem);
console.log("added item");
like image 362
techtinkerer Avatar asked Feb 24 '14 01:02

techtinkerer


People also ask

How do I create a href for a list?

you need to put the < li > tag before the entire link code and the < /li > at the end of the entire source tag.

How can I add href attribute to a link dynamically using Javascript?

Answer: Use the jQuery . attr() Method You can use the jQuery . attr() method to dynamically set or change the value of href attribute of a link or anchor tag. This method can also be used to get the value of any attribute.

Can we put link tag in body?

A <link> element can occur either in the <head> or <body> element, depending on whether it has a link type that is body-ok. For example, the stylesheet link type is body-ok, and therefore <link rel="stylesheet"> is permitted in the body.


2 Answers

li doesn't have the href attribute, you have to wrap an a tag inside li.

var a = document.createElement("a");
var ulist = document.getElementById("list1");
var newItem = document.createElement("li");

a.textContent = "...ooo";
a.setAttribute('href', "http://www.msn.com");
newItem.appendChild(a);
ulist.appendChild(newItem);

The DEMO.

like image 53
xdazz Avatar answered Oct 19 '22 20:10

xdazz


Though solved, I add some more information for you to read :)

Content and attributes

Each element has a content model:

``[…] a description of the element's expected contents. An HTML element must have contents that match the requirements described in the element's content model.[…]''

As such the <ul> element has a content model. Looking at the specs we find it to be:

  • Zero or more li and script-supporting elements.

By this we can conclude that we can not have an anchor, a, inside the ul element. But what about adding a href attribute to the ul?

Then we look at the Content attributes.

A normative list of attributes that may be specified on the element (except where otherwise disallowed), along with non-normative descriptions of those attributes. (The content to the left of the dash is normative, the content to the right of the dash is not.)

For ul we find:

  • Global attributes

The Global attributes are the following:

  • accesskey
  • class
  • contenteditable
  • dir
  • draggable
  • dropzone
  • hidden
  • id
  • lang
  • spellcheck
  • style
  • tabindex
  • title
  • translate

In addition it can have various event handler attributes, like onmouseover, onclick, on... and ARIA attributes. But, as we see, no href attribute.

In conclusion we now know that:

  1. ul can not have an anchor as a child.
  2. ul can not have the href attribute.

But, the question was about href on li element!

As li and ul / ol are intertwined we first had a look at ul. For li we follow the same procedure: The content model for li is:

  • Flow content

Now, that opens up a wide range of possibilities. Here we find a at top of the list.

And what about the attributes? For li we find:

  • Global attributes
    If the element is a child of an ol element: value - Ordinal value of the list item

In other words, we now know:

  1. ul can not have an anchor as a child.
  2. ul can not have the href attribute.
  3. li can have an anchor as a child.
  4. li can not have the href attribute.

Solution

As pointed out by others, is to add it to an anchor that we put as a child of a li element:

<ul>
    <li><a href="myurl">Hello</a></li>
</ul>
like image 21
user13500 Avatar answered Oct 19 '22 20:10

user13500