开发 Windows 8 Bing地图应用(2)
下面是對使用JavaScript的Bing Maps Trip Optimizer示例的介紹,講述應用的JavaScript部分組織形式,本地的上下文和網絡上下文之間的通信。
WinRT需要訪問網絡的代碼,下面是一些需要訪問網絡的活動示例。
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組件,不過不能訪問網絡),“default.html”表示應用的主頁面。“mapControl.html”可稱為web context(網絡上下文),因為其可訪問網絡,但不能訪問WinRT。“mapControl.html”是一個local context的內嵌框架。下圖是local context和web context間的關系。
注意:就安全性而言,在一個單獨的模塊中維護web代碼,同樣會增加應用的安全性。可能的話有必要驗證從web context接收到local context的內容,這樣可以減少發生安全性缺陷的可能,比如緩沖區溢出。
接下來在local context中引用web context。local context(default.html)中body標簽定義一個內嵌框架(iframe標簽)來放置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風格應用中引用代碼文件時,使用這樣的語法:src = "ms-appx-web://<package-name>/<file-name>" 。如果目標文件是和調用文件同一個包的一部分,可以在應用的manifest文件中找到包名。
再來說上下文間的通信。local context和web context使用跨文檔信息通信,在上下文通信前,其必須首先注冊通信事件。“default.html”和“mapControl.html”為body標簽中的“onload”屬性指定一個“OnLoad”函數,“OnLoad”函數調用“addEventListener”方法監聽消息類型事件,并將這些消息路由發送到“receiveMessage”函數,代碼如下。
function OnLoad() {
window.addEventListener("message", receiveMessage, false);
}
注意:Bing Maps Trip Optimizer使用跨文檔消息傳遞,因為對一個上下文而言,其不能直接訪問其他上下文的DOM。
在上下文注冊了通信事件后,可以使用“postMessage”方法通信。這個方法發送一個跨文檔消息,而消息是路由到消息事件處理函數。由于跨文檔消息是基于文本的,應用和web上下文使用“JSON.stringify”函數將信息序列化到JSON文本中。當一個上下文收到一個消息時,它會調用“JSON.parse”函數將JSON文本字段反序列化。
為了說明上下文通信的方式,考慮讓web context通信local context來初始化自定義C++的WinRT組件(回憶一下可以想到,web context不能直接和WinRT組件交互),web context(即mapControl.html)中定義的“OnLoad”函數在初始化期間被調用,對mapControl.html頁面的部分代碼如下。
function OnLoad() {
window.addEventListener("message", receiveMessage, false);
}
“OnLoad”函數調用“optimizerLoad”函數,“optimizerLoad”函數通信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都在創建WinRT組件前被加載。
總結
以上是生活随笔為你收集整理的开发 Windows 8 Bing地图应用(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql复制: 一个master对应1
- 下一篇: 前端笔试练习一