2013-03-27 51 views
0

我有一個字符串對象的書籍,我從一個JSON對象。此Book對象具有三個Key值對,Title,Author和URL。我使用for循環來讀取每個對象,並將對象的標題作爲一個按鈕放在html頁面上。但是當按鈕被點擊時,我想要提醒書的URL。當我讀取我製作Books對象的對象並將其推入數組中供以後使用時。但我無法使用.Click()方法的URL是不正確的。請參閱代碼以獲得更好的理解。 :-)找到類.click功能

for (i = 0; i < 6; i++) //I know that there is only 65 Books..jsonString.books.lenght is not working. 
{ 
    var title = jsonString.books[i].title; 
    var classname = title.replace(/\s/g, ""); 
    var author = jsonString.books[i].author; 
    var URL = jsonString.books[i].url; 
    var htmlString = '<div class="' + classname + '"><input type="button" value="' + title + '"></div>'; 
    $(htmlString).appendTo(attachPoint).click(function() { 
     loadBook(URL); 
    }); 

    OneBook = new Book(author, title, URL); 
    arr.push(OneBook); 
} 

attachpoint是在HTML文件的引用,我從

var attachpoint=document.querySelector('.buttonAttachPoint'); 

了所以在上面的代碼中,我得到的點擊URL總是在jsonString的最後一個對象。這是for循環的情況。那麼有沒有一種方法可以獲得Div的類名,它具有onclick或按鈕的標題,以便我可以從我創建的對象數組中獲取URL?或者有更簡單的方法。也可以指出爲什麼「jsonString.books.lenght」不工作?在此先感謝。:-)所有的幫助非常感謝。 :-)

+4

'jsonString.books.lenght'應該是'jsonString.books.length'。我還在你的'for'循環中添加了一個'''',你希望可以省略。 – Blazemonger 2013-03-27 16:29:14

回答

2

使用立即調用的函數表達式來創建閉包應該能夠實現。與此

$(htmlString).appendTo(attachPoint).click(function() { 
    loadBook(URL); 
}); 

:匿名函數的範圍內

(function(URL) { 
    $(htmlString).appendTo(attachPoint).click(function() { 
     loadBook(URL); 
    }); 
})(URL); 

URL將傳遞給它的價值,這將是for循環的該迭代的正確值只需更換這。

+0

工作就像一個魅力!非常感謝安東尼......你能指導我如何在javascript中學習所有這些技巧嗎? – user2208533 2013-03-27 17:07:55

1

在ECMAScript中,變量的作用範圍是它們的功能,而不是任何塊。

綁定到click的函數在整個循環的上下文中關於URL的閉包在循環迭代的上下文中不超過URL

這意味着只要有任何函數被調用,URL就會有循環設置的最後一個值。

您需要爲每個循環凍結URL的值。要做到這一點的方法之一是在別處一個函數,它URL作爲參數,並返回關閉了它的功能,即:

function getBookLoader(url) { 
    return function(){ 
    loadBook(url); 
    }; 
} 

然後,您可以用下面的更換你的... .click行:

$(htmlString).appendTo(attachPoint).click(getBookLoader(URL)) 

要回答標題中的問題,事件的target屬性包含調度事件的對象,並且currentTarget屬性包含其當前正在評估其偵聽器的對象。 currentTarget應該是div有問題。

+0

謝謝保羅。我對currentTarget沒有任何想法。 – user2208533 2013-03-27 17:27:41