on Info InfoWindow内容

时间:2014-10-11 21:09:40

标签: javascript google-maps

我的代码中遇到了一个小问题,我尝试在javascript中在InfoWindow的内容中启动一个函数,而且,我不知道为什么,我很难做到这一点。我已经在stackoverflow和其他地方看了很多关于它的主题,完全应用了我在这些主题上看到的但是...

注意:这是我整个代码的一部分,这就是为什么" infobulle"似乎没有被宣布。     以同样的方式," this.jsonActivity"和" mapView"在这部分代码之前正确初始化。

在这里," newActivity" in参数是谷歌地图API中的标记,我尝试做的是在点击它时在当前标记旁边显示一个InfoWindow。一切都还可以,整个文本都在InfoWindow中正确显示,但问题是我无法调用" alertMessage()"当我点击按钮时,没有任何反应......我真的不知道为什么!!

嗯,这是我的代码,谢谢你的帮助:)。

google.maps.event.addListener(newActivity, "click", function() {
    if(infobulle)
        infobulle.close();

    var contenu = '<strong>' + this.jsonActivity.title + '</strong><br/>' +
        this.jsonActivity.description + '<br/>' +
        '<h3>Routing:</h3>' +
        '<button onclick="alertMessage()">Click me</button>';

    infobulle = new google.maps.InfoWindow({
        content: contenu,
        maxWidth: 120
    });
    infobulle.open(mapView, this);

    function alertMessage() {
        alert("alertMessage");
    }
});

修改

这很完美,现在正在工作!

我已经尝试过你所有的解决方案,只有一个解决方案正在为我工​​作,这个解决方案是全局的,感谢Dr.Molle!

现在我把我尝试过的其他两个解决方案:

google.maps.event.addListener(newActivity, "click", function() {

    if(infobulle)
        infobulle.close();

    var contenu = '<strong>' + this.jsonActivity.title + '</strong><br/>' +
        this.jsonActivity.description + '<br/>' +
        '<h3>Routing:</h3>' +
        '<button id="myAlert">Click me</button>';

    infobulle = new google.maps.InfoWindow({
        content: contenu,
        maxWidth: 120
    });
    infobulle.open(mapView, this);

    document.getElementById("myAlert").addEventListener(function() {
        alert("something");
    });
});

对于Jared Smith建议的解决方案。就像之前一样,当我点击按钮时,除了按钮之外,一切都正确显示,没有任何反应。

对于亚历山大建议的解决方案:

google.maps.event.addListener(newActivity, "click", function() {

    if(infobulle)
        infobulle.close();

    var contenu = '<strong>' + this.jsonActivity.title + '</strong><br/>' +
        this.jsonActivity.description + '<br/>' +
        '<h3>Routing:</h3>' +
        '<button onclick="(function() {
            alert(\"something\");
        })();">Click me</button>';

    infobulle = new google.maps.InfoWindow({
        content: contenu,
        maxWidth: 120
    });
    infobulle.open(mapView, this);
});

而这一次,即使我点击该按钮的元素也不会出现......

对于这两种解决方案,也许我没有正确使用它们......所以如果你找到要说的话,请继续:)

修改(2): 好的,现在我还有另一个问题:如果我想把变量作为函数的参数,我该怎么做呢?只输入变量名称作为参数不起作用。

我试过了:

var contenu = '<strong>' + this.jsonActivity.title + '</strong><br/>' +
    this.jsonActivity.description + '<br/>' +
    '<h3>Routing:</h3>' +
    '<button onclick="alertMessage(\'something\')">Click me</button>';
window.alertMessage = function(thing) {
    alert(thing);
};

这是有效的,因为我直接将字符串作为参数。

但如果我宣布:

var text = "something";

var contenu = '<strong>' + this.jsonActivity.title + '</strong><br/>' +
    this.jsonActivity.description + '<br/>' +
    '<h3>Routing:</h3>' +
    '<button onclick="alertMessage(text)">Click me</button>';
window.alertMessage = function(thing) {
    alert(thing);
};

它不再工作了,你知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

使该功能全局可访问(目前它不是):

window.alertMessage=function() {
    alert("alertMessage");
}

答案 1 :(得分:0)

而不是

"<button onclick='blah'>"

你需要

"<button id='myAlertButton'>"

然后在infoWindow添加到DOM

之后的eventListener回调中
document.getElementById('myAlertButton').addEventListener(function(){
    alert('Whatever');
});

答案 2 :(得分:0)

InfoWindow 接受一个 HTMLElement 节点作为其 content 选项。因此,您可以通过 JS 构建 HTML 并添加事件 JS-land,例如:

// Create Nodes
const ul = document.createElement('ul');
const setOrigin = document.createElement('li');

// Set hierarchy
ul.appendChild(setOrigin);
setOrigin.appendChild(document.createTextNode('Set Origin'));

// Add event listener
setOrigin.addEventListener('click', () => console.log('Set origin and so on…'));

// Set root node as content
const contextMenu = new google.maps.InfoWindow({
    content: ul,
});