【问题标题】:Javascript display problems with dynamic dropdowns动态下拉列表的 Javascript 显示问题
【发布时间】:2014-08-15 19:54:33
【问题描述】:

专家!我对两个动态下拉菜单有一些问题。这是我的小提琴:

Demo

这是我的 jQuery 和 Javascript:

var num_rows = 1;
var num_tests = 1;
var myArray = new Array();

function firstSelection(id) {
    var index = id.replace( /\D+/g, '');
    var item = $("#select" + index + "").val();
    var object = item.replace(/\d/g, "");

    var table = $("#test");

    if(object == 'analize') {
        table.find('tr').each(function(i) {
            $("#selectTest" + i + "").empty();
            $("#selectTest" + i + "").append("<option value=''/><option value='analizetest1'>AnalizeTest1</option><option value='analizetest2'>AnalizeTest2</option><option value='analizetest3'>AnalizeTest3</option>");
        });
    }
    else if(object == 'create') {
        table.find('tr').each(function(i) {
            $("#selectTest" + i + "").empty();
            $("#selectTest" + i + "").append("<option value=''/><option value='createtest1'>CreateTest1</option><option value='createtest2'>CreateTest2</option>");
        });
    }
    else if(object == 'draft') {
        table.find('tr').each(function(i) {
            $("#selectTest" + i + "").empty();
            $("#selectTest" + i + "").append("<option value=''/><option value='drafttest1'>DraftTest1</option><option value='drafttest2'>DraftTest2</option><option value='drafttest3'>DraftTest3</option>");
        });
    }
    else {
        table.find('tr').each(function(i) {
            $("#selectTest" + i + "").empty();
        });
    }
}

$(document).ready(function() {
    $("#addObjekt").click(function() {
        num_rows = $("#objectTable tr").length;

        $("#objectTable").append("<tr id='objectRow" + num_rows + "'><td><input class='text' type='text' id='pbz" + num_rows + "' name='pbz" + num_rows + "' value='" + num_rows + "' readonly/></td><td><select id='select" + num_rows + "'><option/><option value='analize" + num_rows + "'>Analize</option><option value='create" + num_rows + "'>Create</option><option value='draft" + num_rows + "'>Draft</option></select></td><td><button type='button' id='selectButton" + num_rows + "' onclick='firstSelection(id);'>Select</button></td><td><button type='button' id='copy" + num_rows + "'>Copy</button></td></tr>");  
    });

    $("#deleteObjekt").click(function() {
        var row = $("#objectTable tr").length - 1;

        if(row > 1) {
            $("#objectRow" + row + "").remove();
            return false;
        }
        else {
            // do nothing
        }
    });

    $("#addTest").click(function() {
        num_tests = $("#test tr").length;

        $("#test").append("<tr id='testRow" + num_tests + "'><td><input class='text' type='text' id='zaehler" + num_tests + "' name='zaehler" + num_tests + "' value='" + num_rows + "-" + num_tests + "' readonly/></td><td><select id='selectTest" + num_tests + "'></select></td><td><button type='button' id='parameter" + num_tests + "'>Parameter</button></td><td></td><td></td></tr>");
    });

    $("#deleteTest").click(function() {
        var test_row = $("#test tr").length - 1;

        if(test_row > 1) {
            $("#testRow" + test_row + "").remove();
            return false;
        }
        else {
            // do nothing
        }
    });
});

function showMatrix() {
    num_rows = $("#objectTable tr").length - 1;
    num_tests = $("#test tr").length;

    for(var x = 0; x < num_rows; x++) {
        myArray[x] = new Array();
        myArray[x] = $("#select" + (x + 1) + "").val();

        for(var z = 0; z < num_tests; z++) {
            myArray[x][z] = firstSelection.item + firstSelection.index;
        }

    }

    alert(myArray);
}

问题是:

  1. 第二个下拉列表尚未根据第一个下拉列表的选择进行填充。由于某种原因,它在小提琴中无法正常工作,但在我使用的环境中运行良好。
  2. 如何更改代码,以便我看到第二个下拉列表也填充了以后添加的新行,而不仅仅是已经存在的行?
  3. 最后,我希望右侧的行仅“附加”到左侧链接到的单个对象。这意味着在左侧选择一个对象应该只显示其各自的测试。我对 Javascript 不是很流利,我从创建一个二维数组的想法开始,但被卡住了。

