pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

HTML5 postMessage 和 onmessage API 詳細(xì)應(yīng)用

postMessage(send) 和 onmessage 在 HTML5 中有著廣泛的應(yīng)用,比如 Web Workers 中應(yīng)用此組 API 實(shí)現(xiàn)多個(gè)線程間 JavaScript 調(diào)用功能,Cross-document messaging 中實(shí)現(xiàn)兩個(gè)不同域間 JavaScript 調(diào)用功能等等。本文
       Web Workers

       Web Workers 簡介

       至 2008 年 W3C 制定出第一個(gè) HTML5 草案開始,HTML5 承載了越來越多嶄新的特性和功能。它不但強(qiáng)化了 Web 系統(tǒng)或網(wǎng)頁的表現(xiàn)性能,而且還增加了對(duì)本地?cái)?shù)據(jù)庫等 Web 應(yīng)用功能的支持。其中,最重要的一個(gè)便是對(duì)多線程的支持。在 HTML5 中提出了工作線程(Web Workers)的概念,并且規(guī)范出 Web Workers 的三大主要特征:能夠長時(shí)間運(yùn)行(響應(yīng)),理想的啟動(dòng)性能以及理想的內(nèi)存消耗。Web Workers 允許開發(fā)人員編寫能夠長時(shí)間運(yùn)行而不被用戶所中斷的后臺(tái)程序,去執(zhí)行事務(wù)或者邏輯,并同時(shí)保證頁面對(duì)用戶的及時(shí)響應(yīng)。

       Web Workers 為 Web 前端網(wǎng)頁上的腳本提供了一種能在后臺(tái)進(jìn)程中運(yùn)行的方法。一旦它被創(chuàng)建,Web Workers 就可以通過 postMessage 向任務(wù)池發(fā)送任務(wù)請(qǐng)求,執(zhí)行完之后再通過 postMessage 返回消息給創(chuàng)建者指定的事件處理程序 ( 通過 onmessage 進(jìn)行捕獲 )。Web Workers 進(jìn)程能夠在不影響用戶界面的情況下處理任務(wù),并且,它還可以使用 XMLHttpRequest 來處理 I/O,但通常,后臺(tái)進(jìn)程(包括 Web Workers 進(jìn)程)不能對(duì) DOM 進(jìn)行操作。如果希望后臺(tái)程序處理的結(jié)果能夠改變 DOM,只能通過返回消息給創(chuàng)建者的回調(diào)函數(shù)進(jìn)行處理。

       瀏覽器對(duì) HTML5 支持情況可以參考網(wǎng)站 When can I use...

       在 Web Workers 中使用 postMessage 和 onmessage

       首先,需要在客戶端頁面的 JavaScript 代碼中 new 一個(gè) Worker 實(shí)例出來,參數(shù)是需要在另一個(gè)線程中運(yùn)行的 JavaScript 文件名稱。然后在這個(gè)實(shí)例上監(jiān)聽 onmessage 事件。最后另一個(gè)線程中的 JavaScript 就可以通過調(diào)用 postMessage 方法在這兩個(gè)線程間傳遞數(shù)據(jù)了。

       清單 1. 主線程中創(chuàng)建 Worker 實(shí)例,并監(jiān)聽 onmessage 事件

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Test Web worker</title>
<script type="text/JavaScript">
function init(){
var worker = new Worker('compute.js');
//event 參數(shù)中有 data 屬性,就是子線程中返回的結(jié)果數(shù)據(jù)
worker.onmessage= function (event) {
// 把子線程返回的結(jié)果添加到 div 上
document.getElementById("result").innerHTML +=
event.data+"<br/>";
};
}
</script>
</head>
<body onload="init()">
<div id="result"></div>
</body>
</html>

       在客戶端的 compute.js 中,只是簡單的重復(fù)多次加和操作,最后通過 postMessage 方法把結(jié)果返回給主線程,目的就是等待一段時(shí)間。而在這段時(shí)間內(nèi),主線程不應(yīng)該被阻塞,用戶可以通過拖拽瀏覽器,變大縮小瀏覽器窗口等操作測試這一現(xiàn)象。這個(gè)非阻塞主線程的結(jié)果就是 Web Workers 想達(dá)到的目的。

       清單 2. compute.js 中調(diào)用 postMessage 方法返回計(jì)算結(jié)果

 var i=0;

