代码之家  ›  专栏  ›  技术社区  ›  ravioli

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

  •  0
  • ravioli  · 技术社区  · 7 年前

    我正在组合依赖下拉列表(教师->班级->学生),并且在设置下拉列表的初始状态时遇到问题。代码如下:

    编辑合同.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>
    

    流量汇总表

    更新教师()
    -为“id\u teacheruserid”字段更新html(下拉选项)

    更新类()
    -从“id_teacheruserid”字段读取值(初始加载未定义)
    -为“id\u classid”字段更新html(下拉选项)

    更新学生()
    -从“id_classid”字段读取值(初始加载未定义)
    -为“id\u partyuserinfo”字段更新html(下拉选项)

    问题

    我看到的问题是脚本无法访问 onload() 打电话来。例如,这一行 update_classes() 以下内容:

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

    我加了一个 alert(teacherUserId) 就在这条线后面。在初始页面加载时,它返回 undefined 是的。但是,当我从“教师”下拉列表中选择其他值时,警报将显示预期值。

    我猜在开始的时候 加载() ,引用的字段值/选项(即 id_teacheruserid )尚未加载或提供。田地本身存在,但回归 未定义 价值观。不过,一旦这个函数完成,它们似乎就可以访问,菜单的行为也如预期的那样。

    我怎么能跑 update_teachers() 要进行初始加载并让它访问表单字段值?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Teobis    7 年前

    首先你可以使用

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

    而不是

    $(document.getElementById("id_teacheruserid"))
    

    第二

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

    $("#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();
              }
            })