论坛登陆 注册 文章专区 电视影院 投稿文章 旧版浏览
首页 | 页界资讯 | 网络应用 | 软件应用 | 组网技术 | 网络原理 | 聊天通讯 | 网管知识 | 帮助
专题 | 操作系统 | 注 册 表 | 编程开发 | 数 据 库 | 媒体动画 | 网页设计 | 图形图象 | 地图
论坛 | 网络安全 | 安全防范 | 服 务 器 | 硬件学堂 | 路由技术 | 搜索研究 | 站长经验 | 投稿
影院 | 教育频道 | 特色专题 | 精文荟萃 | 注 册 码 | 论坛社区 | 网站地图 | 广告服务 | 旧版
设为首页 加入收藏
当前位置:首页>>文章>>编程开发>>JavaScript>>正文

用JavaScript实现利用FLASH嵌入声音

www.xker.com 作者:不详 来源:网络转载 加入日期:2005-12-28 8:35:43

【问题提问、论坛交流】


  本JavaScipt教程将让你感受到FLASH给您带来有声世界的无穷魅力在开始本教程之前,我先介绍一下本教程涉及到的内容:隐藏嵌入的SWF、 播放流同步的SWF、 从指定的帧上开始流、 停止和播放流、 检查是否磁道在播放、 检查是否播放器准备好、 检查SWF转载的百分比、验证SWF是否完全装载好、检查播放器的版本号、设置最小的播放器版本号、 清除错误信息等等好吧,开始我们的教程吧

隐藏嵌入的SWF

FlashSound的JavaScript API往网页插入一个FlashSound对象,随同插入还有embedSWF()方法但是在网页中我们为什么不能看到这个对象呢?哦,原来是FlashSound隐藏了这个对象在Internet浏览器中,FlashSound是这个对象变得透明,也就是说你看不到这个对象,但实际上它是存在的而在Netscape浏览器中,这个对象的颜色被指定为跟网页相同的颜色,所以你也看不到它你可以在Netscape浏览器中通过使用bgcolor属性来设置对象的颜色以上两种方法正是隐藏对象的核心所在试一试吧,下面我的代码是实现当鼠标移过对象时播放scale.swf文件,所以我们这样来创建FlashSound对象:

<SCRIPT>

mySoundObj.bgcolor = "#0000ff";

mySoundObj.embedSWF("scale.swf");

</SCRIPT>

下面的代码可以让你在Netscape浏览器中看到在“Play a Scale”下面有一个小点,它正是我们创建的FlashSound,因为此时它的颜色不是与网页的背景色相同,看看代码吧:

<HTML>

<HEAD>

<SCRIPT SRC="flashsound.js"></SCRIPT>

<SCRIPT>

var mySoundObj = new FlashSound();

</SCRIPT>

</HEAD>

<BODY>

<P><A HREF="javascript://"

onmouseover="mySoundObj.TGotoAndPlay('/scale-event', 'start')">

Play a Scale</A>

<SCRIPT>

mySoundObj.bgcolor = "#0000ff";

mySoundObj.embedSWF("scale.swf");

</SCRIPT>

播放流同步的SWF

Flash文件格式支持四种同步的类型:Event(事件)、Start(开始)Stop(停止)和Stream(流)事件同步允许你同时播放多个磁道的声音;开始同步可以避免并行的磁道播放;停止同步作用是停止磁道播放;而对于流同步声音包含了声音的帧尺寸样式,它可以反复地天衣无缝地播放不象其它真实的流声音格式(比如Real Audio),Flash流文件是在播放的时候装载到浏览器中去的当播放结束的时候,这个流声音就全部被装载浏览器的高度缓冲区中所以在接下去的播放是来源与浏览器的告诉缓冲区,而不是来源于网页

以下的连接是播放一个流同步,它解释了FlashSound的JavaScript API,代码如下:

<HTML>

<HEAD>

<SCRIPT SRC="flashsound.js"></SCRIPT>

<SCRIPT>

var mySoundObj = new FlashSound();

</SCRIPT>

</HEAD>

<BODY>

<SCRIPT>

mySoundObj.embedSWF("earsonly.swf");

</SCRIPT>

</BODY>

</HTML>

