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冊あります…

ここで、作成者、タイトル、コストなどを 1 つの列に、実際の対応する詳細をもう 1 つの列に持つサムネイル画像をクリックすると、テーブルを生成したいと考えています。コードは次のとおりです。

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]

そして本1のために私は得る

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);
}

1つの本の要素を使用してテーブルの見出しを作成することもできます。

// 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].text、単に。の代わりに表示名として使用しますpropertyName。ブックインスタンスはもう必要ないので、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.

もう1つのヒント:とにかくifステートメントを切り替えるだけの場合は、内部ループは不要です。2つのセルを作成し、それぞれに必要なテキスト値を入れることができます。

于 2012-06-03T16:37:41.443 に答える