JS - 如何获得正确的地图值?

时间:2015-04-12 08:20:01

标签: javascript jquery html

在加载时我创建一个map,键是anker-element,值是anker的偏移量。不幸的是我无法正确读出val,它总是返回最后一个键的值。有什么问题?

js fiddle

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)]);
});

2 个答案:

答案 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");
});

Fiddle

您应该只对表示属性和绑定使用数据属性,但这似乎是合适的,并且就是这种情况。

答案 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]);
});

演示: http://jsfiddle.net/1c4h17ma/1/