这里值得注意的是Flash声音被设置在Flash编辑器中来自动开始播放
从指定的帧上开始流 FlashSound的JavaScript API支持象CD播放器那样的随机访问磁道中任何帧的能力所以你可以指定任意的帧好来播放你喜欢的声音

如图1所示的四个连接是连到一个典型的CD播放器控制面板上,第一个连接是回到第一帧开始播放,第二个连接是否从第100帧处开始播放,第三个连接是从第200帧处开始播放,而第四个连接是暂停所有的播放

(图1)

详细的代码如下:

<HTML>

<HEAD>

<SCRIPT SRC="flashsound.js"></SCRIPT>

<SCRIPT>

var mySoundObj = new FlashSound();

</SCRIPT>

</HEAD>

<BODY>

<A HREF="javascript://"

onmouseover="mySoundObj.TGotoAndPlay('/',1)">

从第1帧开始播放</A>

<A HREF="javascript://"

onmouseover="mySoundObj.TGotoAndPlay('/',100)">

从第1000帧开始播放</A>

<A HREF="javascript://"

onmouseover="mySoundObj.TGotoAndPlay('/',200)">

从第200帧开始播放</A>;

<A HREF="javascript://"

onmouseover="mySoundObj.TStopPlay('/')">

暂停</A><

<SCRIPT>

mySoundObj.autostart = false;

mySoundObj.embedSWF("earsonly.swf");

</SCRIPT>

</BODY>

</HTML>

这里我们将autostart(自动开始播放)设置为Flase这个例子很好地说明了我们怎样利用JavaScript来重载Flash行为

停止和播放流

FlashSound的JavaScript API支持一个等价于暂停的方法,即TStopPlay()这个TStopPlay()方法有一个参数,即timeline(时间线)我们可以使用“/”(反斜线)来指定主时间线TStopPlay()可以在指定的时间线上停止向前播放,而不会重新播放值得指出的是,这个TstopPlay()方法只能停止了设置为流同步的声音的播放,而不能设置为时间或者开始同步的声音的播放

同样,FlashSound的JavaScript API页支持等价于播放的方法,即TPlay()这个TPlay()方法也有一个参数,也为时间线类似地,我们可以使用“/”来指定主时间线TPlay()可以在被TStopPlay()停止播放的帧处的时间线(传递给TPlay()的参数)上开始播放,或者从第一帧开始播放这个TPlay()方法也只能开始播放被设置为流同步的声音,也不能开始播放被设置为时间同步或者开始同步的声音

(图2)

如图2所示的三个连接是连到典型的磁带录音机控制面板上第一个连接是利用TGotoAndPlay()重新播放,第二个连接是利用TStopPlay()来暂停播放,而第三个连接是利用Tplay来继续播放被暂停在某处的声音详细的代码如下: <HTML>

<HEAD>

<SCRIPT SRC="flashsound.js"></SCRIPT>

<SCRIPT>

var mySoundObj = new FlashSound();

</SCRIPT>

</HEAD>

<BODY>

<A HREF="javascript://" onmouseover="mySoundObj.TGotoAndPlay('/',1)">

重新开始播放</A>

<A HREF="javascript://" onmouseover="mySoundObj.TStopPlay('/')">

暂停播放</A>

<A HREF="javascript://" onmouseover="mySoundObj.TPlay('/')">

继续播放</A>

<SCRIPT>

mySoundObj.autostart = false;

mySoundObj.embedSWF("earsonly.swf");

</SCRIPT>

</BODY>

</HTML>
检查是否磁道在播放 FlashSound的JavaScript API可以让你检查磁道是否在播放,为了做到这点它为了提供了IsPlaying()方法这个IsPlaying()方法没有任何参数,它只是在有磁道在播放的时候才返回True(真),否则就返回False(假)所以你可以利用这个方法来创建一些例子,比如你可以在声音磁道没有播放的情况下在另外一个磁道播放声音,这个实现起来是很简单的

如图3所示的前三个连接是连到典型的磁带录音机控制面板而右边的连接是检查在时间上是否有磁道在播放当鼠标移过它的时候,我们就可以获得“是否播放”的答案了在图3中第二行的连接是播放一个scale音乐,但是它只能在教程音乐没有播放的时候才播放,为了实现这个目的,我们来检查教程音乐的IsPlaying()的值是否为False这里教程音乐对象为mySoundObj1,而scale音乐对象是mySoundObj2,所以实现以上功能的语句应该为:

if (!mySoundObj1.IsPlaying()) mySoundObj2.TGotoAndPlay('/scale-event', 'start')

好吧,我们可以试一试我们的这几个连接了首先开始播放我们的教程音乐,在停止该该教程音乐以播放scale音乐,然后在继续教程音乐,这时候你会发觉scale音乐停止了

(图3)

具体源代码如下:

<HTML>

<HEAD>

<SCRIPT SRC="flashsound.js"></SCRIPT>

<SCRIPT>

var mySoundObj1 = new FlashSound();

var mySoundObj2 = new FlashSound();

</SCRIPT>

</HEAD>

<BODY>

<P><A HREF="javascript://"

onmouseover="mySoundObj1.TGotoAndPlay('/',1)">播放教程音乐</A>

<A HREF="javascript://"

onmouseover="mySoundObj1.TStopPlay('/')">暂停播放</A>

<A HREF="javascript://"

onmouseover="mySoundObj1.TPlay('/')">继续播放</A>

<A HREF="javascript://"

onmouseover="alert(mySoundObj1.IsPlaying('/'))">是否播放</A></P>

<A HREF="javascript://"

onmouseover="if (!mySoundObj1.IsPlaying()) mySoundObj2.TGotoAndPlay('/scale-event', 'start')">播放Scale音乐</A></P>

<SCRIPT>

mySoundObj1.autostart = false;

mySoundObj1.embedSWF("earsonly.swf");

mySoundObj2.embedSWF("scale.swf");

</SCRIPT>

</BODY>

</HTML>

检查是否播放器准备好

FlashSound的JavaScript API的isPlayerReady()方法在浏览器识别到播放器和JavaScrip对象并且SWF至少被装载一个帧上的时候就返回True(真值)如果不是这样的话就返回FalseFlashSound API是在所有其它API方法调用之前执行这个方法,所以你不用担心多次使用它会有什么问题的但是你在调用一个Flash方法的时候,你必须使用isPlayerReady(),因为Flash方法不是FlashSound的 JaScript API的一部分

如图4所示的连接是播放一个Flash流磁道,它在FlashSound上播放一段教程音乐我们可以增加两条语句来实现,第一条,在嵌入教程音乐之前,我们打印出isPlayReady()的数值;第二条,在嵌入教程SWF之后打印出isPlayerReady()的数值这样我们可以看看这两次的区别,从打印的结果我们可以发现:在嵌入教程音乐之前,isPlayReady()的值是False,而在嵌入教程音乐之后,其值是True

(图4)

下面是详细的代码:

<HTML>

<HEAD>

<SCRIPT SRC="flashsound.js"></SCRIPT>

<SCRIPT>

var mySoundObj = new FlashSound();

</SCRIPT>

</HEAD>

<BODY>

<P><A HREF="javascript://"

onmouseover="mySoundObj.TGotoAndPlay('/',1)">播放教程音乐</A>

<A HREF="javascript://"

onmouseover="mySoundObj.TStopPlay('/')">暂停播放</A>

<A HREF="javascript://"

onmouseover="mySoundObj.TPlay('/')">继续播放</A>

<A HREF="javascript://"

onmouseover="alert(mySoundObj.IsPlaying('/'))">是否播放</A></P>

<SCRIPT>

alert("Before Embedding, isPlayerReady() returns " +

mySoundObj.isPlayerReady());

mySoundObj.autostart = false;

mySoundObj.embedSWF("earsonly.swf");

alert("After Embedding, isPlayerReady() returns " +

mySoundObj.isPlayerReady());

</SCRIPT>

</BODY>

</HTML>
检查SWF转载的百分比 FlashSound JavaScript API的PercentLoaded()方法返回SWF装载到浏览器的百分比这个数值可以是从0到100的任意值如果你装载一个SWF(当然包括流同步磁道)到网页的时候这个数值都将小于等于100

