2010-01-01 183 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。