我有以下元素:
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="VariableDataList[0].VariableDataForLevel[1].Value"></span>
我想替换data-valmsg-for
的值,以更改.Value
之前的数字。为此,我使用此函数(latestIdNumber
和newIdNumber
是我在函数开头计算的值,但假设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调试器,但没有看到新值。
我尝试过相同的操作,更改输入字段id
和name
,replace
功能完美无缺。
如何替换该属性的值?
答案 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()
。