【问题标题】:How can I retrieve jQuery change events from dynamic form elements in PHP?如何从 PHP 中的动态表单元素中检索 jQuery 更改事件?
【发布时间】:2010-11-04 10:49:30
【问题描述】:

为了选择类别,我想使用下拉列表。每个列表包含一个级别的类别。所以它是:顶级、子、子子、子子子等。每个级别都是通过我的脚本getcat.php 动态检索的,它显示了一个<select> 对象。

目前的检索使用以下代码。但是,由于它是一个表单,我想获取最后一个选择的值,这样我就可以获得类别 ID。这对我不起作用。我试过$("select:last option:selected"),但这不适用于新插入的元素。

选择类别后,必须显示一个输入字段,用户可以在其中创建自己的子类别(在所选类别内)。这也不适用于新元素。

现在,我尝试使用 .live,但它不支持更改事件。各位大神有什么改进方法吗?

目前我有以下代码:

$("select").bind("change", function(){
    $(this).nextAll().remove();
    var value = $(this).val();
    $("#currentcat").val(value);
    if($("select:last option:selected").hasClass('makenew')) {
        $("#newcat").show();
    }
    else if($("select:last option:selected").hasClass('disabled')) { }
    else {
    $.get("getcat.php", { c: value },
        function(data){
            $("#getcats").append(data);
        });
    $("#newcat").hide();
    }    
});

然而,正如你所见,它不是美女。

【问题讨论】:

    标签: jquery forms select live bind


    【解决方案1】:

    如果您希望新的 <option>s 绑定到 DOM 并在不同的浏览器中工作,我建议您使用 document.createElement 和 document.createTextNode 将它们附加到您的选择中,如下所示:

    var opt = document.createElement('option');
    opt.value = "someValue";
    opt.appendChild(document.createTextNode("someText"));
    $('#currentcat').append(opt);
    

    因此,您应该使用 $.getJSON 来获取 JSON 对象,而不是使用 $.get,该对象包含您将附加到选择的选项的值和文本属性。从服务器检索到的 JSON 对象应如下所示:

                    { "options" : [   
                                        { "text" : "Fishing",  // First element
                                          "value"  : "5" },
                                        
                                        { "text" : "Skiing",  // Second Element
                                          "value"  : "70" }
                                   ]
                    }
    

    迭代对象看起来像这样:

    $.getJSON("getcat.php", { c: value }, function(json) {
        var $select = $('<select></select>).attr('id','currentcat').attr('name','currentcat').hide(); 
        $.each(json.options, function(i, item) {
            var opt = document.createElement('option');
            opt.value = item.value;
            opt.appendChild(document.createTextNode(item.text));
            $('#currentcat').append(opt);        
        });
        $("#newcat").hide();
        $('#someDiv').append($select).show();
    }); 
    

    以上内容未经测试,反映了我对您问题的理解。希望对您有所帮助。

    【讨论】:

    • 谢谢卡里姆!这是有道理的。但是,json 输出也很可行。这只会产生选择,对吗?我也希望它创建一个选择元素。所以创建一个元素'select'然后 $('#currentcat').next().append(opt)?提示?谢谢..
    • 是的,你是对的。对不起,我省略了。请看我的编辑,记住我没有测试过。基本上,我正在动态创建一个隐藏的选择元素,将新创建的选项附加到它,然后将它附加到 someDiv 容器(最后显示它)。希望这是有道理的。
    • 感谢编辑。是的,这是有道理的,但是,我无法让它工作。相反,我简单地使用 livequery 来绑定每个选择元素。现在可以了!谢谢!
    【解决方案2】:

    您是否将 onchange 事件重新绑定到新的选择框?

    【讨论】:

    • 不!我发现这是我需要做的。你对如何做到这一点有任何提示吗?我尝试了 livequery,但无法正常工作。谢谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    相关资源
    最近更新 更多