【问题标题】:Appending options to select using JQuery附加选项以使用 JQuery 进行选择
【发布时间】:2012-08-22 12:05:02
【问题描述】:

我有两个选择下拉菜单,其中第二个选择框的选项需要根据第一个选择进行更改。表格是

<form action="" method="post" >
        <div style="padding-bottom:6px;">
            <select id="portfolios" name="portfolio" style="width: 200px; height:25px;">
                <option selected="selected" value="default">Select Portfolio</option>
                {% for portfolio in portfolios %}
                    <option get-groups="{{ path('v2_pm_patents_getgroups') }}" value={{ portfolio.id }}>{{ portfolio.portfolioName }}</option>
                {% endfor %}
            </select>
            <span>OR</span>
            <a class="modalbox1" href="#inline1">[Add New Portfolio]</a>
        </div>

        <div style="padding-bottom:6px; display:none;" id="groups">
            <select id="portfolio-groups" name="portfolio-groups" style="width:200px; height:25px;">
                <option selected="selected" value="default">Select Portfolio Group</option>
            </select>
            <span> OR</span>
            <a class="modalbox2" href="#inline2">[Add New Group]</a>
        </div>
</form> 

最初,当我从第一个选择中选择一个选项时,第二个下拉列表是隐藏的,它变得可见。 我写的 JQuery 是

<script>
    $(document).ready(function(){
        $('#portfolios').change(function() {
            $('#groups').show();
            var id = $("#portfolios").val();
            var url = $('option:selected', this).attr("get-groups");
            var data = {PID:id};
            $.getJSON(url, data, function(result) {
                var options = $("#portfolio-groups");
                $.each(result, function(item) {
                    options.append($("<option />").val(item.id).text(item.name));
                });
            });
        });
    }); 
</script>

我调用的控制器方法是

public function getgroupsAction(Request $request){
    if ($request->isXmlHttpRequest()) {

        $id = $request->get("PID");
        $em = $this->getDoctrine()->getEntityManager();
        $portfolio_groups = $em->getRepository('MunichInnovationGroupPatentBundle:PmPatentgroups')
        ->getpatentgroups($id);
        echo json_encode($portfolio_groups);
        return new Response();
    }
}

我从我的查询和 JSON 对象中获得了正确的组。响应的对象看起来像

[{"id":"09c0d4b2-ac25-11e1-96a5-9787dec335c2","name":"Group 2","description":"No Description Provided for this Group","order":500000,"is_deleted":false}] 

在我的 JQuery 中,我将选项附加到选择框,但问题是它附加了选项但具有空值属性且没有文本。因此文本和 value 属性都不可见,只是添加了空选项。

我做错了什么?以及如何在附加选项之前清除选择框?

提前致谢

【问题讨论】:

  • 您是否尝试过在 $.each 调用中使用 console.log(item.id) 来查看您是否访问了正确的值?
  • 会在一个小时内试一试告诉你
  • item.id 和 item.name 都未定义

标签: php json jquery symfony


【解决方案1】:

看起来您将 JSON 响应包装在一个数组中。尝试访问 $.each 中的元素,例如 item[0].name 和 item[0].id

然后您需要考虑获取多个对象并遍历项目数组

【讨论】:

  • 如果我不知道长度如何循环?
  • 这是我得到的响应 [{"id":"04d0d4b2-ac25-11e1-96a5-9787dec335c2","name":"Group 1","description":"Description of Patent Group 1","order":56250000,"is_deleted":false},{"id":"9d4f6e5c-dd73-11e1-bed3-fbfe082dc761","name":"Group 3","description":"专利描述组 3","order":70312500,"is_deleted":false},{"id":"06d0d4b2-ac25-11e1-96a5-9787dec335c2","name":"组 2","description":"描述专利组 2","order":84375000,"is_deleted":false}]
  • 你应该知道长度,result.length 看看这个小提琴jsfiddle.net/a24LT
  • 如果您查看我的 JQuery,我使用了 $.getJSON(url, data, function(result)... 如果我采用您的解决方案,我需要这个吗?
  • 我的回复中有完全相同的数据,但是当我提醒它而不是给 4 时,它给了我 572...这就是我正在做的... $.ajax({ type: " POST",数据:数据,url:url,缓存:false,成功:function(data) { alert(data.length); } });
【解决方案2】:

在这种情况下,您不能使用.val()。你必须使用.attr("value",item.id)

【讨论】:

  • 您可以使用val 设置输入元素的值,例如输入文本、文本区域或选择。但是您不能使用它来设置属性,例如 option 值属性。
  • 因为 val() 不是用来设置元素的 value 属性的。而是通过将具有所需值的选项元素标记为选中来设置选择元素的值
  • 我同意@MarieLuise 我以前使用过这种语法来添加像这样的选项jsfiddle.net/yhf4S
  • 感谢您的回答和解释,我会尽快尝试,但没有人回答我关于在附加选项之前清除选择的第二个问题
  • 删除所有选项 $("#groups option").remove();删除一个特定的 $("#groups option[value='0']").remove();
【解决方案3】:

see this demo

$("#mSelect").append($("<option />").val('1').text('-- Select --'));

var myOptions = response.d;
                var mySelect = $("#MainContent_ddlnewType");
                mySelect.children().remove();
                //mySelect.append($("<option>").val("00").text("-- Select Type --"));
                for (var i = 0; i < myOptions.length; i++) {
                    var val = myOptions[i].Id;
                    var text = myOptions[i].Name;
                    mySelect.append($("<option>").val(val).text(text));
                }

【讨论】:

  • var data.result = [ {"Id": 10004, "PageName": "club"}, {"Id": 10040, "PageName": "qaz"}, {"Id": 10059, "PageName": "jjjjjjj"} ]; $.each(data.result, function(i, item) { alert(data.result[i].PageName); });​
  • 在你的情况下你只需要resonse,就是保存一个json数据
  • 顺便说一下 myOptions 是未定义的
猜你喜欢
  • 2012-10-07
  • 2018-02-26
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多