function timedCount(){
for(var j=0,sum=0;j<100;j++){
for(var i=0;i<100000000;i++){
sum+=i;
}
}
// 調(diào)用 postMessage 向主線程發(fā)送消息
postMessage(sum);
}

postMessage("Before computing,"+new Date());
timedCount();
postMessage("After computing,"+new Date());

 1. 瀏覽器中運(yùn)行結(jié)果

       Cross-document messaging

       Cross-document messaging 簡介

       由于同源策略的限制,JavaScript 跨域的問題,一直是一個(gè)頗為棘手的問題。HTML5 提供了在網(wǎng)頁文檔之間互相接收與發(fā)送信息的功能。使用這個(gè)功能,只要獲取到網(wǎng)頁所在窗口對(duì)象的實(shí)例,不僅同源(域 + 端口號(hào))的 Web 網(wǎng)頁之間可以互相通信,甚至可以實(shí)現(xiàn)跨域通信。 要想接收從其他窗口發(fā)送來的信息,必須對(duì)窗口對(duì)象的 onmessage 事件進(jìn)行監(jiān)聽,其它窗口可以通過 postMessage 方法來傳遞數(shù)據(jù)。該方法使用兩個(gè)參數(shù):第一個(gè)參數(shù)為所發(fā)送的消息文本,但也可以是任何 JavaScript 對(duì)象(通過 JSON 轉(zhuǎn)換對(duì)象為文本),第二個(gè)參數(shù)為接收消息的對(duì)象窗口的 URL 地址,可以在 URL 地址字符串中使用通配符'*'指定全部地。

       在 Cross-document messaging 中使用 postMessage 和 onmessage

       為了實(shí)現(xiàn)不同域之間的通信,需要在操作系統(tǒng)的 hosts 文件添加兩個(gè)域名,進(jìn)行模擬。

       清單 3. hosts 文件中添加兩個(gè)不同的域名

127.0.0.1 parent.com
127.0.0.1 child.com

       在父網(wǎng)頁中通過 iframe 嵌入子頁面,并在 JavaScript 代碼中調(diào)用 postMessage 方法發(fā)送數(shù)據(jù)到子窗口。

       清單 4. 父頁面中嵌入子頁面,調(diào)用 postMessage 方法發(fā)送數(shù)據(jù)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Test Cross-domain communication using HTML5</title>
<script type="text/JavaScript">
function sendIt(){
// 通過 postMessage 向子窗口發(fā)送數(shù)據(jù)
document.getElementById("otherPage").contentWindow
.postMessage(
document.getElementById("message").value,
"http://child.com:8080"
);
}
</script>
</head>
<body>
<!-- 通過 iframe 嵌入子頁面 -->
<iframe src="http://child.com:8080/TestHTML5/other-domain.html"
id="otherPage"></iframe>
<br/><br/>
<input type="text" id="message"><input type="button"
value="Send to child.com" onclick="sendIt()" />
</body>
</html>

       在子窗口中監(jiān)聽 onmessage 事件,并用 JavaScript 實(shí)現(xiàn)顯示父窗口發(fā)送過來的數(shù)據(jù)。

       清單 5. 子窗口中監(jiān)聽 onmessage 事件,顯示父窗口發(fā)送來的數(shù)據(jù)

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Web page from child.com</title>
<script type="text/JavaScript">
//event 參數(shù)中有 data 屬性,就是父窗口發(fā)送過來的數(shù)據(jù)
window.addEventListener("message", function( event ) {
// 把父窗口發(fā)送過來的數(shù)據(jù)顯示在子窗口中
document.getElementById("content").innerHTML+=event.data+"<br/>";
}, false );

</script>
</head>
<body>
Web page from http://child.com:8080
<div id="content"></div>
</body>
</html>

圖 2. 父窗口嵌入子窗口

