在jQuery中使用.children和.find

时间:2015-03-18 12:39:10

标签: javascript jquery children

我的页面上有一组控件,我试图迭代并确定它们是否有值。这些控件中的一些是< select>在这个例子中,我需要遍历与< select>相关联的选项。控制并找到所选的。我尝试过.children()以及.find("选项:选择")并且它们都不起作用(两者都在javascript中抛出"未定义"错误)。我做错了什么?

function getJsonValue(control, json) { 
    if(control.dataset["fieldname"] !== "undefined"){
        if(control.tagName == "SELECT") {
            var selected = "{";
            var idName = control.dataset["idname"];
            control.children.each( function() {
                if(this.selected) {
                    selected += idName + ": " + this.val() + ",";
                }
            });
            selected += "}";
            if(selected != '') {
                json += control.dataset["fieldname"] + ": ";
                json += selected + ",";
            }
        } else {
            if(control.val() != '') {
                json += control.dataset["fieldname"] + ": ";
                json += control.val() + ",";
            }
        }
    }
};

错误出现在上面代码的第5行(control.children.each)。我试过了:

control.children.each( function() {
control.childre().each( function() {
control.find("option:selected").each( function() {

这些选项都不起作用。作为参考,"控制"变量从另一个通过执行以下操作找到的函数传递:

$("#search-header").find("select").each( function() {
    json = getJsonValue(this, json);
});

3 个答案:

答案 0 :(得分:1)

为了进一步扩展我的评论,我可以看到您传递了对象this,该对象已分配给函数中的变量control。但是,jQuery不能直接对这个对象进行操作,除非它被转换为jQuery对象,这可以通过使用jQuery别名$(control)包装它来完成(提示,就像人们使用$(this)的方式一样在jQuery中,它是一样的。)

因此,如果您以这种方式修改代码,它应该可以工作:

function getJsonValue(control, json) { 
    if(control.dataset["fieldname"] !== "undefined"){
        if(control.tagName == "SELECT") {
            var selected = "{";
            var idName = control.dataset["idname"];
            $(control).children.each( function() {
                if(this.selected) {
                    selected += idName + ": " + this.val() + ",";
                }
            });
            selected += "}";
            if(selected != '') {
                json += control.dataset["fieldname"] + ": ";
                json += selected + ",";
            }
        } else {
            if(control.val() != '') {
                json += control.dataset["fieldname"] + ": ";
                json += $(control).val() + ",";
            }
        }
    }
};

p / s:另外,如果您想从jQuery对象访问原始DOM节点,只需使用$(control)[0];)

答案 1 :(得分:1)

尝试

$(control).find("option:selected").each( function() {

$(control).children.each( function() {

您正在向调用者传递(this)函数。它没有jquery选择器。

答案 2 :(得分:0)

您缺少第一个孩子的开放式近距离

control.children().each( function() {
control.childre().each( function() {
control.find("option:selected").each( function() {