开发 Windows 8 Bing地图应用(2)
下面是對使用JavaScript的Bing Maps Trip Optimizer示例的介紹,講述應(yīng)用的JavaScript部分組織形式,本地的上下文和網(wǎng)絡(luò)上下文之間的通信。
WinRT需要訪問網(wǎng)絡(luò)的代碼,下面是一些需要訪問網(wǎng)絡(luò)的活動示例。
q 加載一個外部JavaScript文件,比如Bing Maps的AJAX控件。
q 加載外部CSS。
q 使用XmlHttpRequest。
Bing Maps Trip Optimizer將界面分為兩個HTML文件,即“default.html”和“mapControl.html”,“default.html”屬于local context(本地上下文),其可以引用WinRT(這個包括自定義C++的WinRT組件,不過不能訪問網(wǎng)絡(luò)),“default.html”表示應(yīng)用的主頁面。“mapControl.html”可稱為web context(網(wǎng)絡(luò)上下文),因?yàn)槠淇稍L問網(wǎng)絡(luò),但不能訪問WinRT。“mapControl.html”是一個local context的內(nèi)嵌框架。下圖是local context和web context間的關(guān)系。
注意:就安全性而言,在一個單獨(dú)的模塊中維護(hù)web代碼,同樣會增加應(yīng)用的安全性。可能的話有必要驗(yàn)證從web context接收到local context的內(nèi)容,這樣可以減少發(fā)生安全性缺陷的可能,比如緩沖區(qū)溢出。
接下來在local context中引用web context。local context(default.html)中body標(biāo)簽定義一個內(nèi)嵌框架(iframe標(biāo)簽)來放置web context,代碼如下。
<body οnlοad="OnLoad();" style="padding: 0; margin: 0; position: absolute; left: 0px;
width: 100%; top: 0px; height: 100%; overflow: hidden">
<iframe id="mapFrame" src="ms-appx-web:///mapControl.html"
style="position: absolute; left: 0px; width: 100%; top: 0px; height: 100%; overflow: hidden">
</iframe>
</body>
在JavaScript的Metro風(fēng)格應(yīng)用中引用代碼文件時,使用這樣的語法:src = "ms-appx-web://<package-name>/<file-name>" 。如果目標(biāo)文件是和調(diào)用文件同一個包的一部分,可以在應(yīng)用的manifest文件中找到包名。
再來說上下文間的通信。local context和web context使用跨文檔信息通信,在上下文通信前,其必須首先注冊通信事件。“default.html”和“mapControl.html”為body標(biāo)簽中的“onload”屬性指定一個“OnLoad”函數(shù),“OnLoad”函數(shù)調(diào)用“addEventListener”方法監(jiān)聽消息類型事件,并將這些消息路由發(fā)送到“receiveMessage”函數(shù),代碼如下。
function OnLoad() {
window.addEventListener("message", receiveMessage, false);
}
注意:Bing Maps Trip Optimizer使用跨文檔消息傳遞,因?yàn)閷σ粋€上下文而言,其不能直接訪問其他上下文的DOM。
在上下文注冊了通信事件后,可以使用“postMessage”方法通信。這個方法發(fā)送一個跨文檔消息,而消息是路由到消息事件處理函數(shù)。由于跨文檔消息是基于文本的,應(yīng)用和web上下文使用“JSON.stringify”函數(shù)將信息序列化到JSON文本中。當(dāng)一個上下文收到一個消息時,它會調(diào)用“JSON.parse”函數(shù)將JSON文本字段反序列化。
為了說明上下文通信的方式,考慮讓web context通信local context來初始化自定義C++的WinRT組件(回憶一下可以想到,web context不能直接和WinRT組件交互),web context(即mapControl.html)中定義的“OnLoad”函數(shù)在初始化期間被調(diào)用,對mapControl.html頁面的部分代碼如下。
function OnLoad() {
window.addEventListener("message", receiveMessage, false);
}
“OnLoad”函數(shù)調(diào)用“optimizerLoad”函數(shù),“optimizerLoad”函數(shù)通信local context來初始化C++的WinRT組件,部分代碼如下。
rho, iterations, parallel) {
var message = {
"invoke": "optimizeTrip", "locations": locations, "TravelMode": TravelMode, "Optimize": Optimize, "BingMapsKey": BingMapsKey,
"alpha": alpha, "beta": beta, "rho": rho, "iterations": iterations, "parallel": parallel
};
window.parent.postMessage(JSON.stringify(message), '*');
}
從web context,而不是直接從local context初始化WinRT組件的加載,這樣確保web context和local context都在創(chuàng)建WinRT組件前被加載。
總結(jié)
以上是生活随笔為你收集整理的开发 Windows 8 Bing地图应用(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql复制: 一个master对应1
- 下一篇: 活动目录应用篇一:使用windows s