圖 3. 父窗口發(fā)送數(shù)據(jù)到子窗口

       WebSockets

       WebSockets 簡介

       在 Web 應(yīng)用中,HTTP 協(xié)議決定了客戶端和服務(wù)端連接是短連接,即客戶端 Request,服務(wù)端 Response,連接斷開。要想實(shí)現(xiàn)客戶端和服務(wù)端實(shí)時(shí)通信,只能通過客戶端輪詢來實(shí)現(xiàn)。服務(wù)端推送數(shù)據(jù)也并不是字面上意思上的直接推,其實(shí)還是客戶端自己取。WebSockets 是 HTML5 規(guī)范新引入的功能,用于解決瀏覽器與后臺(tái)服務(wù)器雙向通訊的問題,使用 WebSockets 技術(shù),后臺(tái)可以隨時(shí)向前端推送消息,以保證前后臺(tái)狀態(tài)統(tǒng)一。

       在 WebSockets 中使用 send 和 onmessage

       由于文本主要介紹 postMessage(send) 和 onmessage 客戶端 API 的應(yīng)用,而 WebSockets 涉及到服務(wù)器端代碼的實(shí)現(xiàn),所以本文將選取最簡單的服務(wù)器端框架來編寫服務(wù)器代碼。WebSockets 服務(wù)器端有 jetty 提供的基于 Java 的實(shí)現(xiàn),有 WebSocket-Node 基于 node.js 的實(shí)現(xiàn),在 .Net 4.5 中也直接提供了 WebSockets 的支持。本文將使用 WebSocket-Node 提供的示例代碼,稍作修改作為 WebSockets 的服務(wù)器端。關(guān)于 node.js 的介紹以及使用請(qǐng)參考 node.js 官方網(wǎng)站 node.js,關(guān)于 WebSocket-Node 的使用請(qǐng)參考 WebSocket-Node。

       首先,需要在客戶端通過 JavaScript 代碼 new 一個(gè) WebSocket 實(shí)例出來,參數(shù)是實(shí)現(xiàn) WebSocket 服務(wù)器端 URL 地址。然后在這個(gè)實(shí)例上監(jiān)聽 onmessage 事件接收服務(wù)器端發(fā)送過來的數(shù)據(jù)。當(dāng)然,客戶端也可以調(diào)用 send 方法,發(fā)送數(shù)據(jù)到服務(wù)器端。

       清單 6. 創(chuàng)建 WebSocket 對(duì)象,并監(jiān)聽 onmessage 事件


connect : function() {
var location ="ws://localhost:8000/";
// 創(chuàng)建 WebSockets 并傳入 WebSockets server 地址
this._ws =new WebSocket(location);
this._ws.onmessage=this._onmessage;
//WebSockets 還提供了 onopen 以及 onclose 事件
this._ws.onopen =this._onopen;
this._ws.onclose =this._onclose;
}

       在 _onmessage 方法中,接收數(shù)據(jù),并顯示在頁面上

       清單 7. _onmessage 方法

 _onmessage : function(event) {
//event 參數(shù)中有 data 屬性,就是服務(wù)器發(fā)送過來的數(shù)據(jù)
if (event.data) {
var messageBox = document.getElementById('messageBox');
var spanText = document.createElement('span');
spanText.className ='text';
// 把服務(wù)器發(fā)送過來的數(shù)據(jù)顯示在窗口中
spanText.innerHTML = event.data;
var lineBreak = document.createElement('br');
messageBox.appendChild(spanText);
messageBox.appendChild(lineBreak);
messageBox.scrollTop = messageBox.scrollHeight
- messageBox.clientHeight;
}
},

       在 _onopen 方法中,調(diào)用 _send 方法發(fā)送一條消息到服務(wù)器端,告之連接已經(jīng)建立。在 _onclose 方法中,把 WebSocket 的實(shí)例設(shè)置成 null,釋放資源。

       清單 8. _onopen,_onclose 以及 send 方法

_onopen : function() {
server._send("Client:Open WebSockets,"+new Date());
},
//message 參數(shù)就是客戶端向服務(wù)器端發(fā)送的數(shù)據(jù)
_send : function(message) {
if (this._ws)
this._ws.send(message);
},
// 此方法提供外部代碼調(diào)用
send : function(text) {
if (text !=null&& text.length >0)
server._send(text);
},

