我试图在单个父页面上使用两个easyXDM套接字,但没有成功。两个套接字都连接到同一个远程域,但端点不同。父页面有两个div false_app_div
和dummy_app_div
在父页面上,我有两个JS函数activate_false_app()
和activate_dummy_app()
。
window.loadScript = function(src, onload, onerror) {
var head = document.getElementByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = src;
if (script.readyState) {
script.onreadystate = function() {
var state = this.state;
if (state === 'loaded' || state === 'complete') {
script.onreadystate = null;
onload();
}
};
}
};
window.activate_false_app = function() {
var exdm_url = 'http://localhost:8000/js/easyXDM/easyXDM.min.js';
on_load_fn = function() {
window.init_false_app_communication();
};
on_error_fn = function() {
return false;
};
window.loadScript(exdm_url, on_load_fn, on_error_fn);
};
window.init_false_app_communication = function() {
var false_app_socket = new easyXDM.Socket({
remote : 'http://localhost:8000/false_app',
swf : 'http://localhost:8000/js/easyXDM/easyXDM.swf',
container : 'false_ap_div',
onMessage : function(message, origin) {
alert('false_app onMessage');
alert(message);
}
});
};
window.activate_dummy_app = function() {
var exdm_url = 'http://localhost:8000/js/easyXDM/easyXDM.min.js';
on_load_fn = function() {
window.init_dummy_app_communication();
};
on_error_fn = function() {
return false;
};
window.loadScript(exdm_url, on_load_fn, on_error_fn);
};
window.init_dummy_app_communication = function() {
var dummy_app_socket = new easyXDM.Socket({
remote : 'http://localhost:8000/dummy_app',
swf : 'http://localhost:8000/js/easyXDM/easyXDM.swf',
container : 'dummy_app_div',
onMessage : function(message, origin) {
alert('dummy_app onMessage');
alert(message);
};
});
};
如果在父页面中,我调用activate_dummy_app()
或activate_false_app()
,它就可以工作——也就是说,两者都可以单独工作。但如果我同时调用这两个,那么它们中只有一个有效,并且我在JS控制台上收到一个错误,即某些内容未定义(我找不到)。
此外,我知道这个问题与加载两个easyXDM有关,因为如果我将init_dummy_app_communication
放在activate_false_app()
的on_load_fn
中(除了已经存在的init_false_app_communication
之外),那么两者都可以工作。
但是,我不能确定easyXDM是否已经加载,所以activate_false_app
和activate_dummy_app
都必须加载easyXDM,这样它们既可以单独工作,也可以一起工作。我尝试使用noConflict
函数,但那里的文档很差,最终没有任何具体内容。
有没有人遇到过类似的问题,或者知道我在这里错过了什么?
EasyXDM允许您在每个站点拥有多个实例。您可以使用noConflict
执行此操作。
例如,如果你正在构建一个将在你不控制的网站上运行的JavaScript,你总是可以创建一个EasyXDM实例,并将其设置为你想要的任何值。
我这样做是为了我们的JavaScript小部件(使用情况可以在这里查看)。然后,每个脚本都可以调用ns.NSEasyXDM
并对其进行引用,而无需在全局命名空间中敲打easyXDM(因为它喜欢将自己放在window
上)。
如果需要与多个端点通话,可以根据需要发送不同的consumerRpcConfig
和consumerJsonRpcConfig
。
this.ns = this.ns || {};
(function(ns, window, document) {
var base = this,
consumerRpcConfig = {
remote: document.location.protocol+ "//my.path.org/Scripts/easyXDM/cors/"
},
consumerJsonRpcConfig = {
remote: {
request: {}
}
},
init = function(el, callback) {
var easyXDMElement,
scripts = document.getElementsByTagName('script'),
scriptIdx;
for (scriptIdx = 0; scriptIdx < scripts.length; scriptIdx = scriptIdx + 1) {
if (scripts[scriptIdx].src === document.location.protocol + '//my.path.org/Scripts/EasyXDM/easyXDM.js') {
base.isEasyXDMPresent = true;
}
}
if (!base.isEasyXDMPresent || ns.NSEasyXDM === undefined) {
easyXDMElement = document.createElement('script');
easyXDMElement.type = 'text/javascript';
easyXDMElement.src = document.location.protocol + '//my.path.org/Scripts/EasyXDM/easyXDM.js';
el.parentNode.insertBefore(easyXDMElement, el);
}
easyXDMElement.onload = function () {
ns.NSEasyXDM = { easyXDM: window.easyXDM.noConflict("NSEasyXDM") };
callback();
};
}
return ns;
}(this.ns, window, document));
要定义如上所示的EasyXDM的多个副本,请使用"noConflict",将每个实例分配给一个变量;然后你可以把它传来传去。
在此页面中;https://groups.google.com/forum/#!主题/easyxdm/bOoznzUrkjE
它被提及为;
(function(){
var easyXDM;
// paste easyXDM's minified code here
var rpc = easyXDM.Rpc(.....
...
})();