【问题标题】:Not getting values from Select Fields with jQuery不使用 jQuery 从选择字段中获取值
【发布时间】:2010-10-14 14:50:39
【问题描述】:

我正在尝试在我正在创建的网站中实现一些基本的 ajax 功能。我正在使用 Flask 微框架和 jQuery 来执行此操作。我对 python 有很多经验,Flask 是用什么写的,但对 javascript 却很少。这就是我决定使用 jQuery 的原因。 ;) Flask 文档中包含一个不错的example,我可以正常工作,但是当我将示例中的方法应用于我的代码时,我开始遇到问题,让 jQuery 正确填充查询字符串.本质上,它解析了我的一些表单元素,但不是全部。

我的 HTML 表单如下所示:

<form action method="GET" class="span-11 inline"> 
    <fieldset> 

    <div class='span-5'> 
    <label for="msat_size">Msat Size:</label> 
    </div> 

    <div class='span-5 last'> 
    <select id="msat_size" name="msat_size"><option value="mono">Mono</option><option value="di">Di</option><option value="tri">Tri</option></select> 
    </div> 

    <div class='span-5'> 
    <label for="msat_length">Msat Length:</label> 
    </div> 
    <div class='span-5 last'> 
    <input class="text" id="msat_length" maxlength="3" name="msat_length" size="3" style="width:48px" type="text" value="0" /> 
    </div> 

    <div class='span-5'> 
    <label for="msat_perfect">Perfect Msats:</label> 
    </div> 
    <div class='span-5 last'> 
    <input id="msat_perfect" name="msat_perfect" type="checkbox" value="y" /> 
    </div> 

    <div class='span-5'> 
    <label for="combine_loci">Combine Microsatellites:</label> 
    </div> 
    <div class='span-5 last'> 
    <input id="combine_loci" name="combine_loci" type="checkbox" value="y" /> 
    </div> 

    <div class='span-5'> 
    <label for="design_primers">Design Primers:</label> 
    </div> 
    <div class='span-5 last'> 
    <input id="design_primers" name="design_primers" type="checkbox" value="y" /> 
    </div> 

    <div class='span-5'> 
    <label for="tag_primers">Tag Primers:</label> 
    </div> 
    <div class='span-5 last'> 
    <select id="tag_primers" name="tag_primers"><option selected="selected" value="None">No Tag</option><option value="cag">CAG Tag</option><option value="m13">M13R Tag</option></select> 
    </div> 

    <div class='span-5 prepend-5 last'> 
            <button id="submit_msats" name="submit_msats" type="submit" value="submit_msats" class="button positive"> 
                <img src="/static/css/plugins/buttons/icons/tick.png" alt=""/> Submit
            </button> 
    </div> 
    </fieldset> 
</form>    

我的 javascript 看起来像这样:

<script type=text/javascript>
  $(function() {
    $('.button').bind('click', function() {
      $.getJSON('/query_result', {
        msat_size: $('input[id="msat_size"]').val(),
        msat_length: $('input[name="msat_length"]').val(),
        msat_perfect: $('input[name="msat_perfect"]').val(),
        combine_loci: $('input[name="combine_loci"]').val(),
        design_primers: $('input[name="design_primers"]').val(),
        tag_primers: $('input[name="tag_primers"]').val(),
        }, function(data) {
        $("#stat1").text(data.msat_size),
        $("#stat2").text(data.msat_length);
      });
      return false;
    });
  });
</script>

但是在我提交后,我的查询字符串看起来像这样:

/query_result?msat_length=0&msat_perfect=y&combine_loci=y&design_primers=y

我可以正确更改“msat_length”值,其他都没有。如果我在 javascript 的“msat_size”行中将 .val() 更改为 .text(),则名称将出现在查询字符串中,但没有值

/query_result?msat_size=&msat_length=0&msat_perfect=y&combine_loci=y&design_primers=y

任何关于如何解决此问题的想法将不胜感激。谢谢!

【问题讨论】:

    标签: jquery ajax forms field flask


    【解决方案1】:

    您应该尝试利用 jQuery 的 .serialize() 方法,而不是做所有这些复杂的工作。试试这样:

    $(function() {
        $('.button').bind('click', function() {
            $.getJSON('/query_result?' + $(this).closest('form').serialize(), function(data) {
                $("#stat1").text(data.msat_size), $("#stat2").text(data.msat_length);
            });
            return false;
        });
    });
    

    这是.serialize() 方法的文档:http://api.jquery.com/serialize/

    还有一个展示它的演示:http://jsfiddle.net/Ender/q3mdw/

    【讨论】:

      【解决方案2】:

      撇开你的序列化方法问题不谈,问题的直接原因是你错误地识别了一些表单元素:

      msat_size: $('select#msat_size').val(), // select, not input
      msat_length: $('input#msat_length').val(), // bracket notation unnecessary
      msat_perfect: $('input#msat_perfect:checked').val(), // using ID is better
      combine_loci: $('input#combine_loci:checked').val(), // use :checked
      design_primers: $('input#design_primers:checked').val(),
      tag_primers: $('select#tag_primers').val() // select, not input
      

      这假设您只需要选中复选框值。您当然可以添加条件逻辑以省略未选中的复选框,或者提供默认值。

      【讨论】:

        【解决方案3】:

        试试这个

          $(function() {
        
            $('#submit_msats').bind('click', function(ev) {
        
              ev.stopPropagation();
        
              var context = $('form'),
                  sendData =  {
                    msat_size: $('#msat_size', context).val(),
                    msat_length: $('#msat_length', context).val(),
                    msat_perfect: $('#msat_perfect', context).val(),
                    combine_loci: $('#combine_loci', context).val(),
                    design_primers: $('#design_primers', context).val(),
                    tag_primers: $('#tag_primers', context).val()
                  };
        
              alert(sendData.msat_length);
        
              $.getJSON('/query_result', sendData, function(data) {
        
                $("#stat1").text(data.msat_size),
                $("#stat2").text(data.msat_length);
        
              });
        
              return false;
            });
          });
        

        【讨论】:

        • 感谢大家的帮助。我想我会接受 Ender 的序列化建议。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        • 2012-10-24
        • 1970-01-01
        • 2011-03-06
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        相关资源
        最近更新 更多