Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Dynamically load js or css file into DOM - question

Posted on 2008-10-20
6
Medium Priority
?
534 Views
Last Modified: 2009-04-08
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
Comment
Question by:krisred
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
6 Comments
 
LVL 15

Expert Comment

by:MMDeveloper
ID: 22760625
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
 
LVL 8

Assisted Solution

by:MatthiasVance
MatthiasVance earned 200 total points
ID: 22760648
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
 
LVL 82

Accepted Solution

by:
hielo earned 1600 total points
ID: 22760800
>>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
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:krisred
ID: 22760807

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
 
LVL 36

Assisted Solution

by:Zyloch
Zyloch earned 200 total points
ID: 22761173
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
 
LVL 82

Expert Comment

by:hielo
ID: 22761256
>>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

Build and deliver software with DevOps

A digital transformation requires faster time to market, shorter software development lifecycles, and the ability to adapt rapidly to changing customer demands. DevOps provides the solution.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Styling your websites can become very complex. Here I'll show how SASS can help you better organize, maintain and reuse your CSS code.
Browsers only know CSS so your awesome SASS code needs to be translated into normal CSS. Here I'll try to explain what you should aim for in order to take full advantage of SASS.
In this tutorial viewers will learn how to style different bullet points for unordered lists in CSS. Begin with a normal unordered list; the default bullet point is a solid circle: In the CSS, create a defined class of unordered list by typing "ul.S…
The viewer will learn the benefit of using external CSS files and the relationship between class and ID selectors. Create your external css file by saving it as style.css then set up your style tags: (CODE) Reference the nav tag and set your prop…

671 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question