SkylineGlobe的PopupMessage里面嵌入的网页如何与主页面交互通讯

1.主页面调用PopupMessage,如果需要传值,就是普通的页面间的传值就可以实现了。

a.html页面调用PopupMessage创建方法,url传入b.html?x=111&y=22;  

然后在b.html接收解析就可以了;

// GetParamValue
function GetParamValue(findParam, defaultValue) 
{
    var arr = document.location.href.split("?");
    if (arr.length <= 1) return defaultValue;
    arr = arr[1].split("&");
    for (var i = 0; i < arr.length; i++) {
        if (arr[i].indexOf(findParam) == 0 && arr[i].indexOf("=") == findParam.length) {
            arr = arr[i].split("=");
            return arr[1];
        }
    }
    return defaultValue;
} 

2.PopupMessage里面嵌入的子页面如何调用主页面上的变量和函数方法呢?

或者说如何实现主页面调用PopupMessage中嵌入的子页面中的变量或者函数方法呢?

一些刚接触SkylineGlobe的开发者可能会比较困惑,但早在十几年前,Skyline就已经提供了终极解决办法。

只不过没有把这个接口升级成最新版本的,使用这个接口的时候,需要定义一个老版本的TE对象。

如果你的Skyline起点就是6之后的版本,可能会错过这个IScriptEngine接口。

具体实现示例代码如下:

A页面是主页面,B页面是嵌入PopupMessage中的子页面,

A页面上的代码如下:

     var ttt = "ttt11";
        function OnLoadFinished() {
            //var TE = _$SGCreateTEObj();            
            var TE = TEX1.CreateInstance("TerraExplorerX.TerraExplorer");
            var IScriptEngine = TE.interface("IScriptEngine5");
            try { IScriptEngine.UnregisterName("ContentCreatorWindow"); } catch (e) {  }
            try { IScriptEngine.RegisterGlobalName("ContentCreatorWindow", window); } catch (e) {  }
        }
/*利用IScriptEngine接口的GetGlobalName方法,获取B页面的Window对象*/
        function test4() {
            //var TE = _$SGCreateTEObj();
            var TE = TEX1.CreateInstance("TerraExplorerX.TerraExplorer");
            var IScriptEngine = TE.interface("IScriptEngine5");
            var test = IScriptEngine.GetGlobalName("++ToolsEditorWindow");
            alert(test.aaa);//得到html1页面中的aaa全局变量;
        }

        /*定义Skyline5版本的TE Object*/
        function $(id) {
            return window.document.getElementById(id);
        }
        function _$SGCreateTEObj() {
            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";
            }
            return obj;
        }

B页面上的代码如下:

var aaa = "aaa";
        function Init()
        {
            var TE = _$SGCreateTEObj();
            var IScriptEngine = TE.interface("IScriptEngine5");
            try { IScriptEngine.UnregisterName("ToolsEditorWindow"); } catch (e) {  }
            try { IScriptEngine.RegisterGlobalName("ToolsEditorWindow", window); } catch (e) { alert("error RegisterGlobalName: ToolsEditorWindow") }
        }
/*利用IScriptEngine接口的GetGlobalName方法,获取A页面的Window对象*/
                function TestSE()
                {
                    var TE = _$SGCreateTEObj();
                    var IScriptEngine = TE.interface("IScriptEngine5");
                    var test = IScriptEngine.GetGlobalName("++ContentCreatorWindow");
                    alert(test.ttt);//得到A页面中的ttt全局变量;
                }

看到上面的代码感觉如何?是的,就这么简单!

原文地址:https://www.cnblogs.com/yitianhe/p/5629005.html