Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 536
  • Last Modified:

Dynamically load js or css file into DOM - question

Hello,

I am using the code below to load js and css dynamically. I just want to know when I am calling it in a page will it load multiple times or will it load only instance if it already exists in DOM.

Please advise

function loadjscssfile(filename, filetype){
 if (filetype=="js"){ //if filename is a external JavaScript file
  var fileref=document.createElement('script')
  fileref.setAttribute("type","text/javascript")
  fileref.setAttribute("src", filename)
 }
 else if (filetype=="css"){ //if filename is an external CSS file
  var fileref=document.createElement("link")
  fileref.setAttribute("rel", "stylesheet")
  fileref.setAttribute("type", "text/css")
  fileref.setAttribute("href", filename)
 }
 if (typeof fileref!="undefined")
  document.getElementsByTagName("head")[0].appendChild(fileref)
}

Open in new window

0
krisred
Asked:
krisred
3 Solutions
 
MMDeveloperCommented:
not sure I understand the question....


when you call that function to include a .js file.. assuming you fulfill the arguments properly, then it will include it in the DOM. It wont check to see if it's already been included or not.
0
 
MatthiasVanceCommented:
Every time you run that function with the same arguments, a new child will be added to the heading.
You could however, write a function that checks for existence of the element you're going to create in the DOM.

Kind regards,

Matthias Vance
0
 
hieloCommented:
>>will it load only instance if it already exists in DOM
It will create a new node every time you call the function. If you want to avoid try:
function loadjscssfile(filename, filetype){
 var fid=filename.replace( /[^a-z]/ig,'');
 if( null !==document.getElementById(fid) )
 {
   //file already "imported"
  return false;
 }
 if (filetype=="js"){ //if filename is a external JavaScript file
  var fileref=document.createElement('script')
  fileref.setAttribute("type","text/javascript")
  fileref.setAttribute("src", filename)
  fileref.setAttribute("id", fid)
 }
 else if (filetype=="css"){ //if filename is an external CSS file
  var fileref=document.createElement("link")
  fileref.setAttribute("rel", "stylesheet")
  fileref.setAttribute("type", "text/css")
  fileref.setAttribute("href", filename)
  fileref.setAttribute("id", fid)
 }
 if (typeof fileref!="undefined")
  document.getElementsByTagName("head")[0].appendChild(fileref);
return fileref;
}

Open in new window

0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
krisredAuthor Commented:

What I am doing is calling javascript and css to load when a link in clicked. it loads the data in a pane using ajax. but I don't want to do is keep reloading the same javascript and css every time the link is clicked.

so do you advise to remove the instance and reload using the following function
function removejscssfile(filename, filetype){
 var targetelement=(filetype=="js")? "script" : (filetype=="css")? "link" : "none" //determine element type to create nodelist from
 var targetattr=(filetype=="js")? "src" : (filetype=="css")? "href" : "none" //determine corresponding attribute to test for
 var allsuspects=document.getElementsByTagName(targetelement)
 for (var i=allsuspects.length; i>=0; i--){ //search backwards within nodelist for matching elements to remove
  if (allsuspects[i] && allsuspects[i].getAttribute(targetattr)!=null && allsuspects[i].getAttribute(targetattr).indexOf(filename)!=-1)
   allsuspects[i].parentNode.removeChild(allsuspects[i]) //remove element by calling parentNode.removeChild()
 }
}

Open in new window

0
 
ZylochCommented:
There is no need to remove and reload. I would recommend using hielo's function, or a variant of it, such as your loop search, to just skip over loading a CSS or Javascript file if it has already been loaded.
0
 
hieloCommented:
>>but I don't want to do is keep reloading the same javascript and css every time the link is clicked.
What I posted avoids exactly that problem.
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now