点击如图5所示的连接就可以播放一个Flash流磁道,它是一个FlashSound的教程音乐对于上面的代码语句我们也只需要修改两条语句第一条,在嵌入教程音乐的之前打印出PercentLoaded()的数值;第二条,在嵌入教程音乐SWF之后打印这个数值从结果中你可以发现:在嵌入教程音乐之前,PercentLoaded()的数值为0,而在嵌入教程音乐完毕之后,这个数值为100

(图5)

以下是具体代码:

<HTML>

<HEAD>

<SCRIPT SRC="flashsound.js"></SCRIPT>

<SCRIPT>

var mySoundObj = new FlashSound();

</SCRIPT>

</HEAD>

<BODY>

<P><A HREF="javascript://"

onmouseover="mySoundObj.TGotoAndPlay('/',1)">播放教程音乐</A>

<A HREF="javascript://"

onmouseover="mySoundObj.TStopPlay('/')">暂停播放</A>

<A HREF="javascript://"

onmouseover="mySoundObj.TPlay('/')">继续播放</A>

<A HREF="javascript://"

onmouseover="alert(mySoundObj.IsPlaying('/'))">是否播放</A></P>

<SCRIPT>

alert("Before Embedding, PercentLoaded() returns " +

mySoundObj.PercentLoaded());

mySoundObj.autostart = false;

mySoundObj.embedSWF("earsonly.swf");

alert("After Embedding, PercentLoaded() returns " +

mySoundObj.PercentLoaded());

</SCRIPT>

</BODY>

</HTML>

验证SWF是否完全装载好

FlashSound JavaScript API的Tloaded方法返回SWF是否已经完全装载到浏览器这个数值可以为False或者True当你往网页嵌入你的SWF文件(当然包括流同步磁道)的时候,它返回Fasle值只能等到装载完毕的时候才返回True值

点击如图6所示的连接,就将播放一段Flash流磁道,即FlashSound中的教程音乐当然我们对上面的代码要修改两个地方第一,在嵌入教程音乐之前打印Tloaded()的数值;第二,在嵌入教程音乐之后打印Tloaded()的数值此时,从结果中你可以发现:在嵌入教程音乐之前,TLoaded()的数值为False值,而在嵌入教程音乐完毕之后,这个数值为True值

(图6)

具体修改的代码如下:

<HTML>

<HEAD>

<SCRIPT SRC="flashsound.js"></SCRIPT>

<SCRIPT>

var mySoundObj = new FlashSound();

</SCRIPT>

</HEAD>

<BODY>

<P><A HREF="javascript://"

onmouseover="mySoundObj.TGotoAndPlay('/',1)">播放教程音乐</A>

<A HREF="javascript://"

onmouseover="mySoundObj.TStopPlay('/')">暂停播放</A>

<A HREF="javascript://"

onmouseover="mySoundObj.TPlay('/')">继续播放</A>

<A HREF="javascript://"

onmouseover="alert(mySoundObj.IsPlaying('/'))">是否播放</A></P>

<SCRIPT>

alert("Before Embedding, TLoaded() returns " +

mySoundObj.TLoaded());

mySoundObj.autostart = false;

mySoundObj.embedSWF("earsonly.swf");

alert("After Embedding, TLoaded() returns " +

mySoundObj.TLoaded());

</SCRIPT>

</BODY>

</HTML>
检查播放器的版本号 随着Flash播放器的飞速发展,你可能很想知道你的Flash播放器的版本号是多少值得庆幸的是,FlashSound JavaScript API就支持检查播放器的版本号这是FlashSound对象的一个属性为了得到这个数值,你需要编写以下的代码语句:

FlashSound.playerVersion

这个属性应该设置为只读虽然你可以指定它的数值,但是为播放器版本号指定一个数值久将导致一个错误为了得到播放器的版本号,我们不必做任何事情而只需包括FlashSound JavaScript代码,即flashsound.js移动鼠标到如图7所示的连接就可以得到播放器的版本号

(图7)

以下是具体的代码:

<HTML>

<HEAD>

<SCRIPT SRC="flashsound.js"></SCRIPT>

</HEAD>

<BODY>

<P><A HREF="javascript://"

onmouseover="alert(FlashSound.playerVersion)">播放器的版本号</A></P>

</BODY>

</HTML>

