I am doing a web application, which is planned to allow a client website to embed javascript from my web application in the following way on its pages:
<script src="http://example.org/showPopup.js"></script>
Suppose my web application is at http://example.org.
I cannot assume that the pages at the client websites have JQuery and Fancybox. So I need to load JQuery and Fancybox in showPopup.js. This is what I have for showPopup.js
var serverName="localhost";
(function() {
var myScript = document.createElement('script');
myScript.type = 'text/javascript';
myScript.async = false;
myScript.src = 'http://' + serverName + '/lib/jquery/jquery-1.11.1.min.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body'[0])).appendChild(myScript);
myScript = document.createElement('script');
myScript.type = 'text/javascript';
myScript.async = false;
myScript.src = 'http://' + serverName + '/lib/jquery.fancybox/source/jquery.fancybox.pack.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body'[0])).appendChild(myScript);
var link = $('<a>');
link.css('display', 'none');
link.attr('href', 'http://example.org/mypage.html');
link.addClass('fancybox fancybox.iframe');
link.fancybox();
link.trigger('click');
})();
Note that the above code works if I use it on a page of my own application. However, I got this error when testing the above code in a page of a client website.
var link = $('<a>');
ReferenceError: $ is not defined
How can I fix it? What is the right way to do this?
Thanks and regards.
----------UPDATE-----------
Qunice provided working code. To make the code fully working, fancybox css must be loaded. Based on Quince's code, I added CSS part. It appears working. Please let me know if there is anything wrong.
(function () {
var requestedJQuery = false;
var requestedFancyBoxJs = false;
var requestedFancyBoxCss = false;
function requestJQuery() {
var myScript = document.createElement('script');
myScript.type = 'text/javascript';
myScript.async = false;
myScript.src = 'http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body' [0])).appendChild(myScript);
requestedJQuery = true;
}
function requestFancyboxJs() {
var myScript = document.createElement('script');
myScript.type = 'text/javascript';
myScript.async = false;
myScript.src = 'http://cdnjs.cloudflare.com/ajax/libs/fancybox/2.1.5/jquery.fancybox.pack.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body' [0])).appendChild(myScript);
requestedFancyBoxJs = true;
}
function requestFancyboxCss() {
link = document.createElement( 'link' );
link.setAttribute( 'href', '//cdnjs.cloudflare.com/ajax/libs/fancybox/2.1.5/jquery.fancybox.css' );
link.setAttribute( 'rel', 'stylesheet' );
link.setAttribute( 'type', 'text/css' );
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body' [0])).appendChild(link);
requestedFancyBoxCss = true;
}
function checkDependancies() {
if (typeof $ === 'undefined' || typeof $.fancybox === 'undefined' || !requestedFancyBoxCss) {
if(!requestedJQuery && typeof $ === 'undefined') {
requestJQuery();
}
if(!requestedFancyBoxJs && (typeof $ === 'undefined' || typeof $.fancybox === 'undefined')) {
requestFancyboxJs();
}
if(!requestedFancyBoxCss) {
requestFancyboxCss();
}
setTimeout(function () {
checkDependancies();
}, 1);
} else {
displayFancyBox();
}
}
function displayFancyBox() {
var link = $('<a>');
link.css('display', 'none');
link.attr('href', 'http://jsfiddle.net/');
link.addClass('fancybox fancybox.iframe');
link.fancybox();
link.trigger('click');
}
checkDependancies();
})()
Hope this helps someone else.