2010-01-01 181 views
1

由于某种原因,这不起作用? 我想用ul#list填充一些项目,但它不起作用。Javascript无法正常工作?

var list = ""; 
for (var i = 0 ; i<=history.length; i++) { 
    list += "<li onclick=\"copyShortURL('"+history[i].shortURL+"');\"><div class=\"short\">"+history[i].shortURL+"</div><div class=\"long\">"+history[i].longURL+"</div></li>"; 
} 
document.getElementById('list').innerHTML = list; 

谁能告诉我什么错:( 我的意思是它没有做任何事情,没有列表项被放入名单?

PS这是mobilesafari只:)

+0

你的意思是不工作?这些项目没有被显示?你确定'历史'数组已填充? – 2010-01-01 12:40:25

+0

如果我提醒'history' json数组 - 它有4个[object object]'s出现,这是正确的,因为有4个项目:) – tarnfeld 2010-01-01 12:42:57

+0

实际上看不到你的代码有什么问题现在看起来不错对我来说。也许它是一个mobilesafari问题?考虑将其他适当的标签放在你的问题 – AnthonyWJones 2010-01-01 13:00:44

回答

-1

createElement方法仅使用元素名称,例如。 document.createElement("li")

因此,您要么在代码中使用一系列createElements和appendChilds以及少量赋值给innerHTML来构建DOM。或者,通过最终分配给它的innerHTML,将HTML构建为一个字符串以附加到“list”。

这里是字符串形式: -

var asHTML = []; 
for (var i = 0 ; i<=history.length; i++) 
{ 
    asHTML.push("<li onclick=\"copyShortURL('"+history[i].shortURL+"');\"><div class=\"short\">"+history[i].shortURL+"</div><div class=\"long\">"+history[i].longURL+"</div></li>"); 
    document.getElementById("list").innerHTML += asHTML.join("\n"); 
} 
+0

这似乎不工作吗? – tarnfeld 2010-01-01 12:36:57

+0

在那里有一个虚假变种原来,删除,测试,在我的机器上工作不知道关于Iphone – AnthonyWJones 2010-01-01 12:56:12

+0

仍然没有:( – tarnfeld 2010-01-01 12:57:44

1

documentcreateElement方法花费你希望创建的元素名称一个字符串。然后,您可以使用DOM方法和属性来分配点击处理程序,然后使用innerHTML或DOM方法来创建内部元素。

您的循环中也有一个错误:当您检查history阵列的长度时,您需要<而不是<=

var ele, div, list = document.getElementById("list"); 

var createClickHandler = function(url) { 
    return function() { 
     copyShortURL(url); 
    }; 
} 

for (var i = 0, len = history.length; i < len; ++i) 
    { 
    ele = document.createElement("li"); 
    ele.onclick = createClickHandler(history[i].shortURL); 

    div = ele.appendChild(document.createElement("div")); 
    div.className = "short"; 
    div.appendChild(document.createTextNode(history[i].shortURL)); 

    div = ele.appendChild(document.createElement("div")); 
    div.className = "long"; 
    div.appendChild(document.createTextNode(history[i].longURL)); 

    list.appendChild(ele); 
    } 
+0

这似乎是最逻辑的...应该这个代码是否高于或低于元素? – tarnfeld 2010-01-01 12:41:37

+0

@anthony不要担心,它的一个webapp - 对于iPhone :) – tarnfeld 2010-01-01 12:42:15

+1

@tarnfeld:你不认为这个小块是值得的在你的问题中提到?长期以来,“不起作用”是什么意思? – AnthonyWJones 2010-01-01 12:45:07

0

我会使用DOM来追加孩子,然后添加classnames和事件处理程序给这些孩子。

这里是一个多浏览器功能我用

function addEventHandler(obj,eventName,handler){ 
    if (document.addEventListener){ 
     obj.addEventListener(eventName,handler,false); 
    } else if (document.attachEvent){ 
     obj.attachEvent("on"+eventName,handler); 


    } 
} 
creat an array for tyhe bew elementsa and divs; 
var elements = new Array(); 
var newDivsShort = new Array(); 
var newDivsLong = new Array(); 

then in your for loop you can, 

for (var i = 0 ; i<=history.length; i++) 
{ 
newDivsShort[i] = document.createElement('div'); 
newDivsLong[i] = document.createElement('div'); 

elements[i] = document.createElement('li'); 
newDivsShort[i].className = "short"; 
newDivsLong[i].className = "long"; 

elements[i].appendChild(newDivsShort[i]); 
elements[i].appendChild(newDivsLong[i]); 
addEventHandler(elements[i],click,copyShortURL(history[i].shortURL)); 

} 

您可能需要使用类似超时功能的格式传递一个paramater。