有时候,你可能想限制一下你的手稿程序来确定Flash播放器的版本号你可以利用FlashSound对象的setMinPlayer()方法来实现它FlashSound JavaScript API为你提供了许多强大的功能你可以指定一个条代码来执行当现有的播放器的版本号低于播放器的最小版本号的处理

下面让我们来验证一下ifNotMinPlayer()方法是如何工作的因为最高的播放器版本号是5,所以我们将最小的播放器版本号设置为6来测试一下这种方法这个方法ifNotMinPlayer()应该是在setMinPlayer()方法之后被使用的点击如图8的连接可以看一下这种新方法的演示:

(图8)

为了设置最小的播放器版本号为6我们可以使用语句:setMinPlayer(6),并调用ifNotMinPlayer()以及带有一个参数的函数downloadRecentPlayer()这个downloadRecentPlayer()函数会提示你下载较新版本的播放器

以下是具体实现的代码:

<HTML>

<HEAD>

<SCRIPT SRC="flashsound.js"></SCRIPT>

</HEAD>

<BODY>

<SCRIPT LANGUAGE="JavaScript">

function downloadRecentPlayer() {

alert("你需要下载较新版本的Flash播放器");

}

FlashSound.setMinPlayer(6);

FlashSound.ifNotMinPlayer('downloadRecentPlayer()');

</SCRIPT>

</BODY>

</HTML>
设置最小的播放器版本号 有时候,在编写一个独立版本的手稿程序要花费许多时间所以,你可能会选择一种高于最小版本号的版本通常,你可能会选择最新的播放器版本所以,就有这样一个问题:为什么我们要处理那些老版本的播放器呢?你可以利用setMinPlayer()方法来设置最小版本号它唯一的一个参数是版本号

下面让我们来验证以下setMinPlayer()是如何工作的因为最好的版本号是5,我们当我们设置最小的版本号为6的时候,播放器将不会发出声音

如图9所示的三行的连接会向我们展示这所有的一切第一行第一个连接示设置最小的版本号为5,第二个示设置播放器的最小版本号为6,这是就会使得播放器不会发出声音你马上可以试一试

(图9)

以下是具体代码:

<HTML>

<HEAD>

<SCRIPT SRC="flashsound.js"></SCRIPT>

<SCRIPT>

var mySoundObj1 = new FlashSound();

var mySoundObj2 = new FlashSound();

</SCRIPT>

</HEAD>

<BODY>

<P><A HREF="javascript://"

onmouseover="FlashSound.setMinPlayer(5);

alert('播放器最小版本号被设置为5')">

设置播放器最小版本号为5</A>

<A HREF="javascript://"

onmouseover="FlashSound.setMinPlayer(6);

alert('播放器最小版本号被设置为6')">

设置播放器最小版本号为 6</A></P>

<A HREF="javascript://"

onmouseover="mySoundObj1.TGotoAndPlay('/',1)">播放教程音乐</A>

<A HREF="javascript://"

onmouseover="mySoundObj1.TStopPlay('/')">暂停播放</A>

<A HREF="javascript://"

onmouseover="mySoundObj1.TPlay('/')">继续播放</A>

<A HREF="javascript://"

onmouseover="alert(mySoundObj1.IsPlaying('/'))">是否播放</A></P>

<A HREF="javascript://"

onmouseover="if (!mySoundObj1.IsPlaying()) mySoundObj2.TGotoAndPlay('/scale-event', 'start')">播放Scale音乐</A></P>

<SCRIPT>

mySoundObj1.autostart = false;

mySoundObj1.embedSWF("earsonly.swf");

mySoundObj2.embedSWF("scale.swf");

</SCRIPT>

</BODY>

</HTML>
清除错误信息 清除错误信息在所有的编程语言中都是一个值得讨论的题目通常它是一个令程序员头痛的事情对于一个程序也许你都有这样的感受:当你编制程序的时候发现一个错误,你一定会兴奋不已,或者你检查了多遍程序还是发现不了错误存在的地方,同样会令你烦恼因为这是一个很严谨的题目 ,所以就让你自己去决定了毫无疑问,对于一个编程的新手来说,错误信息是一个很重要的内容,因为你需要根据这个错误信息来调试你的新手稿程序

