0

我正在制作一个书店网站(用于一个小型大学 javascript 项目)到目前为止,我所有的书籍信息都在一个 .js 文件中的数组中,看起来像这样..

var headings  = new Array(4);
headings [0] = "title"
headings [1] = "author"
headings [2] = "cat"
headings [3] = "bookid"
headings [4] = "cost"

var bookid   = new Array(6);
var title   = new Array(6);
var cat  = new Array(6);
var author  = new Array(6);
var cost  = new Array(6);
var desc  = new Array(6);

bookid [0] = "0001"
title [0]    = "For whom the tell bowls";
cat[0]   = "fiction";
author[0]   = "John Doe";
cost[0]   = "€12.99";
desc[0]   = "This book is frickin' amazing blah blah blah"

等等……有7本书……

现在我想在单击缩略图时生成一个表格,其中一列中包含作者、标题、成本等,另一列中包含实际对应的详细信息,这是代码

for(var j = 0; j < 5; j++) {
                row = document.createElement("tr");

                // Each with 2 cells
                for(var i = 0; i < 2; i++) {

                    var cell = document.createElement("td");

                    var temp = headings[j];
                    var temp2 = (temp + '[' + filename + ']');
                    if (i==1)
                    {var text = document.createTextNode(temp2);
                    }
                    else 
                    {var text = document.createTextNode(temp);}

顺便说一句,“文件名”被传递给这个函数,它是书的#,例如,0、1、2等等......现在,页面上显示的内容是正确的......对于第0本书,我得到......

title   title[0]
author  author[0]
cat         cat[0]
bookid  bookid[0]
cost    cost[0]

对于第一本书,我得到

title   title[1]
author  author[1]
cat         cat[1]
bookid  bookid[1]
cost    cost[1]

等等,但细节不会被解释为数组中的实际变量。我猜该解决方案与“innerHTML”有关,或者可能以某种方式转换我的变量..

如果有人知道这个问题的解决方案,将不胜感激!..我计划今天完成这个网站并转移到其他更重要的事情上(因为这个项目不值得很多标记)但是把这个缺陷留在那里会来烦我!

4

2 回答 2

3

您现在解决此问题的方法是(尝试)按名称访问变量,例如您想用来"title"查找名为title. 不要这样做。您最终会污染全局范围并依赖于window访问这些变量,或者您将落入eval魔鬼之手。

这是一个更好的主意:制作物品来存放您的书籍。然后一本书看起来像:

var book = {
    title: "Foo",
    author: "Bar",
    cat: "Baz",
    bookid: 123456,
    cost: "One hundred billion dollars"
};

更好的是定义一种类型的书籍:

function Book(title, author, cat, bookid, cost) {
    this.title = title;
    this.author = author;
    this.cat = cat;
    this.bookid = bookid;
    this.cost = cost;
}
var book = new Book("Foo", "Bar", "Baz", 123456, "One hundred billion dollars");

您可以将这些书籍存储到单个书籍数组中:

var books = [book1, book2, book3, ...];

突然之间,做一张桌子就变得容易了!

// Create or get a table
var table = document.createElement("table");

// Loop over the books array
for (var i=0, l=books.length; i < l; ++i) {
    // Get the current book
    var book = books[i];

    // Create a table row
    var row = document.createElement("tr");

    // Loop over the *properties* of the book
    for (var propertyName in book) {
        // Skip inherited properties
        if(!book.hasOwnProperty(propertyName)) continue;

        // Get the *property value*
        var property = book[propertyName];

        // Create a table cell and append to the row
        var textNode = document.createTextNode(property);
        var cell = document.createElement("td");
        cell.appendChild(textNode);
        row.appendChild(cell);
    }
    // Append the row to the table
    table.appendChild(row);
}

您甚至可以使用一个 book 元素创建表格标题:

// Some book to loop over its property names
var someBook = books[0];

var row = document.createElement("tr");
// Loop over the book properties
for(var propertyName in someBook) {
    // Now placing the *property name* in a text node
    var textNode = document.createTextNode(propertyName);
    var header = document.createElement("th");
    cell.appendChild(textNode);
    row.appendChild(header);
}
table.appendChild(row);

更新:更好地控制标题

正如丹尼斯建议的那样,您可能希望对标题进行更多控制。您不想显示"cat"为图书类别的标题,您想要更具可读性的内容。此外,您可能不想显示存储在书籍对象上的所有属性。在这种情况下,您可以存储标题以显示在另一个对象中,并添加有关这些标题的更多信息:

var headings = {
    title: {
        text: "Book title"
    },
    author: {
        text: "Author"
    },
    cat: {
        text: "Category"
    },
    bookid: {
        text: "ID"
    },
    cost: {
        text: "Price"
    }
};

在您的数据循环中,您将遍历属性headings而不是book.

// Loop over the properties to display
for (var propertyName in headings) {
    // Get the property value
    var property = book[propertyName];

    // [snipped]
}

在您的标题循环中,您将使用headings[propertyName].textas display name 而不是propertyName. 您将不再需要 book 实例,因此someBook可以删除该变量。

// Loop over the book properties
for(var propertyName in headings) {
    var headingName = headings[propertyName].text;
    var textNode = document.createTextNode(headingName);

    // [snipped]
}
于 2012-06-03T16:34:55.563 回答
1

你的问题在这里:

var temp2 = (temp + '[' + filename + ']');

您正在连接字符串;而不是 JavaScript 语句title[1],您最终得到的是字符串"title[1]"

您应该做的是使用构造函数创建一个对象并构建一个对象数组,而不是维护几个并行数组

function Book(title, author, cat, id, cost) {
    this.title = title;  //for each variable
}

var arrayOfBooks = [];
arrayOfBooks.push( new Book( "The Great Gatsby", "F. Scott Fitzgerald", "Fiction", 1, 5000.00));
//and so on for each book.

当您构建表时:

var book = arrayOfBooks[filename];
var temp = headings[j];
var temp2 = book[temp]; //Use brackets instead of concatenating strings.

另一个提示:如果您只是切换 if 语句,则内部循环是不必要的。您可以只创建两个单元格并在每个单元格中放置必要的文本值。

于 2012-06-03T16:37:41.443 回答