_onclose : function(m) {
this._ws =null;
}

       把這些方法封裝在一個(gè) server 對(duì)象中,方便提供外部調(diào)用。用戶只需要先調(diào)用 server 的 connect 方法建立連接,然后調(diào)用 send 方法發(fā)送數(shù)據(jù)。

       清單 9. 封裝客戶端實(shí)現(xiàn)

var server = {
// 對(duì)外主要提供 connect 和 send 方法
connect : function() {...},
_onopen : function() {...},
_send : function(message) {...},
send : function(text) {...},
_onmessage : function(event) {...},
_onclose : function(m) {...}
};

       在服務(wù)器端,通過 JavaScript 語言簡單修改 WebSocket-Node 中提供的 echo-server.js 示例即可。這里只展示關(guān)鍵代碼部分,其它代碼請(qǐng)參見 WebSocket-Node 示例。

       清單 10. WebSockets 服務(wù)器端簡單實(shí)現(xiàn)

// 監(jiān)聽客戶端的連接請(qǐng)求
wsServer.on('connect', function(connection) {
function sendCallback(err) {
if (err) console.error("send() error: " + err);
}
// 監(jiān)聽客戶端發(fā)送數(shù)據(jù)的請(qǐng)求
connection.on('message', function(message) {
if (message.type === 'utf8') {// 區(qū)別客戶端發(fā)過來的數(shù)據(jù)是文本還是二進(jìn)制類型
connection.sendUTF(
"Server:Get message:<br/>"+message.utf8Data, sendCallback
);
}
else if (message.type === 'binary') {
connection.sendBytes(message.binaryData, sendCallback);
}
});
connection.on('close', function(reasonCode, description) {
});
});

圖 4. 點(diǎn)擊 Connect 按鈕

圖 5. 輸入內(nèi)容,單擊 Send Message 按鈕

       Server-Sent Events

       Server-Sent Events 簡介

       HTML5 Server-Sent 事件模型允許您從服務(wù)器 push 實(shí)時(shí)數(shù)據(jù)到瀏覽器。本文我們將介紹利用 Eventsource 對(duì)象處理與頁面間的接收和發(fā)送數(shù)據(jù)。在客戶端,我們使用 HTML5+JavaScript,服務(wù)端使用 Java。在現(xiàn)存的 Ajax 模式中,web 頁面會(huì)持續(xù)不斷地請(qǐng)求服務(wù)器傳輸新數(shù)據(jù),由客戶端負(fù)責(zé)請(qǐng)求數(shù)據(jù)。而在服務(wù)端發(fā)送模式下,無需在客戶端代碼中執(zhí)行連續(xù)的數(shù)據(jù)請(qǐng)求,而是由服務(wù)端 push 推送更新。一旦您在頁面中初始化了 Server-Sent 事件,服務(wù)端腳本將持續(xù)地發(fā)送更新。客戶端 JavaScript 代碼一旦接收到更新就將新的數(shù)據(jù)寫入頁面中展示出來。

       在 Server-Sent Events 中使用 onmessage

       Server-Sent Events 和 WebSockets 有相同之處,WebSockets 實(shí)現(xiàn)了服務(wù)器端以及客戶端的雙向通信功能,而 Server-Sent Events 則僅是指服務(wù)器端到客戶端的單向通信,而且 Server-Sent Events 同樣需要服務(wù)器端的實(shí)現(xiàn),本文將使用基于 Java 的 Servlet 技術(shù)實(shí)現(xiàn)服務(wù)器端。關(guān)于服務(wù)器端向客戶端寫數(shù)據(jù)的格式,可以參考 W3C 關(guān)于 Server-Sent Events 的規(guī)范文檔 Server-Sent Events。由于是服務(wù)器端到客戶端的單向通信,所以在 Server-Sent Events 中沒有 postMessage 方法。
首先,在客戶端通過 JavaScript 代碼 new 一個(gè) EventSource 實(shí)例出來,參數(shù)是實(shí)現(xiàn) EventSource 服務(wù)器端 URL 地址。然后在這個(gè)實(shí)例上監(jiān)聽 onmessage 事件接收服務(wù)器端發(fā)送過來的數(shù)據(jù)。

       清單 11. 創(chuàng)建 EventSource 對(duì)象,并監(jiān)聽 onmessage 事件