我知道这可能有点过分,但我非常感谢任何建议。谢谢!

【问题讨论】:

  • firstSelection 定义在哪里???... myArray[x][z] = firstSelection.item + firstSelection.index;
  • 它应该是对 firstSelection 函数中参数的外部引用。

标签: javascript jquery arrays dynamic


【解决方案1】:

确保函数firstSelection 在范围内。将该函数移入

$(document).ready(function()
{
    //...
});;

如果您的代码正确,它将起作用。

我建议这样做是因为我在运行您的代码时遇到了以下错误:

Uncaught ReferenceError: firstSelection is not defined 

好的,试试这个。这是工作。在此之前编辑 HTML 和 JS,如下所示:

HTML:

<table id="panel" class="panel">
        <tr>
            <td>
                <table id="objectTable" class="objectTable">
                    <tr id="initial">
                        <td width="20px">Number</td>
                        <td>Object</td>
                        <td align="right"><button type="button" id="addObjekt" href="#">+</button><button type="button" id="deleteObjekt" href="#">-</button></td>
                        <td></td>
                    </tr>
                    <tr id="objectRow1">
                        <td><input class="text" type="text" id="pbz1" name="pbz1" value="1" readonly/></td>
                        <td><select id="select1">
                            <option/>
                            <option value="analize1">Analize</option>
                            <option value="create1">Create</option>
                            <option value="draft1">Draft</option>
                        </select></td>
                        <td><button type="button" id="selectButton1">Select</button></td>
                        <td><button type="button" id="copy1">Copy</button></td>
                    </tr>
                </table>
            </td>
            <td>
                <table id="test" class="test">
                    <tr>
                        <td>Subnumber</td>
                        <td>Test <button type="button" id="addTest" href="#">+</button><button type="button" id="deleteTest" href="#">-</button></td>
                        <td></td>
                        <td></td>
                    </tr>
                    <tr id="testRow1">
                        <td><input class="text" type="text" id="zaehler1" name="zaehler1" value="1-1" readonly/></td>
                        <td><select id="selectTest1">
                        </select></td>
                        <td><button type="button" id="parameter1">Parameter</button></td>
                        <td></td>
                    </tr>
                </table>
            </td>
        </tr>
    </table>

JS:

var num_rows = 1;
var num_tests = 1;
var myArray = new Array();
var globalIndex = 0;
var globalObject = '';

