2014-06-29 40 views
1

This question extends an answer here that uses domready。該擴展名試圖包含名稱略有不同的第二個infowindow:inwindow vs infowindow。第一個問題是,鑑於回答者的第一個「規則」 - 「僅創建infowindow對象的一個​​實例並使用setContent()方法修改其內容。」 - 可以在那裏第二個infowindow對象?輸入全球信息的文字

如果是這樣,那麼我如何創建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); 
    } 
    } 
} 
+1

'可以有第二個infowindow對象嗎?使用Google Maps API v3可以有任意多的InfoWindow。該版本的API刪除了API中僅內置到第2版中的硬限制。 – geocodezip

+0

[固定jsfiddle,至少顯示地圖](http://jsfiddle.net/3qU88/3/)(得到一個JavaScript錯誤'谷歌是未定義的',添加了API作爲外部資源,改變了「框架和擴展設置爲'不包裝在'中,增加了一個onload事件來調用窗口加載事件的初始化) – geocodezip

+0

爲什麼在這個世界中會需要'var map = null;'而不是'var map;'而需要嗎?我不能只改變我的JSFiddle.net版本,點擊'Run'並查看地圖?另一方面,爲什麼如果在您的JSFiddle.net中,如果我將'var map = null;'更改爲'var map;'然後點擊'Run',地圖是否仍然顯示?密碼!這甚至不是我正在嘗試解決的主要問題,即讓輸入在地圖環境中工作 – zerowords

回答

2

您可以擁有任意數量的infowindows。 規則我給你there更像是提示(因此斜體字體)。您可以隨時調整以適應您的需求。

現在,你必須在你的代碼的幾個問題:在表單中點擊提交按鈕時,觸發

  1. onsubmit事件。行動應該在表格上,而不是在按鈕上。但你在這裏沒有表格。您可以使用onclick事件(如刪除按鈕)。

  2. 在infowindow準備就緒後(domready),在用戶填充字段之後,您將獲得輸入值。因此它將永遠是空的。

  3. 您設置了marker.title = xxx,但此處不可用,此外,您應該使用setTitle()方法更改標記標題。

  4. 爲什麼不使用我(和你)用於刪除按鈕操作的相同技巧? (使用Id等)我建議您嘗試瞭解那裏發生的情況並將其適用於您設置標記標題的部分。

如果你仍然堅持,讓我知道,我會進一步解釋!

編輯:

JSFiddle demo

注意,沒有對輸入和按鈕界定的tabindex,並且我用.focus()信息窗口打開時將焦點設置在輸入或按鈕。

希望這會有所幫助。

+0

是的,我有兩個問題,現在你的答案克服。首先,我不明白domready的目的以及觸發它的原因。我也不知道如何在沒有「

」標籤的情況下包含「表單」。我結束了以下工作。 var inputForm ='Name:'+'';'還包含** hidden ** pinId。這是失蹤的最後一塊。 – zerowords

+0

你並不需要隱藏的領域。你可以添加一個data- * xxx *屬性到任何HTML元素(就像我在刪除按鈕上做的那樣)。只是一個提示。 – MrUpsidown

+0

是的,[在這裏我想起了那個](http://stackoverflow.com/questions/24499785/),但我看到一個額外的TAB索引使用這種方法的問題。當你在「刪除」按鈕中「隱藏」時,只有一個TAB按鈕。但是,如果我有一個更實質的僞「形式」,我會得到一個額外的TAB。你有沒有遇到過這個問題?在您建議的全球infowindow之前,我一直使用真實的形式,並沒有這樣的問題。 – zerowords