if (!!window.EventSource) {
// 創(chuàng)建 EventSource 實(shí)例,傳入 server 地址
var source = new EventSource('/TestHTML5/ServerSentEvent');
} else {
console.log("Your browser doesn't support server-sent event");
}
// 監(jiān)聽 message 事件,等待接收服務(wù)器端發(fā)送過來的數(shù)據(jù)
source.addEventListener('message', function(event) {
//event 參數(shù)中有 data 屬性,就是服務(wù)器發(fā)送過來的數(shù)據(jù)
console.log(event.data);
}, false);

//EventSource 還提供了 onopen 以及 onerror 事件
source.addEventListener('open', function(event) {
}, false);

source.addEventListener('error', function(event) {
if (event.readyState == EventSource.CLOSED) {
}
}, false);

       服務(wù)器端,在 Java 語言實(shí)現(xiàn)的 Servlet doGet 方法中使用 response 對(duì)象向客戶端寫數(shù)據(jù)

       清單 12. 服務(wù)器端簡單實(shí)現(xiàn)

// 這里必須設(shè)置 Content-Type 為 text/event-stream
response.setHeader("Content-Type", "text/event-stream");
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding ("UTF-8");

String id = new Date().toString();
response.getWriter().println("id:"+id);
// 向客戶端寫兩行數(shù)據(jù)
response.getWriter().println("data:server-sent event is working.");
response.getWriter().println("data:test server-sent event multi-line data");
response.getWriter().println();
response.getWriter().flush();

圖 6. Server-Sent Events 運(yùn)行結(jié)果

       結(jié)束語

       本文詳細(xì)介紹了 postMessage(send)和 onmessage API 在客戶端的應(yīng)用情況,可以看到在不同的場景中這兩個(gè)方法的應(yīng)用模式都是類似的。postMessage 的作用就是傳遞數(shù)據(jù),而 onmessage 的作用就是接收數(shù)據(jù)。掌握此組 API 對(duì)以后開發(fā) HTML 5 應(yīng)用程序?qū)?huì)有所幫助。本文 Web Workers,Cross-document messaging,WebSockets 的代碼在 Firefox 14 下通過測試,Server-Sent Events 的代碼在 Chrome 16 下通過測試。
【網(wǎng)站聲明】本站除付費(fèi)源碼經(jīng)過測試外,其他素材未做測試,不保證完整性,網(wǎng)站上部分源碼僅限學(xué)習(xí)交流,請(qǐng)勿用于商業(yè)用途。如損害你的權(quán)益請(qǐng)聯(lián)系客服QQ:2655101040 給予處理,謝謝支持。

相關(guān)文檔推薦

