javascript - 无法在 JavaScript 中使用 onload() 访问表单元素

标签 javascript forms field onload

我正在将依赖的下拉菜单(教师 -> 类(class) -> 学生)放在一起,并且在设置下拉菜单的初始状态时遇到问题。代码如下:

edit_contract.html

{% load crispy_forms_tags %}    
<div>
    <form method="post" id="contractForm" novalidate 
        data-teachers-url="{% url 'wakemeup:ajax_load_teachers' %}" 
        data-classes-url="{% url 'wakemeup:ajax_load_classes' %}" 
        data-students-url="{% url 'wakemeup:ajax_load_students' %}" 
    >
        {% crispy form %}
    </form>
</div>

<script>
    // Update class drop-down when teacher changes
    $("#id_teacheruserid").change(function () {
        update_classes($(this))
      });

    // Update students drop-down when class changes
    $("#id_classid").change(function () {
        update_students($(this))
      });

    function update_teachers() {
        // Get form values
        var url = $("#contractForm").attr("data-teachers-url");
        var contractId = $(document.getElementById("id_contractid")).val();

        $.ajax({                             // initialize AJAX request
          url: url,                         
          data: {
            'contractid': contractId
          },
          success: function (data) {            
            $("#id_teacheruserid").html(data);  // Update "teacheruserid" field
          }
        })

        update_classes(); // Update classes drop-down
    };

    function update_classes() {
        // Get form values
        var url = $("#contractForm").attr("data-classes-url");
        var teacherUserId = $(document.getElementById("id_teacheruserid")).val();
        var contractId = $(document.getElementById("id_contractid")).val();

        $.ajax({                            // initialize AJAX request
          url: url,                         
          data: {
            'teacheruserid': teacherUserId, 
            'contractid': contractId
          },
          success: function (data) {        
            $("#id_classid").html(data);       // Update "classid" field
          }
        })

        update_students(); // Update students drop-down
    };

    function update_students() {
        // Get form values
        var url = $("#contractForm").attr("data-students-url");
        var classId = $(document.getElementById("id_classid")).val();
        var contractId = $(document.getElementById("id_contractid")).val();

        $.ajax({                                // initialize AJAX request
          url: url,                                 
          data: {
            'classid': classId,                     
            'contractid': contractId
          },
          success: function (data) {                
            $("#id_partyuserinfo").html(data);      // Update "partyuserinfo" field
          }
        })
    };

    window.onload = function() {
        // Initial load of drop-down menus
        update_teachers(); // Cascades to update_classes() and update_students()
    };      
</script>

流程摘要

update_teacher()
- 更新“id_teacheruserid”字段的 HTML(下拉选项)

update_classes()
- 从“id_teacheruserid”字段读取值(初始加载未定义)
- 更新“id_classid”字段的 HTML(下拉选项)

update_students()
- 从“id_classid”字段读取值(初始加载未定义)
- 更新“id_partyuserinfo”字段的 HTML(下拉选项)

问题

我看到的问题是脚本无法访问 onload() 调用中表单字段中的值。例如,update_classes() 中的这一行:

    var teacherUserId = $(document.getElementById("id_teacheruserid")).val();

我直接在此行之后添加了一个alert(teacherUserId)。在初始页面加载时,它返回undefined。但是,当我从教师下拉列表中选择不同的值时,警报会显示预期值。

我的猜测是,在最初的 onload() 中,引用的字段值/选项(即 id_teacheruserid)尚未加载或可用。这些字段本身存在,但返回未定义值。不过,一旦此功能完成,它们似乎就可以访问并且菜单的行为符合预期。

如何运行 update_teachers() 来执行初始加载并让它访问表单字段值?

最佳答案

首先你可以使用

$("#id_teacheruserid").val();

而不是

$(document.getElementById("id_teacheruserid"))

第二

您需要从下拉列表中获取选项选定的值

$("#id_teacheruserid").find(":selected").val() 

获取选定的ID

第三,成功回调时需要调用下一个下拉填充函数

$.ajax({                             // initialize AJAX request
          url: url,                         
          data: {
            'contractid': contractId
          },
          success: function (data) {            
            $("#id_teacheruserid").html(data);  // Update "teacheruserid" field
             update_classes();
          }
        })

关于javascript - 无法在 JavaScript 中使用 onload() 访问表单元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51165224/

相关文章:

JavaScript 正则表达式将字符串转换为对象

javascript - 在 Vue Chart js 中使用计算属性时出现无限循环

javascript - 在 jQuery 中获取引导表中单击行的行号

javascript - PHP/如何使用提交按钮发布下拉菜单选项

javascript - 对输入字段创 build 置限制?

javascript - 错误代码 : "auth/internal-error" message: "Photo URL too long." Prototype N

css - Bootstrap 样式表单内联

forms - TForm.Close 和通过表单句柄关闭有什么区别?

mysql - 将针对一张表的多个查询合并到一个结果集的多个字段中

android - 在 Android 中,如何将应用程序的输入字段识别为密码字段?