【问题标题】:Passing string argument that points to variable传递指向变量的字符串参数
【发布时间】:2015-07-14 23:16:24
【问题描述】:

我正在使用谷歌地图 api v3 javascript。我有一个按钮列表,我需要它们将地图平移到新标记。每个位置都设置好了:

var location1 = new google.maps.LatLng(61.21444507411448,-149.8841142654419);
var location2 = new google.maps.LatLng(61.21179982469673,-149.89338397979736);
var location3 = new google.maps.LatLng(61.21580894399659,-149.88239765167236);

地图工作正常,所有设置都带有标记和所有内容。现在加载新位置,pan 可以运行:

map.panTo(thelocation);

我可以直接传递变量,谷歌地图会读取它。但是,当我为其中一个按钮创建单击功能并使用与位置变量同名的 id 标签时会发生什么,它无法读取它,因为它没有读取位置变量中的数据,而是读取位于编号:

$(".listing").click(function() {
    console.log("you clicked on a listing!");
    var location = $(this).attr('id');
    console.log(location);
})

我需要将 panTo 函数放在列表点击函数中,并让它根据他们点击的列表平移到正确的位置。
可能有不止一种方法可以做到这一点。我想使用单击的列表的 id(与 latlng 变量相同的 id),并让 panTo 读取存储在 var location1(或 2、3 等)中的数据。不将其作为字符串读取。
我怎样才能做到这一点?我知道在 bash 中,它类似于 eval

【问题讨论】:

    标签: javascript google-maps-api-3


    【解决方案1】:

    有几种方法可以做到这一点,最好的方法是使用对象来保存值。您可以使用 id 作为键并引用它。

    var details = { 
        location1 : new google.maps.LatLng(61.21444507411448,-149.8841142654419),
        location2 : new google.maps.LatLng(61.21179982469673,-149.89338397979736),
        location3 : new google.maps.LatLng(61.21580894399659,-149.88239765167236)
    };
    
    $(".listing").on("click", function() {
        var loc = this.id;
        console.log(details[loc]);
    });
    

    【讨论】:

    【解决方案2】:

    Javascript 也有一个 eval 函数,所以你可以解析你的字符串变量,通过使用 eval 指向一个新函数来指向实际的 latlng 变量:

    $(".listing").click(function() {
        console.log("you clicked on a listing!");
        var location = $(this).attr('id');
        var goLocation = eval(location);
        console.log(location);
        console.log(goLocation);
        map.panTo(goLocation);
    })
    

    但如果您对安全感兴趣,您可以选择其他解决方案:
    摘自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

    不要不必要地使用eval

    eval() 是一个危险函数,它以调用者的权限执行它传递的代码。如果您使用可能受到恶意方影响的字符串运行eval(),您最终可能会在具有您网页/扩展程序权限的用户机器上运行恶意代码。更重要的是,第三方代码可以看到eval()被调用的范围,这可能导致类似Function不易受到的攻击。

    eval() 通常也比替代方案慢,因为它必须调用 JS 解释器,而许多其他结构已被现代 JS 引擎优化。

    对于常见用例,eval() 有更安全(更快!)的替代方案。

    【讨论】:

    • EVAL 很糟糕>>>>YIKES,你为什么会选择这个?这是一种不好的坏习惯。
    • 他在他的问题中提到了 eval,所以我告诉他它确实存在于 javascrip 中,但我也给出了警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2021-03-09
    • 1970-01-01
    相关资源
    最近更新 更多