【问题标题】:Passing a javascript variable to a javascript function?将javascript变量传递给javascript函数?
【发布时间】:2016-08-21 10:10:51
【问题描述】:

我有一个地图应用程序,它在菜单中列出了不同的地图层,每个层都有一个特定的类名。

当用户单击名称时使用此类名称,以便可以将图层添加到地图中或从地图中删除,也可以从地图键中添加/删除图层。

这工作正常,但我正在努力在每个图层名称旁边添加一个小十字,以便用户可以将它们从地图键中删除。

我的代码如下 - 我尝试包含一个 onclick 函数,该函数采用图层 ID 并尝试在函数中使用它,但出现错误:

未捕获的错误:语法错误,无法识别的表达式:.icon[object 对象]

由于我的变量现在是一个对象,我是否需要以不同的方式指定 lid

这里的 html 显示了使用类 ID 的层的列表选项:

<li class='last layerlist' id='layer63'><a href='#'><i class="fa fa-circle fa-lg iconlayer63"></i><span> Flood Zone 2</span></a></li>

下面的 Javascript 显示了当用户单击列表时会发生什么,它获取 id,然后使用它来获取图层名称(与 id 相同)以隐藏或显示图层,具体取决于是否它是可见的:

//Change layer visibility and add / remove from map key
$(".layerlist").click(function() {
    var lid = $(this).attr('id');
    map.getLayers().forEach(function(layer) {
        if (layer.get('name') == lid) {
            var visibility = layer.getVisible();
            if (visibility == false) {
                layer.setVisible(true);
                $(".icon" + lid).removeClass("fa-circle").addClass("fa-check-circle");
                $("#map-content").append("<p id='" + lid + "key'><a href='#'><i class='fa fa-times-circle' onclick='removeLayer(" + lid + ");'></i></a><img src='img/legend/" + lid + ".png' alt='Layer image'/> " + layer.get('label') + "</p>");
            }
            if (visibility == true) {
                layer.setVisible(false);
                $(".icon" + lid).removeClass("fa-check-circle").addClass("fa-circle");
                $("#" + lid + "key").remove();
            }
        }
    });
});

//Remove selected layer from map key
function removeLayer(lid) {
    lid.setVisible(false);
    $(".icon" + lid).removeClass("fa-check-circle").addClass("fa-circle");
    $("#" + lid + "key").remove();
}

【问题讨论】:

  • 你能提供一个HTML代码的例子吗?
  • lid 是一个被强制转换为字符串的对象,因此是 [object Object],您能详细介绍一下 lid 吗?
  • remove layer 需要一个 layer 对象,而您正在向它传递一个字符串 - 这显然不起作用:)
  • 部分removeLayer 期望参数lid 是一个对象:lid.setVisible(false); 几乎所有其他东西都将它用作字符串,例如:$(".icon" + lid)... 那是什么setVisible 行应该怎么做?
  • 是的 lid.setVisible(false) 应该从地图中删除地图层。我尝试了您的建议 T.J 添加引号并且它有效,但这部分没有 - 大概是因为这需要对象,而其他两行需要它作为字符串。

标签: javascript function variables constructor javascript-objects


【解决方案1】:

问题出在您的onclick 属性中:

"... onclick='removeLayer(" + lid + ");' ..."

如果lid"foo",浏览器将看到的是:

... onclick='removeLayer(foo);' ...

请注意,这意味着 removeLayer 将被调用,期待一个名为 foo 的变量,而不是 字符串 "foo"

浏览器为所有具有id 的元素创建全局变量;全局指的是元素对象。所以foo 将引用元素,而不是它的id

你想要引号:

"... onclick='removeLayer(\"" + lid + "\");' ..."

让浏览器看到

... onclick='removeLayer("foo");' ...

话虽如此,removeLayer 的一部分似乎期待一个对象:

lid.setVisible(false);

您必须告诉我们更多相关信息,我们才能为您提供全面帮助。


但是,我不会通过添加引号来修复它,而是完全停止使用onxyz 属性。相反,请使用现代事件处理。

删除onclick 属性,改为:

$(document.body).on("click", "selector-for-all-lids", function() {
    // We need to know more to help with this line: lid.setVisible(false);
    var lid = this.id;
    $(".icon" + lid).removeClass("fa-check-circle").addClass("fa-circle");
    $("#" + lid + "key").remove();
});

【讨论】:

  • 因为我需要一个对象(设置图层的图层可见性)和一个字符串(从我的键中删除条目),所以我可能需要在我的 onclick 函数中解析两个单独的变量,所以我可以同时使用对象和字符串?
  • 感谢您的帮助!我包含了两个单独的变量来满足对象和字符串的需求。
【解决方案2】:
$(".icon" + lid)

如果您的 lid 是一个对象,它将被转换为 ".icon[Object object]"

所以是的,你必须改变它。只需检查此行返回的内容并更改您的代码以适应它:

 var lid = $(this).attr('id');

【讨论】:

    【解决方案3】:

    如果“盖子”是一个对象,那么你就不能写出这样的东西$(".icon" + lid)。相反,您应该使用类似$(".icon" + lid.paramName)

    【讨论】:

      猜你喜欢
      • 2015-05-02
      • 2017-04-30
      • 2018-12-14
      • 2014-10-31
      • 2020-09-02
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多