在加载时我创建一个map,键是anker-element,值是anker的偏移量。不幸的是我无法正确读出val,它总是返回最后一个键的值。有什么问题?
HTML
<a>Anker</a><a>Anker</a><a>Anker</a>
JS
var ankers = {};
$('a').each(function(){
var pos = $(this).offset().left;
ankers[$(this)] = pos;
});
$('a').click( function(e) {
e.preventDefault();
alert(ankers[$(this)]);
});
答案 0 :(得分:4)
您在地图中使用的JavaScript对象仅支持字符串键(与大多数其他语言中的对象一样)。
如果您想要实际地图,请使用Map
对象,如果您想使用对象密钥 - 但这些仅适用于新浏览器,您可以(polyfill it though):
var ankers = new Map();
$('a').each(function(){
var pos = $(this).offset().left;
ankers.set($(this), pos);
});
$('a').click( function(e) {
e.preventDefault();
alert(ankers.get($(this));
});
Fiddle(基于dfsq&#39; s)
或者,您可以使用元素的ID作为键并为其提供ID。或者,您可以完全避免这种情况,并将数据保存在对象上而不是地图中:
$('a').each(function(){
$(this).data("anker", $(this).offset().left);
});
$('a').click( function(e) {
e.preventDefault();
alert($(this).data("anker");
});
您应该只对表示属性和绑定使用数据属性,但这似乎是合适的,并且就是这种情况。
答案 1 :(得分:2)
javascript中对象的属性始终是String。因此,当您尝试将对象设置为键时,此对象将转换为字符串类型。因此,您只有ankers
个对象只有一个键[object Object]
。
相反,考虑给锚定一个id并使用这样的东西:
var ankers = {};
$('a').each(function () {
var pos = $(this).offset().left;
ankers[this.id] = pos;
});
$('a').click(function (e) {
e.preventDefault();
$('.val').val(ankers[this.id]);
});