2013-08-17 19 views
5

Próbuję użyć dwóch gniazd easyXDM na jednej stronie nadrzędnej bez powodzenia. Oba gniazda łączą się z tą samą zdalną domeną, ale z różnymi punktami końcowymi. Strona rodzic ma dwie DIV false_app_div i dummy_app_div .Powierzchnia Poniżej przedstawiono fragmenty kodu -Wiele easyXDM na jednej stronie

na stronie nadrzędnej Mam dwie funkcje JS activate_false_app() i 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); 
     }; 
    }); 
}; 

Jeśli na stronie macierzystej wzywam albo activate_dummy_app() lub activate_false_app(), to działa - czyli jak działa całkowicie prawidłowo w izolacji. Ale jeśli zadzwonię do obu, wtedy tylko jeden z nich działa i dostaję błąd na konsoli JS, że coś jest niezdefiniowane (czego nie mogłem znaleźć).

Również wiem, że problem ma coś wspólnego z załadunkiem dwa easyXDMs ponieważ jeśli mogę umieścić w on_load_fninit_dummy_app_communication z activate_false_app() (oprócz init_false_app_communication już obecne), to zarówno prace.

Jednak nie mogę być pewien, że easyXDM jest już załadowany, więc zarówno activate_false_app, jak i activate_dummy_app musi załadować easyXDM, aby działały zarówno w izolacji, jak i razem. Próbowałem pracować z funkcją noConflict, ale dokumentacja jest słaba i skończyło się na niej nic konkretnego.

Czy ktoś napotkał podobny problem lub wie, czego tu brakuje?

Odpowiedz

0

EasyXDM pozwala mieć wiele jego instancji na stronę. Możesz to zrobić, używając noConflict.

Na przykład, jeśli tworzysz JavaScript, który trafi do witryny, nad którą nie masz kontroli, zawsze możesz utworzyć instancję EasyXDM i ustawić ją tak, jak chcesz.

Robię to dla naszych widgetów JavaScript (the usage can be viewed here). Każdy skrypt może następnie wywołać ns.NSEasyXDM i mieć odniesienie do niego bez pummeling easyXDM w globalnej przestrzeni nazw (ponieważ lubi umieścić się na window).

Jeśli chcesz rozmawiać z wieloma punktami końcowymi, możesz wysłać w razie potrzeby inne consumerRpcConfig i 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)); 

celu zdefiniowania wielu kopii EasyXDM jak przedstawiono powyżej, należy „noConflict” przypisać każdego wystąpienia zmiennej; a potem możesz to przekazać.

Powiązane problemy