Javascript val()根据选择器路径返回不同的值

Javascript val()根据选择器路径返回不同的值,javascript,jquery,html,Javascript,Jquery,Html,我使用的是一个动态创建的大型表。它是2+列,第一列是文本,第二列是文本输入字段中的值。加载页面时,输入框具有默认值。我希望在文本字段中进行更改时能够保存该值 当我使用$(“#ID_NAME”).val()时,我会得到用户输入的任何值。如果我通过其他方式深入到输入字段,.val()在加载页面时为我提供默认值。该页面实际上没有使用任何ID,我只是添加了一个用于调试 我已经发布了一个JSFIDLE来说明这个问题 HTML: 这是怎么回事 [编辑] 这是最终的工作代码 function save() {

我使用的是一个动态创建的大型表。它是2+列,第一列是文本,第二列是文本输入字段中的值。加载页面时,输入框具有默认值。我希望在文本字段中进行更改时能够保存该值

当我使用
$(“#ID_NAME”).val()
时,我会得到用户输入的任何值。如果我通过其他方式深入到输入字段,
.val()
在加载页面时为我提供默认值。该页面实际上没有使用任何ID,我只是添加了一个用于调试

我已经发布了一个JSFIDLE来说明这个问题

HTML: 这是怎么回事

[编辑]
这是最终的工作代码

function save() {
    var cols = $("fieldset:first > table > thead > tr > th");
    var sections = $("fieldset");
    var ret = {};
    var sectionsTmp = {};
    var translation = {};

    for (var j=1; j < cols.length-1; j++) { //loop on language columns, skipping field names and delete columns (first and last columns)
        var lang = cols[j].innerHTML;
        sectionsTmp = {};

        for (var i=0; i < sections.length; i++) { //loop on sections/fieldsets
            var sectionName = $(sections[i]).children("legend")[0].innerHTML;
            var translations = $(sections[i]).find("table > tbody > tr");
            translation = {};

            for (var k=0; k < translations.length; k++) { //loop on translations in a section
                var translationId = translations[k].innerText.trim();
                var translationText = $(translations[k]).children().eq(j).find('input').val();
                translation[translationId] = translationText.replace(/'/g,'&apos;');
            }
            sectionsTmp[sectionName] = translation;
        }
        ret[lang] = sectionsTmp;
    }
    var url = '<?= $basePath?>/admin/save/item/translations/';
    var form = $('<form accept-charset="UTF-8" action="' + url + '" method="post">' +
        '<input type="text" name="translations" value=\'' + JSON.stringify(ret) + '\' />' +
        '</form>');
    $('body').append(form);
    console.log(form);
    form.submit();
}
函数保存(){
var cols=$(“字段集:第一个>表格>主题>主题>主题”);
变量部分=$(“字段集”);
var ret={};
var sectionsTmp={};
var translation={};
对于(var j=1;j正文>正文”);
翻译={};
对于(var k=0;k
在结果1的情况下,您实际上并没有选择元素-您是基于其html对其进行克隆

这一行:

var result_1 = $(c[1].innerHTML);
相当于:

var result_1 = $('<input id="test_id" type="text" value="default value"></input>');
var结果_1=$('');

如您所见,结果1与输入字段中键入的内容无关-它与DOM完全分离。

对于结果1,您实际上并没有选择元素-您是基于其html进行克隆的

这一行:

var result_1 = $(c[1].innerHTML);
相当于:

var result_1 = $('<input id="test_id" type="text" value="default value"></input>');
var结果_1=$('');

如您所见,结果1与输入字段中键入的内容无关—它与DOM完全分离。

为什么不给出输入名称或ID?最好给出输入id或名称,以便更好地选择它们,比如$(“input[name=myinputname]”),或者更好地使用id$(“#myinputid”)。以现在的方式选择它们是低效的。在实际代码中,数字是嵌套循环中的变量。所以请使用“是的,我遇到问题时已经考虑过了”。我想我会要求更多地了解jQuery。你的提议在某种程度上更好吗?我的想法是,如果我在任何一种情况下都要做一个数字循环,那么最好不要用ID把html弄得乱七八糟。是否有理由更喜欢在选择器上迭代而不是在子选择器上迭代?它们都是按正确的顺序返回的吗?这样看,你有4行代码,而你可以只返回1行。另外,您的方法运行多个循环,一个循环获取所有匹配的元素
字段集
,然后另一个循环查找匹配的
表格>tbody>tr
,然后另一个循环获取其所有子循环,这至少是3个循环为什么不提供输入名称或ID?最好给出输入id或名称,以便更好地选择它们,比如$(“input[name=myinputname]”),或者更好地使用id$(“#myinputid”)。以现在的方式选择它们是低效的。在实际代码中,数字是嵌套循环中的变量。所以请使用“是的,我遇到问题时已经考虑过了”。我想我会要求更多地了解jQuery。你的提议在某种程度上更好吗?我的想法是,如果我在任何一种情况下都要做一个数字循环,那么最好不要用ID把html弄得乱七八糟。是否有理由更喜欢在选择器上迭代而不是在子选择器上迭代?它们都是按正确的顺序返回的吗?这样看,你有4行代码,而你可以只返回1行。另外,您的方法运行多个循环,一个循环获得所有匹配的元素
字段集
,然后另一个循环找到匹配的
表>tbody>tr
,然后另一个循环获得其所有子元素,这至少是3个循环,这确实是问题所在。什么是最好的替代方法?你到底想做什么?您可以使用css选择器使用jQuery选择项目,如果这是您的目标-
$('fieldset table>body>tr>td')。eq(1)。find('input')
相当于您在问题中采取的路线啊,以前从未见过eq函数。现在我用它来代替newvar=$(varname[I]).children()$(newvar[j]).children().val();谢谢。是的,这确实是个问题。什么是最好的替代方法?你到底想做什么?您可以使用css选择器使用jQuery选择项目,如果这是您的目标-
$('fieldset table>body>tr>td')。eq(1)。find('input')
相当于您在问题中采取的路线啊,以前从未见过eq函数。现在我用它来代替newvar=$(varname[I]).children()$(newvar[j]).children().val();谢谢