【问题标题】:Javascript causes select input to get stuckJavascript导致选择输入卡住
【发布时间】:2013-10-04 20:35:22
【问题描述】:

我有一个 JavaScript 函数,它根据类别和子类别系统刷新选择中包含的选项。这些选择是由一个基于 mssql 数据库内容的 php 函数生成的。

为了查询类别的层次结构,我使用 php 将此信息存储到二维数组中,然后使用 json_encode 将此数组传递给 JavaScript。

我的函数按预期工作,但是当用户希望更改选择中的值时,他们不能!他们只能看到可用的选项,但不能选择其中一个。

这是我的 JavaScript 函数:

function refresh_values() {
    //the dropdown_array is my array conatining the heirarchy information

    var options = "<option value=\"Tous\">Tous</option>"; //default "All" choice
    var dup_array = new Array();                          //to prevent doubles

    if (document.getElementById('bloc').value != 'Tous') {

        for (var i = 0; i <dropdown_array.length; i++) {
            if (dropdown_array[i][0] == document.getElementById('bloc').value && !(dropdown_array[i][2] == null) && !(contains(dup_array, dropdown_array[i][2]))) {
                dup_array.push(dropdown_array[i][2]);
                options += "<option value=\"" + dropdown_array[i][2] + "\">" + dropdown_array[i][2] + "</option>";
            }
        }
    }else {
        for (var i = 0; i <dropdown_array.length; i++) {
            if (!contains(dup_array, dropdown_array[i][2])) {
                dup_array.push(dropdown_array[i][2]);
                options += "<option value=\"" + dropdown_array[i][2] + "\">" + dropdown_array[i][2] + "</option>";
            }
        }
    }
    document.getElementById('processus').innerHTML = options;

    if (document.getElementById('processus').value != 'Tous') {

        for (var i = 0; i <dropdown_array.length; i++) {
            if (dropdown_array[i][2] == document.getElementById('activite').value && !(dropdown_array[i][4] == null) && (!contains(dup_array, dropdown_array[i][4]))) {
                dup_array.push(dropdown_array[i][4]);
                options += "<option value=\"" + dropdown_array[i][4] + "\">" + dropdown_array[i][4] + "</option>";
            }
        }
    }else {
        for (var i = 0; i <dropdown_array.length; i++) {
            if (!contains(dup_array, dropdown_array[i][4])) {
                dup_array.push(dropdown_array[i][4]);
                options += "<option value=\"" + dropdown_array[i][4] + "\">" + dropdown_array[i][4] + "</option>";
            }
        }        
    }
    document.getElementById('activite').innerHTML = options;
}

这是我的“包含”功能:

function contains(a, obj) {
    for (var i = 0; i < a.length; i++) {
        if (a[i] === obj) {
            return true;
        }
    }
    return false;
}

这是“构建”选择的 html/php

<!--The script after each input is to preserve it's value after the form is submitted
I've already identified this as being irrelevant to my problem via testing-->

<form id="search" method="GET">
    <span class="form_label">Numero: </span>
    <input type="text" name="numero" value="<?php echo isset($_GET['numero']) ? $_GET['numero'] : '' ?>"/>
    <br>

    <span class="form_label">Bloc processus: </span>
    <?php echo generate_dropdown("table_name", "nom_bloc_francais", "bloc");?>

    <script type="text/javascript">
        document.getElementById('bloc').value = "<?php echo $_GET['bloc'];?>";
    </script>
    <br>

    <span class="form_label">Processus: </span>
    <?php echo generate_dropdown("table_name", "nom_processus_francais", "processus");?>

    <script type="text/javascript">
        document.getElementById('processus').value = "<?php echo $_GET['processus'];?>";
    </script>
    <br>

    <span class="form_label">Activite: </span>
    <?php echo generate_dropdown("table_name", "nom_activite_francais", "activite");?>

    <script type="text/javascript">
        document.getElementById('activite').value = "<?php echo $_GET['activite'];?>";
    </script>
    <input type="submit" value="Search!"/>
</form>

