查找.click函数的类

finding the class of .click function

本文关键字:函数 click 查找      更新时间:2023-09-26

我有一个字符串对象的书,我已经从JSON对象。这个Book对象有三个键值对:Title、Author和URL。我使用for循环来读取每个对象,并将对象的标题作为html页面上的按钮。但是当按钮被点击时,我希望书的URL被提醒。当我读取对象时,我创建Books对象并将其推入数组以供以后使用。但是我不能使用。click()方法,URL不正确。请参阅代码以更好地理解。: -)

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。"长度"不起作用?提前感谢你的帮助,非常感谢。: -)

使用立即调用的函数表达式创建闭包应该可以达到目的。只需替换这个:

$(htmlString).appendTo(attachPoint).click(function () {
    loadBook(URL);
});
与这个:

(function(URL) {
    $(htmlString).appendTo(attachPoint).click(function () {
        loadBook(URL);
    });
})(URL);
在匿名函数作用域中的

URL将获得传递给它的值,该值将是for循环迭代的正确值。

在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