由于實(shí)際運(yùn)行環(huán)境是在瀏覽器中,因此性能還取決于JavaScript解釋器的效率,指定的FPS幀速在低性能解釋器中可能不會(huì)達(dá)到,所以這部分不是開發(fā)者能夠決定的,開發(fā)者能作的是盡可能通
本文將使用HTML5提供的VideoAPI做一個(gè)自定義的視頻播放器,需要用到HTML5提供的video標(biāo)簽、以及HTML5提供的對(duì)JavascriptAPI的擴(kuò)展。,HTML5中國,中國最大的HTML5中文門戶。
隨著 Hybrid 應(yīng)用的豐富,HTML5 工程師們已經(jīng)不滿足于把桌面端體驗(yàn)簡單移植到移動(dòng)端,他們覬覦移動(dòng)原生應(yīng)用人性化的操作體驗(yàn),特別是原生應(yīng)用與生俱來的豐富的手勢系統(tǒng)。HTML5 沒有提
你想要在自己網(wǎng)站上分享一個(gè)產(chǎn)品,或者是一個(gè)作品集,又或者僅僅只是一個(gè)靈感。在你發(fā)布到網(wǎng)上之前,你想讓它看起來有吸引力,專業(yè),或者至少得看起來像那么回事。那么你接下
本篇文章主要介紹了html5 postMessage解決跨域、跨窗口消息傳遞方案,具有一定的參考價(jià)值,有需要的可以了解一下、
H5廣告,包括H5廣告的設(shè)計(jì)流程,究竟有什么講究,和階段。為了能幫助更多的人了解H5廣告,我專門做了一個(gè)講義。同時(shí),也讓我意外的收到了非常好反饋和認(rèn)!這是對(duì)我的極大鼓勵(lì)!我的
主站蜘蛛池模板: 山东石英砂过滤器,除氟过滤器「价格低」-淄博胜达水处理 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | ET3000双钳形接地电阻测试仪_ZSR10A直流_SXJS-IV智能_SX-9000全自动油介质损耗测试仪-上海康登 | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 穿线管|波纹穿线管|包塑金属软管|蛇皮管?闵彬专注弱电工程? | 车辆定位管理系统_汽车GPS系统_车载北斗系统 - 朗致物联 | PCB设计,PCB抄板,电路板打样,PCBA加工-深圳市宏力捷电子有限公司 | 转子泵_凸轮泵_凸轮转子泵厂家-青岛罗德通用机械设备有限公司 | 防腐木批发价格_深圳_惠州_东莞防腐木厂家_森源(深圳)防腐木有限公司 | 电线电缆厂家|沈阳电缆厂|电线厂|沈阳英联塑力线缆有限公司 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 高考志愿规划师_高考规划师_高考培训师_高报师_升学规划师_高考志愿规划师培训认证机构「向阳生涯」 | 定制异形重型钢格栅板/钢格板_定做踏步板/排水沟盖板_钢格栅板批发厂家-河北圣墨金属制品有限公司 | 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 | 济南品牌设计-济南品牌策划-即合品牌策划设计-山东即合官网 | 伶俐嫂培训学校_月嫂培训班在哪里报名学费是多少_月嫂免费政府培训中心推荐 | 中天寰创-内蒙古钢结构厂家|门式刚架|钢结构桁架|钢结构框架|包头钢结构煤棚 | 家乐事净水器官网-净水器厂家「官方」 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 智慧钢琴-电钢琴-便携钢琴-数码钢琴-深圳市特伦斯乐器有限公司 | 德国进口电锅炉_商用电热水器_壁挂炉_电采暖器_电热锅炉[德国宝] | 氧化铝球_高铝球_氧化铝研磨球-淄博誉洁陶瓷新材料有限公司 | 叉车电池-叉车电瓶-叉车蓄电池-铅酸蓄电池-电动叉车蓄电池生产厂家 | 上海租车公司_上海包车_奔驰租赁_上海商务租车_上海谐焕租车 | 防堵吹扫装置-防堵风压测量装置-电动操作显示器-兴洲仪器 | 河北中仪伟创试验仪器有限公司是专业生产沥青,土工,水泥,混凝土等试验仪器的厂家,咨询电话:13373070969 | 糖衣机,除尘式糖衣机,全自动糖衣机,泰州市长江制药机械有限公司 体感VRAR全息沉浸式3D投影多媒体展厅展会游戏互动-万展互动 | 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 四合院设计_四合院装修_四合院会所设计-四合院古建设计与建造中心1 | 继电器模组-IO端子台-plc连接线-省配线模组厂家-世麦德 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 雾度仪_雾度计_透光率雾度仪价格-三恩时(3nh)光电雾度仪厂家 | 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | 贴片电感_贴片功率电感_贴片绕线电感_深圳市百斯特电子有限公司 贴片电容代理-三星电容-村田电容-风华电容-国巨电容-深圳市昂洋科技有限公司 | 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 北京三友信电子科技有限公司-ETC高速自动栏杆机|ETC机柜|激光车辆轮廓测量仪|嵌入式车道控制器 | 全自动端子机|刺破式端子压接机|全自动双头沾锡机|全自动插胶壳端子机-东莞市傅氏兄弟机械设备有限公司 | [品牌官网]贵州遵义双宁口腔连锁_贵州遵义牙科医院哪家好_种植牙_牙齿矫正_原华美口腔 | 净化车间装修_合肥厂房无尘室设计_合肥工厂洁净工程装修公司-安徽盛世和居装饰 | 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 湖南档案密集架,智能,物证,移动,价格-湖南档案密集架厂家 |