【问题标题】:text input to a global infowindow文本输入到全局信息窗口
【发布时间】:2014-08-20 03:06:23
【问题描述】:

This question extends an answer here that uses domready。该扩展试图包含另一个名称略有不同的信息窗口:inwindowinfowindow。第一个问题是,给定回答者的第一个“规则”——“只创建一个 infowindow 对象实例并使用 setContent() 方法修改其内容。” -- 可以第二个信息窗口对象吗?

如果是这样,那么我尝试创建inwindow 有什么问题,如下所示?单击地图时会出现inwindow,但单击其“提交”按钮似乎没有任何作用。

A working JSFiddle.com version 在这里(至少它显示了一张地图)。

接下来是一些全局变量和对象。

var map
var infowindow = new google.maps.InfoWindow();
var inwindow = new google.maps.InfoWindow();
var markers = [];
var counter = 0;

initialize() 是接下来的摘录。

google.maps.event.addListener(map, 'click', function (event) {

    addMarker(event.latLng);
    });

google.maps.event.addListener(inwindow, 'domready', function () {
    var button = document.getElementById('inputButton');
    var input = document.getElementById('nameinput').value;
    button.onsubmit = function() {
    marker.title = input;
    inwindow.close();
    };
    });
google.maps.event.addListener(infowindow, 'domready', function () {
    var button = document.getElementById('deleteButton');
    var id = parseInt(button.getAttribute('data-id'));  
    button.onclick = function() {
    deleteMarker(id);
    };
    });
}

function addMarker(location) {

    counter++;

    var inputForm = 'Name:  <input type="text" id="nameinput" size="31" maxlength="31" tabindex="1"/>' + '<input type="button" id="inputButton" value="Submit">';

    var marker = new google.maps.Marker({
position: location,
map: map,
id: counter
});
inwindow.setContent(inputForm);
inwindow.open(map, marker);

markers.push(marker);

var deleteButton = '<button id="deleteButton" data-id="' + counter + '">Delete</button>';

google.maps.event.addListener(marker, 'rightclick', function () {
    infowindow.setContent(deleteButton);
    infowindow.open(map, marker);
    });
}

function deleteMarker(markerId) {
    for (var i=0; i<markers.length; i++) {
    if (markers[i].id === markerId) {
        markers[i].setMap(null);
    }
    }
}

【问题讨论】:

  • can there be a second infowindow object? 使用 Google Maps API v3 可以有任意数量的 InfoWindows。此版本的 API 消除了仅内置于 API v2 中的硬性限制。
  • fixed jsfiddle that at least shows a map(得到一个javascript错误google is undefined,将API添加为外部资源,将“框架和扩展设置”更改为no wrap in &lt;head&gt;,添加了一个onload事件来调用初始化窗口加载事件)。
  • 为什么需要var map = null; 而不是var map;?为什么我不能对我的 JSFiddle.net 版本进行更改,单击Run 并查看地图?另一方面,为什么如果在您的 JSFiddle.net 中,如果我将 var map = null; 更改为 var map; 并单击 Run,地图是否仍然显示?咒骂! 这甚至不是我要解决的主要问题,即获取输入以在地图环境中工作。
  • 我刚刚注意到您在上面说 jsfiddle 遇到了 javascript 错误。您在哪里看到 jsfiddle 中的错误?我想我一个都没见过。
  • 在浏览器的 javascript 控制台中(我通常使用 Chrome,除非它是浏览器特定的问题)。顺便说一句 - var map=null; 不是必需的,只是习惯,当我修复添加 =null; 时,您在行尾缺少一个分号。

标签: javascript google-maps-api-3 domready


【解决方案1】:

您可以拥有任意数量的信息窗口。我给你there规则更像是提示(因此是斜体)。您可以随时根据自己的需要进行调整。

现在您的代码中有一些问题:

  1. onsubmit 事件在表单中的提交按钮被点击时触发。动作应该在表单上,​​而不是在按钮上。但是这里没有表格。您可以改用onclick 事件(例如删除按钮)。

  2. 当信息窗口准备好 (domready) 时,您将获得输入值,而不是在用户填写该字段之后。因此它永远是空的。

  3. 您设置了marker.title = xxx,但marker在此处不可用,另外,您应该使用setTitle()方法更改标记标题。

  4. 您为什么不使用我(和您)用于删除按钮操作的相同技术? (使用Id等)我建议您尝试了解那里发生的情况并将其调整到您设置标记标题的部分。

如果您仍然卡住,请告诉我,我会进一步解释!

编辑:

JSFiddle demo

请注意,输入和按钮上没有定义 tabindex,当信息窗口打开时,我使用.focus() 将焦点设置在输入或按钮上。

希望这会有所帮助。

【讨论】:

  • 是的,我遇到了 2 个问题,现在您的回答已经解决了这些问题。首先,我不明白 domready 的目的以及触发它的原因。我也不知道如何在没有“
    ”标签的情况下包含“表单”。我最终做了以下事情。 var inputForm = 'Name: &lt;input type="text" id="nameinput" ' + '&lt;input type="hidden" id="pinId" value="' + counter + '"&gt;' + '&lt;button id="inputButton"&gt;Submit&lt;/button&gt;'; 还包括 hidden pinId。那是丢失的最后一块。
  • 您并不需要隐藏字段。您可以将 data-xxx 属性添加到任何 HTML 元素(就像我在删除按钮上所做的那样)。只是一个提示。
  • 是的,here I was reminded of that,但我发现使用此方法的额外 TAB 索引存在问题。当您“隐藏”在删除按钮中时,只有一个 TAB,即按钮。但似乎如果我有一个更实质的伪“表格”,我会得到一个额外的 TAB。你有没有遇到过这个问题?在你建议的全局信息窗口之前,我一直使用真实的表格,没有这样的问题。
  • 什么问题?使用一个输入字段和一个按钮,我看不到任何制表问题。我会在几秒钟内在我的答案中加入一个 jsfiddle。
  • 是的,你的 jsfiddle 很有帮助。它不能按我想要的方式工作,我认为我确实需要另一个带有 domready 的信息窗口,因为我只希望用户在先删除现有标记后编辑它,然后重新输入它以使此类操作更加困难。所以没有 addListenermarker 和(左)点击关联起来。但是当我只删除你这样的addListener时,我无法删除任何标记,所以我正在努力纠正这个问题。仅供参考,我希望更改现有标记有点困难,以使坏人更难摧毁地图上的多个标记。
猜你喜欢
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
相关资源
最近更新 更多