以前都是基于一个搭建好的框架进行开发,今天因为测试功能的需要自己要搭建一个简单的页面进行功能检测,碰到了一些问题,在此把解决后的代码分享给大家。

首先,TerraExplorer v6的ActiveX分为功能显示和API提供两部分,第一版测试页面如下:

<head>
    <object id="sgworld" name="sgworld" classid="CLSID:3a4f91b0-65a8-11d5-85c1-0001023952c1">
    </object><!--  提供API-->
</head>
<script type="text/javascript" language="javascript"> 
   function init() {
            SGWorld.AttachEvent("OnLoadFinished", OnLoadFinished);
            SGWorld.Project.Open("c:\\test.fly");              
    } //init
    function btn() {
     SGWorld.Command.Execute(1037, 0);
    }
    function OnLoadFinished() {  
    }
</script>
<body οnlοad="init();">
    <table border="1" width="400px">
        <tr>
            <td>
                <button class="tool_btn" οnclick="btn()">
                    测试</button>           
            </td>
        </tr>
        <tr>
            <td>
                <object id="3DWindow" classid="CLSID:3a4f9192-65a8-11d5-85c1-0001023952c1">
                </object><!--  功能展示-->
            </td>
        </tr>
    </table>
</body>

通过实践发现虽然ActiveX的事件添加成功并能够使用,但是具体功能如加载数据等基础功能却不能实现,并且浏览页面时弹出对话框询问是否允许添加ActiveX,于是将提供API的对象动态添加到页面中

<head>
    <title></title>
</head>
<script type="text/javascript" language="javascript">                                                                                                                               
    function CreateSGObj() {//动态添加对象
        var obj = $("sgworld");
        if (obj == null) {
            obj = document.createElement('object');
            document.body.appendChild(obj);
            obj.name = "sgworld";
            obj.id = "sgworld";
            obj.classid = "CLSID:3a4f91b0-65a8-11d5-85c1-0001023952c1";
        }
        return obj;
    } 
    var SGWorld;
   function init() {
            SGWorld = CreateSGObj();
            SGWorld.AttachEvent("OnLoadFinished", OnLoadFinished);
            SGWorld.Project.Open("c:\\test.fly");
    } //init
    function btn(test) {
   SGWorld.Command.Execute(1037, 0);
    }
    function OnLoadFinished() {      
    }
</script>
<body οnlοad="init();">
    <table border="1" width="400px">
        <tr>
            <td>
                <button class="tool_btn" οnclick="btn()">
                    测试</button>
            </td>
        </tr>
        <tr>
            <td>
                <object id="3DWindow" classid="CLSID:3a4f9192-65a8-11d5-85c1-0001023952c1">
                </object>
            </td>
        </tr>
    </table>
</body>

功能实现,可以使用API进行二次功能开发,但是目前skyline v6因为改动较大,无法给V5的提供良好兼容性,因此改为使用V5接口进行尝试

<script type="text/javascript" language="javascript">
    function CreateSGObj() {
        var obj = $("TE");
        if (obj == null) {
            obj = document.createElement('object');
            document.body.appendChild(obj);
            obj.name = "TE";
            obj.id = "TE";
            obj.classid = "CLSID:3a4f9191-65a8-11d5-85c1-0001023952c1";  //注意此时引用的clsid与V6不同    
        }
        return obj;
    }
    var imenu;
    function init() {  
            SGWorld = CreateSGObj();
           var ITerraExplorer = SGWorld.interface("ITerraExplorer51");
            imenu = SGWorld.interface("IMenu");
            ITerraExplorer.AttachEvent("OnLoadFinished", OnLoadFinished);
            ITerraExplorer.Load("c:\\test.fly");
    } //init
    function btn() {
        imenu.Invoke(33350);
    }
    function OnLoadFinished() {   
    }
</script>
<body οnlοad="init();">
    <table border="1" width="400px">
        <tr>
            <td>
                <button class="tool_btn" οnclick="btn()">
                    测试</button>
            </td>
        </tr>
        <tr>
            <td>
                <object id="3DWindow" classid="CLSID:3a4f9192-65a8-11d5-85c1-0001023952c1">
                </object>
            </td>
        </tr>
    </table>
</body>
</html>