这是最初生成选择的 php 函数:

function generate_dropdown($table, $field, $name) {
        $options = "<option value=\"Tous\">Tous</option>";
        $query = "SELECT DISTINCT " . $field . " FROM " . $table. " ";

        $filter=mssql_query($query);
        while($row = mssql_fetch_array($filter)) {
            $options .= "<option value=\"". $row[$field] . "\">" . $row[$field] . "</option>";
        }

        $menu='
            <select name="' . $name . '" class="filter" id="' . $name . '" onchange="refresh_values()">
              ' . $options . '
            </select>';

        return $menu;
}

任何人都可以请至少指出我正确的方向,为什么用户不能从“Tous”更改选择的值?

更多信息: 当我删除 JavaScript 函数时,可以更改选择的值。

谢谢

【问题讨论】:

  • 不太确定(示例中有很多代码),但您确定要刷新 onchange 事件中的值吗?每次有人在下拉列表中进行选择时都会运行它,这意味着它会在发生这种情况时刷新选项列表。这听起来更像是您想将此代码放在 $(document).ready() 处理程序或类似的处理程序中,即使其在页面完全加载后运行。
  • 是的!这是该功能的目的,我需要刷新选项列表,使其在“运行时”是动态的,无需重新加载。抱歉所有代码顺便说一句,肯定太多了,但我觉得信息太多总比不够好
  • 是的,我明白了,但是当我现在阅读您的代码时,我发现当您的两个下拉菜单都被更改时,您调用了 refresh-method - 它反过来修改了processus 元素。它是否正确?在我看来,这听起来至少有点奇怪。 :) 无论如何,我有另一个想法,将它作为答案发布,看看它是否有效。
  • 不,我认为我的想法行不通。正在考虑是否可以取消 onchanged 或类似的东西,但是......这可能是我最后的错误开始。
  • 我突然想到,我们并不真正了解您所说的“无法改变”是什么意思。如果您的意思是当用户选择一个新值时,下拉菜单会重置为默认值,那么很明显,您在代码中的某处覆盖了默认行为。我会删除足够的代码以便选择有效,然后将其逐个添加回来....

标签: javascript php html sql-server dom


【解决方案1】:

设置 innerHTML 属性并不是构建 Select 控件的好方法。尝试在生成 innerHTML 的循环中动态构建控件。

var drpDown= document.getElementById('activite');
var newOp = document.createElement("option");
newOp.text = "Txt";
newOp.value = "1";
drpDown.options.add(newOp);

【讨论】:

  • 你说得对。但它真的能解决原来的问题吗? :)(当然,这可能是朝着正确方向迈出的一大步,因为众所周知,以正确方式做事的干净代码通常效果更好,但仍然......)
  • 好吧,我想知道你是否使用 IE:stackoverflow.com/questions/8557619/…
  • 难以置信的好点,伙计!我不是最初的海报,所以我不知道,但希望这可能是一个线索......
  • 好吧,我希望它可以在 IE 上运行,但我的大部分测试都是在 chrome 上进行的。现在正在实施您的解决方案。
  • 我已经实现了这个解决方案,但它并没有解决问题。还是谢谢
【解决方案2】:

我想通了。经过大量调试后,我意识到每次更改选择的值时都会调用此函数。这意味着无论我选择更改什么选择,它都会重新生成它。因此,当我更改它时,将重建选择并将值设置回默认值。

解决方法是简单地向函数添加一个参数来定义要更改的选择。

【讨论】:

  • 很高兴你能找到它。我认为您的代码还有其他方面需要改进;例如,生成选项的代码可能会被拆分为辅助函数。我很确定您可以通过遵循非常简单的步骤来大大减少代码大小(以及因此维护所涉及的复杂性)。这基本上是我在考虑的this hint
猜你喜欢
  • 2012-03-05
  • 2022-12-18
  • 2017-10-28
  • 1970-01-01
  • 2018-08-07
  • 2011-11-02
  • 1970-01-01
  • 2021-06-01
  • 2021-01-18
相关资源
最近更新 更多