$(document).ready(function() {     

    $('#selectButton1').click(function(){
       firstSelection(this.id);
    });

    function firstSelection(id) {
    var index = id.replace( /\D+/g, '');
    var item = $("#select" + index + "").val();
    var object = item.replace(/\d/g, "");
    globalIndex = index;
    globalObject = object;
    var vars = {index: index, item: item};

    //var table = $("#test");

    document.getElementById("zaehler1").value = index + '-1';

    if(object == 'analize') {
        $("#selectTest1").empty();
        $("#selectTest1").append("<option value=''/><option value='analizetest1'>AnalizeTest1</option><option value='analizetest2'>AnalizeTest2</option><option value='analizetest3'>AnalizeTest3</option>");
    }
    else if(object == 'create') {
        $("#selectTest1").empty();
        $("#selectTest1").append("<option value=''/><option value='createtest1'>CreateTest1</option><option value='createtest2'>CreateTest2</option>");
    }
    else if(object == 'draft') {
        $("#selectTest1").empty();
        $("#selectTest1").append("<option value=''/><option value='drafttest1'>DraftTest1</option><option value='drafttest2'>DraftTest2</option><option value='drafttest3'>DraftTest3</option>");
    }
    else {
        $("#selectTest1").empty();
    }

    return vars;
}

    $("#addObjekt").click(function() {
        num_rows = $("#objectTable tr").length;

        $("#objectTable").append("<tr id='objectRow" + num_rows + "'><td><input class='text' type='text' id='pbz" + num_rows + "' name='pbz" + num_rows + "' value='" + num_rows + "' readonly/></td><td><select id='select" + num_rows + "'><option/><option value='analize" + num_rows + "'>Analize</option><option value='create" + num_rows + "'>Create</option><option value='draft" + num_rows + "'>Draft</option></select></td><td><button type='button' id='selectButton" + num_rows + "' onclick='firstSelection(id);'>Select</button></td><td><button type='button' id='copy" + num_rows + "'>Copy</button></td></tr>");  
    });

    $("#deleteObjekt").click(function() {
        var row = $("#objectTable tr").length - 1;

        if(row > 1) {
            $("#objectRow" + row + "").remove();
            return false;
        }
        else {
            // do nothing
        }
    });

    $("#addTest").click(function() {
        num_tests = $("#test tr").length;

        $("#test").append("<tr id='testRow" + num_tests + "'><td><input class='text' type='text' id='zaehler" + num_tests + "' name='zaehler" + num_tests + "' value='" + globalIndex + "-" + num_tests + "' readonly/></td><td><select id='selectTest" + num_tests + "'></select></td><td><button type='button' id='parameter" + num_tests + "'>Parameter</button></td><td></td><td></td></tr>");

        $("#test").find('tr').each(function(i) {
            if(globalObject == 'analize') {
                $("#selectTest" + i + "").append("<option value=''/><option value='analizetest1'>AnalizeTest1</option><option value='analizetest2'>AnalizeTest2</option><option value='analizetest3'>AnalizeTest3</option>");
            }
            else if(globalObject == 'create') {
                $("#selectTest" + i + "").append("<option value=''/><option value='createtest1'>CreateTest1</option><option value='createtest2'>CreateTest2</option>");
            }
            else if(globalObject == 'draft') {
                $("#selectTest" + i + "").append("<option value=''/><option value='drafttest1'>DraftTest1</option><option value='drafttest2'>DraftTest2</option><option value='drafttest3'>DraftTest3</option>");
            }
            else {
               //nothing
            }
        });
    });

    $("#deleteTest").click(function() {
        var test_row = $("#test tr").length - 1;

        if(test_row > 1) {
            $("#testRow" + test_row + "").remove();
            return false;
        }
        else {
            // do nothing
        }
    });
});

function showMatrix() {
    num_rows = $("#objectTable tr").length - 1;
    num_tests = $("#test tr").length;

    for(var x = 0; x < num_rows; x++) {
        myArray[x] = new Array();
        myArray[x] = $("#select" + (x + 1) + "").val();

        for(var z = 0; z < num_tests; z++) {
            myArray[x][z] = firstSelection.item + firstSelection.index;
        }

    }

    alert(myArray);
}

Demo

【讨论】:

  • 错误信息消失了吗?因为它对我来说变化不大。
  • 在 $(document).ready(function() 中移动函数会忽略第一行的选定下拉项。
  • JSFiddle 以前无法填充我的第二个下拉列表,现在可以了。但是,二维数组仍然只显示对象值,它不插入测试值(第二维)。有什么想法吗?
  • 另外,如何根据二维数组显示/隐藏行和/或表格?
【解决方案2】:

方法showMatrix不能像这样访问方法firstSelection的局部变量。

要使函数showMatrix 中的变量在函数firstSelection 中可见,您有三个选择:

  • 使其成为全球性的,
  • 使其成为对象属性,或
  • showMatrix 调用firstSelection 时将其作为参数传递。

第三个选项可能是最好的选项,不建议使用全局变量,即使项目属性非常优化,它也可能不是最适合您的情况。

只需确保firstSelection 从中返回您需要的变量并在showMatrix 中访问它们。你也可以让它返回一个包含你需要的变量值的对象。

function firstSelection(id) {
    var index = id.replace( /\D+/g, '');
    var item = $("#select" + index + "").val();
    // ... some code
    var vars = {index: index, item: item};
    return vars;

【讨论】:

  • 感谢您的建议!我正在研究最后一个,我也认为这是最好的解决方案。但是,我的数组仍然没有对第二个下拉选择做任何事情......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
相关资源
最近更新 更多