无法使用jQuery更改属性值

时间:2017-05-19 08:14:16

标签: javascript jquery

我有以下元素:

<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="VariableDataList[0].VariableDataForLevel[1].Value"></span>

我想替换data-valmsg-for的值,以更改.Value之前的数字。为此,我使用此函数(latestIdNumbernewIdNumber是我在函数开头计算的值,但假设latestIdNumber为1而newIdNumber为2 ):

clone.find("span[data-valmsg-for$='Value']").map(function () {
    var reName = '[' + latestIdNumber + '].Value';
    $(this).attr('data-valmsg-for').replace(reName, '[' + newIdNumber + '].Value');
});

reName值为[1].Value。我想将data-valmsg-for中的此文字替换为[2].Value。之后,我会在data-valmsg-for中加上data-valmsg-for="VariableDataList[0].VariableDataForLevel[2].Value

我已经使用Visual Studio对其进行了调试,它在find中停止,但属性的值不会改变。

我知道属性值没有改变,因为我打开了Internet Explorer调试器,但没有看到新值。

我尝试过相同的操作,更改输入字段idnamereplace功能完美无缺。

如何替换该属性的值?

1 个答案:

答案 0 :(得分:2)

首先,您应该使用each()来迭代元素集合。 map()旨在从该集合中创建一个数组,但在这种情况下,如果正确使用attr()则不需要它。

您的代码存在的问题是因为您没有调用attr()的设置者。相反,你获得了价值,预先形成了替代品,但没有对结果做任何事情。

要解决此问题,您可以为attr()方法提供一个函数,该方法在集合中每个元素实例上执行逻辑。试试这个:

var latestIdNumber = '1';
var newIdNumber = '999';
var reName = '[' + latestIdNumber + '].Value';

$("span[data-valmsg-for$='Value']").attr('data-valmsg-for', function(i, v) {
  return v.replace(reName, '[' + newIdNumber + '].Value');
});

// to show it worked:
$("span[data-valmsg-for$='Value']").each(function() {
  console.log($(this).attr('data-valmsg-for'));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="VariableDataList[0].VariableDataForLevel[1].Value">Foo</span>
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="VariableDataList[0].VariableDataForLevel[1].Value">Bar</span>

另请注意,您应该使用data()方法来处理data-*属性。这里需要注意的是data()不会更新DOM,所以如果您需要这种行为,那么您需要继续使用attr()