1,804 articles and 15,137 comments as of Sunday, May 15th, 2011

EndUserSharePoint has combined resources with NothingButSharePoint.com. You can now find End User (Mark Miller), Developer (Jeremy Thake) and IT Pro SharePoint content all in one place!

This site is a historical archive and is no longer being updated. Please update your favorites, bookmarks and RSS feeds.

NothingButSharePoint.com
Wednesday, December 17, 2008

JQuery for Everyone: Dressing-up Links Pt2

Do you like the ease of the OOB List View Web Parts but hate the way it displays file size? Yeah, me too. I’d like to see the file size in either KB or MB right next to the file and only for client application files (like .pdf, doc., and .xls).

Let’s turn this:

into this…

I admit I got the idea from seeing Simon Willison’s json-head application, hosted on Google’s appspot. Only, Simon’s program can’t authenticate to my WSS site so I rebuilt it using jQuery and AJAX.

We need a function to dynamically tell us the size in KB or MB and a function to get the data. But we’re not using web services. Instead, we’ll use an undocumented AJAX call with jQuery, a HEAD request.

The HEAD request returns, among other things, the Content-Length (which is the file’s size in bytes) but doesn’t return the entire file. This way, we get the information we want without clogging up our tubes!

<script type="text/javascript" src="/PaulGrenier/js/jquery.js"></script>
<script type="text/javascript">
function hdrDetails(i, elm, cl) {
        cl = cl/1024;  //divide content-length by 1024 (KB)
    var sz = cl>1024?"MB":"KB";  //if cl is still big, set to MB
        cl = cl>1024?cl/1024:cl;  //if cl is still big, divide again
    var len = $(elm).eq(i).text().length;  //check the link's text length
    if(len > 0) {
        //add a file size
        $(elm).eq(i).after("<span> ("+cl.toFixed(2)+" "+sz+")</span>");
    }
}
$(function() {
    var elm="a[href$='.pdf'],"+ //only the file types we want
            "a[href$='.doc'],"+
            "a[href$='.ppt'],"+
            "a[href$='.xls'],"+
            "a[href$='.docx'],"+ //don't forget 2007 versions
            "a[href$='.pptx'],"+
            "a[href$='.xlsx']";
    $(elm).each(function(i, e) {
        if (e.hostname && e.hostname == location.hostname) {
            $.ajax({
                type: "HEAD",
                url: $(this).attr("href"),
                complete: function(xhr, textStatus) {
                    var cl=xhr.getResponseHeader("content-length");
                    if(textStatus=="success") {
                        var cl=xhr.getResponseHeader("content-length");
                        hdrDetails(i, elm, cl); //call the calculation fn
                    }else{
                        $(elm).eq(i).after("<span> (file not found)</span>");
                    }
                }
            });
        }
    });
});

</script>

You may have noticed that we’re only calculating file size for internal files. That’s because AJAX, using XMLHttpRequest, can only make requests to the originating server.

So tomorrow, I’ll show you how to add Simon’s application to do the same file size calculations for external files.



Paul Grenier

View all entries in this series: PaulGrenier-JQuery for Everyone»
Entries in this series:
  1. JQuery for Everyone: Accordion Left Nav
  2. JQuery for Everyone: Print (Any) Web Part
  3. JQuery for Everyone: HTML Calculated Column
  4. JQuery for Everyone: Dressing-up Links Pt1
  5. JQuery for Everyone: Dressing-up Links Pt2
  6. JQuery for Everyone: Dressing-up Links Pt3
  7. JQuery for Everyone: Cleaning Windows Pt1
  8. JQuery for Everyone: Cleaning Windows Pt2
  9. JQuery for Everyone: Fixing the Gantt View
  10. JQuery for Everyone: Dynamically Sizing Excel Web Parts
  11. JQuery for Everyone: Manually Resizing Web Parts
  12. JQuery for Everyone: Total Calculated Columns
  13. JQuery for Everyone: Total of Time Differences
  14. JQuery for Everyone: Fixing Configured Web Part Height
  15. JQuery for Everyone: Expand/Collapse All Groups
  16. JQuery for Everyone: Preview Pane for Multiple Lists
  17. JQuery for Everyone: Preview Pane for Calendar View
  18. JQuery for Everyone: Degrading Dynamic Script Loader
  19. JQuery for Everyone: Force Checkout
  20. JQuery for Everyone: Replacing [Today]
  21. JQuery for Everyone: Whether They Want It Or Not
  22. JQuery for Everyone: Linking the Attachment Icon
  23. JQuery for Everyone: Aspect-Oriented Programming with jQuery
  24. JQuery for Everyone: AOP in Action - loadTip Gone Wild
  25. JQuery for Everyone: Wiki Outbound Links
  26. JQuery for Everyone: Collapse Text in List View
  27. JQuery for Everyone: AOP in Action - Clone List Header
  28. JQuery for Everyone: $.grep and calcHTML Revisited
  29. JQuery for Everyone: Evolution of the Preview
  30. JQuery for Everyone: Create a Client-Side Object Model
  31. JQuery for Everyone: Print (Any) Web Part(s) Plugin
  32. JQuery for Everyone: Minimal AOP and Elegant Modularity
  33. JQuery for Everyone: Cookies and Plugins
  34. JQuery for Everyone: Live Events vs. AOP
  35. JQuery for Everyone: Live Preview Pane
  36. JQuery for Everyone: Pre-populate Form Fields
  37. JQuery for Everyone: Get XML List Data with OWSSVR.DLL (RPC)
  38. Use Firebug in IE
  39. JQuery for Everyone: Extending OWS API for Calculated Columns
  40. JQuery for Everyone: Accordion Left-nav with Cookies Speed Test
  41. JQuery for Everyone: Email a List of People with OWS
  42. JQuery for Everyone: Faster than Document.Ready
  43. jQuery for Everyone: Collapse or Prepopulate Form Fields
  44. jQuery for Everyone: Hourly Summary Web Part
  45. jQuery for Everyone: "Read More..." On a Blog Site
  46. jQuery for Everyone: Slick Speed Test
  47. jQuery for Everyone: The SharePoint Game Changer
  48. JQuery For Everyone: Live LoadTip
 

Please Join the Discussion

7 Responses to “JQuery for Everyone: Dressing-up Links Pt2”
  1. larry says:

    Very neat concept. I have been putting some thought into a similar functionality except I want to be able to apply this to the site level. I want to have the ability to look at a parent site and see the size of each library, list and sub-site below it. Can this concept be applied and return that result? Can this be applied to a folder to return the size of its contents?

    thanks Larry

  2. AutoSponge says:

    @Larry,

    A HEAD request can not target the folder/container. For that information I think we have to ask the database (not supported) or build an application using the SP API (too developery). However, I think there are some codeplex projects that do this sort of thing.

  3. Very original idea, and easy to use.

    copy pasted in a content editor and it worked like a charm!

    keep them coming!

  4. Patrick says:

    Hi There
    when i try this with a Doc Lib that is grouped by some field it doesn’t work.
    Any ideas

Trackbacks

Check out what others are saying about this post...
  1. SharePoint Kaffeetasse #98…

    Tools und Addons Custom Content Editor Web Part for SharePoint jQuery http://jquery.com/ jQuery is a…

  2. [...] extend our second function from part 2 to include scenarios for external [...]




Notify me of comments to this article:


Speak and you will be heard.

We check comments hourly.
If you want a pic to show with your comment, go get a gravatar!