2013-03-27 47 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