about C#, C++, Java, sql, java script etc.

Thursday, October 15, 2009

Switching styles dynamically

Recently on the project I am working on we had a problem regarding changing stylesheets. There was a big tree and we needed to have as fast as possible way of changing styles of all nodes in the tree. One solution is to construct a jquery selector, iterate through all the nodes and change styles respectively. It is a nice approach at the first hand but it turns out to be an inefficient one. For this reason we decided to change global styles, thereby not spending running time on js loops.

I measured performance for different approaches. Below are results.
First I generated a page with 10 thousand div tags on it:
<html>
<head>
  <script type="text/javascript" src="scripts/jquery.js"></script>
  <script type="text/javascript" src="http://flesler-plugins.googlecode.com/files/jquery.rule-1.0.1.js"></script>
  <script type="text/javascript" src="http://remysharp.com/time.js"></script>

  <script type="text/javascript">
    function changeStyles1() {
      time.start("changeStyles1");
      $("div.dv").css("background-color", "Silver");
      $("a.lnk").css("color", "Black");
      time.stop("changeStyles1");
      time.report();
    }
    function changeStyles2() {
      time.start("changeStyles2");
      var html = "<style type='text/css'>.dv{background-color: Silver;} .lnk{color: Black;}</style>";
      $("div#styles").html(html);
      time.stop("changeStyles2");
      time.report();
    }
    function changeStyles3() {
      time.start("changeStyles3");
      var html = "<style type='text/css'>.dv{background-color: Silver;} .lnk{color: Black;}</style>";
      $("div#styles").html(html);
      time.stop("changeStyles3");
      time.report();
    }
  </script>

</head>
<body>
  <div id="styles">
    <style type="text/css">
      .dv
      {
        background-color: Yellow;
      }
      .lnk
      {
        color: Red;
      }
    </style>
  </div>

  Change styles using:
  <button onclick="changeStyles1();">
    jquery selectors</button>
  <button onclick="changeStyles2();">
    global styles</button>
  <button onclick="changeStyles3();">
    jQuery.rule</button>

  <div id="container">
    <div class='dv'>div # 0 <br/><a href='about:blank' class='lnk'>Link # 0</a></div>
    <div class='dv'>div # 1 <br/><a href='about:blank' class='lnk'>Link # 1</a></div>
    <div class='dv'>div # 2 <br/><a href='about:blank' class='lnk'>Link # 2</a></div>
    <div class='dv'>div # 3 <br/><a href='about:blank' class='lnk'>Link # 3</a></div>
    <div class='dv'>div # 4 <br/><a href='about:blank' class='lnk'>Link # 4</a></div>
    <div class='dv'>div # 5 <br/><a href='about:blank' class='lnk'>Link # 5</a></div>
...

  </div>
</body>
</html>

Example:
Change styles using:
div # 0
Link # 0
div # 1
Link # 1
div # 2
Link # 2
div # 3
Link # 3
div # 4
Link # 4
div # 5
Link # 5

Then I tested running time in IE7 and Mozilla 3.5:
jQuery selectorsglobal stylesjQuery.rule
IE72834 ms15 ms17 ms
Mozilla 1108 ms 10 ms6 ms

Personally I prefer "global styles" approach cause in case when one has to change many styles at once it works faster than other methods and forces browser to update its stylesheet collection only once.
Used libraries:

Monday, October 12, 2009

First post

For a long time I wanted to open my own blog but because of lack of time couldn't do that until now. Congratulations, first step is done!
Hopefully I'll keep this blog updated in the future. lets see...