我想第一件事document.write
现在很少使用,因为有一个更好和更有效的方式添加东西(元素,文本等)到DOM(稍后更多)。此外,在你的情况下,你不知道的是document.write
是不是像echo
或println
;每次使用它都会清除文档,这可能是您看不到任何内容的原因。换句话说,多个document.write
的结果是不累积。
第二件事情是,有更好的方式来标记元素,而不是使用id
s,特别是如果页面上有很多这样的元素,就像你拥有的那样。再次,现在有更好的方法来定位元素,或者比十年或十五年前更容易捕捉事件。
所以,让我们来谈谈你的代码。
您可以使用方括号[]
快速创建一个数组。
var arr = [
'notiziepericolose.blogspot.it',
'ilcorrieredellanotte.it',
'ilmattoquotidiano.it',
'ilfattonequotidiano.com',
'rebubblica.altervista.org',
'coriere.net'
];
您不必创建阵列,以便副本sort
- 它可以就地完成:
arr.sort();
我要保持你的循环,但告诉你将字符串连接在一起的另一种方式。有些人更喜欢将字符串添加到一起,但我更喜欢这种方式,那就是创建一个字符串的小部分数组,然后将它们放在一起**。
// Set l as the length, and create an output array called list
for (var i = 0, l = arr.length, list = []; i < l; i++) {
// I've changed things here. I've added a class called item
// but also changed the element id to a data-id instead
var li = ['<li class="item" data-id="', i, '">', arr[i], '</li>'];
// Push the joined li array of strings into list
list.push(li.join(''));
}
假设你有所谓的 “主” 您的页面上的元素:
HTML
<div id="main"></div>
JS
您可以添加列表阵列作为HTML字符串到main
使用方法:
var main = document.getElementById('main');
// Note that I've given the ordered list an id called list
var HTML = ['<ol id="list"><b>', list.join(''), '</b></ol>'].join('');
main.insertAdjacentHTML('beforeend', html);
好的,这很容易。但我敢打赌,你问的是如何针对列表中的单个项目,以便如果我点击其中的一个,它会警告它是什么(或什么)。
而不是添加事件侦听器以每个列表项(其中我们可以,但它可以工作performatively昂贵你有更多的项目),我们要重视一个到我们补充说list
ID的ol
元素从项目和捕获的事件,因为他们冒泡:
var ol = document.getElementById('list');
然后一个事件侦听器添加到它告诉我们什么功能(checkItem
)的列表时,点击事件引发被称为:
ol.addEventListener('click', checkItem);
我们的函数使用事件(e
)来查明事件的目标是什么(点击了哪个项目),并提醒其文本内容。
function checkItem(e) {
alert(e.target.textContent);
}
你可以看到这一切工作in this demo。希望这有些帮助。
**下面是整理的另一种方式,并通过使用reduce
数组循环:
var list = arr.sort().reduce(function (p, c, i) {
return p.concat(['<li class="item" data-id="', i, '">', c, '</li>']);
}, []).join('');
DEMO
什么是你的错误? – sheplu
首先,你的循环中的变量i是未定义的。 – Adriani6
ids应该是唯一的btw – Roecrew