利用FlashSound JavaScript API你可以选择是否清除错误信息,具体是利用FlashSound 对象的muteErrorMsg属性为了保留错误信息,你需要将这个属性设置为False如果想在调试阶段还是将它设置为True其实缺省值就是True,一旦设置为true错误信息就将被清除

下面的JavaScript代码包含了一个错误,因为有一个变量没有被定义:

<SCRIPT LANGUAGE="JavaScript">

FlashSound.muteErrorMsg = a;

</SCRIPT>

我们可以为这个JavaScript错误选择保留或者清除这个错误信息下面的手稿程序是清除错误信息:

<SCRIPT LANGUAGE="JavaScript">

FlashSound.muteErrorMsg = true;

FlashSound.muteErrorMsg = a;

</SCRIPT>

如果要保留错误信息,那么手稿程序如下: <SCRIPT LANGUAGE="JavaScript">

FlashSound.muteErrorMsg = false;

FlashSound.muteErrorMsg = a;

</SCRIPT>

你可以点击如图10的两个连接来看这两个文件的演示:

(图10)

具体实现保留错误信息的代码如下:

<HTML>

<HEAD>

<SCRIPT SRC="flashsound.js"></SCRIPT>

</HEAD>

<BODY>

<SCRIPT LANGUAGE="JavaScript">

FlashSound.muteErrorMsg = false;

FlashSound.muteErrorMsg = a;

</SCRIPT>

</BODY>

</HTML>

具体实现清除错误信息的代码如下:

<HTML>

<HEAD>

<SCRIPT SRC="flashsound.js"></SCRIPT>

</HEAD>

<BODY>

<SCRIPT LANGUAGE="JavaScript">

FlashSound.muteErrorMsg = true;

FlashSound.muteErrorMsg = a;

</SCRIPT>

</BODY>

</HTML>

编辑:xker.com

上一篇:JavaScript 设计网页中的下拉菜单
下一篇:使用JavaScript中的OLE Automation
关闭窗口】【浏览次数:】【发送给好友】【收藏此页
相关文章
推荐文章 最新文章 热门文章
·电子图书制作全面攻略 
·横评:网管眼中的5款远程控制软件
·利用3Ds MAX制作简单光芒特效文字片头
·如何挽救崩溃的Windows XP操作系统
·Linux NFS服务器性能优化
·个人网站发展的关键
·《Effective C# 精髓》摘选 
·SQL Server溢出新方法!肉鸡不用愁!
·随心所欲地引用您的QQ秀形象
·教你轻松搞定QQ木马
·怎样使用AJAX进行应用程序开发
·免费工具 全能助手Windows优化王
·不用密码查看武林榜统计用户信息
·网管员的六大必备下载工具
·密码攻防实战大演习之Windows密码篇
·JavaScript 实例--创建弹出式窗口
·JavaScript 实例--创建折叠式导航菜单
·JavaScript 实例--探测浏览器插件
·JavaScript 实例--在表单中设置和检查
·利用Javascript进行密码保护
·利用JavaScript基于浏览器类型的重定
·JavaScript检验表单有效性
·JavaScript创建\"后退\"按钮
·JavaScript隐藏Script代码
·Javascript鼠标移过时报警
·JavaScript鼠标触发窗口
·JS代替CGI
·JavaScript 日期函数
·JavaScript 使用字符串函数
·JavaScript 数组
·个人简历表格
·QQ密码丢失后能做的事情:快速找回密码
·免费代理IP(每日更新)
·WinRAR 3.51 注册码
·系统优化 专题
·Norton AntiVirus 2006 注册码(激活
·找回QQ密码的注意事项 
·史上最强QQ个人档案资料欣赏
·最经典的黑客入门教材
·求职简历封皮
·怎样查找对方的IP地址
·应届毕业生求职信
·2005最新最全注册码集中营(11月更新)
·FlashFXP 3.3.1 build 1089注册码
·实战系统虚拟利器——MS VPC 2004
评论 本站声明
会员名称:
密码:匿名 ·注册·忘记密码?
评论内容:
(最多300个字符)
  查看评论
【注】 发表评论必需遵守以下条例:
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
  • 本站大部分为网络转载,如有版权问题,请通知我们,我们立即更正!

设为首页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2003-2006 xker.com All rights reserved. 网站合作、广告联系QQ:12231446
小新技术网 冀ICP备05002857号