Thứ Năm, 12 tháng 12, 2013

What is a fail safe scenario?

A fail-safe or fail-secure is one that, in the event of failure, responds in a way that will cause no harm, or at least a minimum of harm, to software apps, nor disrupt end users.

For example:attachEvent is deprecated, you can first check the addEventListener function availability on the browser and then use attachEvent as a fail safe scenario. (http://msdn.microsoft.com/en-us/library/ie/ms536343(v=vs.85).aspx)

if(window.addEventListener){    window.addEventListener("click", functionA, false)}else if (window.attachEvent) { {    window.attachEvent("onclick", functionA)}

Thứ Bảy, 24 tháng 8, 2013

How to check JQuery existence and load JQuery from script

Usually, we load JQuery by including JQuery resource in <script src="..."></script>. What's happening if there is always a JQuery to be loaded in parent page or another control. To resolve this, we do 2 steps:
1) Check if JQuery has existed or not.
2) If not exist, load JQuery directly in script code as opposed to including resource. Here is the code:
document.writeln("<script type='text/javascript' src='scripts/jquery-1.4.1.js'><" + "/script>");

Remember that, document.writeln("...") doesn't run sequentially. That means all the codesnipet written after this code can be executed immediately without waiting for document.writeln() to end. If you write your own control and use more than 2 controls in the same Web page, you might run across a conflict when JQuery is loaded more than 2 times. To resolve this, we need the 3rd step:

3) Use the flag variable to make sure JQuery is loaded only once.
var setLoadOnce = false;

To sum up, it should look like:
<head runat="server">
    <script type="text/javascript">
        var setLoadOnce = false;
        function initJQuery() {
            if (typeof(jQuery) == 'undefined') {
               if (! setLoadOnce) {
                  //alert('init jquery');
                  //only output the script once..
                  setLoadOnce = true;
                  //Load JQuery from JS code
                  document.writeln("<script type='text/javascript' src='scripts/jquery-1.4.1.js'><" + "/script>");
               }
            }
        }
        initJQuery();
    </script>
</head>

Please note if you load JQuery in JS code as above, the handler of JQuery events ('ready' event for example) must be placed after <body> to avoid running in wrong sequences (jquery events run first, jquery load runs later). Even if JQuery load is set to be written first, JQuery events load does after, it doesn't work.

In the following example, try to put all the scripts in <head> tag. Run it to see if both message "init jquery" and 'jquery ready" is displayed alltogether?
<head runat="server">
    <script type="text/javascript">
        var setLoadOnce = false;
        function initJQuery() {
            if (typeof(jQuery) == 'undefined') {
               if (! setLoadOnce) {
                  alert('init jquery');
                  //only output the script once..
                  setLoadOnce = true;
                  //Load JQuery from JS code
                  document.writeln("<script type='text/javascript' src='scripts/jquery-1.4.1.js'><" + "/script>");
               }
            }
        }
 
   </script>
   <script type="text/javascript">
        $(document).ready(function () {
           alert('jquery ready');
        });
   </script>
</head>

Now, put the "ready" event after <body>, we can see that both messages are displayed alltogether. It indicates that JQuery is loaded and executed as normally:
<head runat="server">
    <script type="text/javascript">
        var setLoadOnce = false;
        function initJQuery() {
            if (typeof(jQuery) == 'undefined') {
               if (! setLoadOnce) {
                  alert('init jquery');
                  //only output the script once..
                  setLoadOnce = true;
                  //Load JQuery from JS code
                  document.writeln("<script type='text/javascript' src='scripts/jquery-1.4.1.js'><" + "/script>");
               }
            }
        }
    </script>
 
</head>
<body>
   <script type="text/javascript">
        $(document).ready(function () {
           alert('jquery ready');
        });
   </script>
</body>

Side-effect of loading JQuery dynamically:
Loading JQuery on demand is great, but should not abuse it. The truth is, with JQuery loaded dynamically, you cannot create HTML elements on the fly using JQuery! There are always certain problems with dynamic script loading, no matter what. So please be careful! You should only use this technical if really needed.

Happy coding,


Thứ Tư, 5 tháng 6, 2013

What is the exact definition of "Software Specification"?


A software requirements specification (SRS) is a comprehensive description of the intended purpose and environment for software under development. The SRS fully describes what the software will do and how it will be expected to perform.

- A specification describes WHAT a program does, a design describes HOW the program does it, and documentation describes WHY it does it
- A specification is a document which forms a contract between the customer and the designer.
- A specification is a document by which we can judge the correctness of an implementation.


An SRS minimizes the time and effort required by developers to achieve desired goals and also minimizes the development cost. A good SRS defines how an application will interact with system hardware, other programs and human users in a wide variety of real-world situations. Parameters such as operating speed, response time, availability, portability, maintainability, footprint, security and speed of recovery from adverse events are evaluated. Methods of defining an SRS are described by the IEEE (Institute of Electrical and Electronics Engineers) specification 830-1998.


A specification is a precise, unambiguous and complete statement of the requirements of a system (or program or process), written in such a way that it can be used to predict how the system will behave.

Thứ Hai, 18 tháng 3, 2013

What is the difference between GetPostBackEventReference and GetPostBackClientHyperlink?

GetPostBackEventReference is used to raise postback from a control which has OnClick event associated with it. Meanwhile, GetPostBackClientHyperlink is used to raise post back from a  control without OnClick event associated with it, such as HyperLink...

The following code example demonstrates the difference between GetPostBackEventReference and  GetPostBackClientHyperlink method.

<%@ Page Language="C#"  %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

  public class MyControl : Label, IPostBackEventHandler
  {

    // Use the constructor to defined default label text.
    public MyControl()
    {
      base.Text = "No postback raised.";
    }

    // Implement the RaisePostBackEvent method from the
    // IPostBackEventHandler interface. 
    public void RaisePostBackEvent(string eventArgument)
    {
      base.Text = "Postback handled by " + this.ID.ToString() + ". <br/>" +
                  "Postback caused by " + eventArgument.ToString() + ".";

    }
  }

  protected void Page_Load(object sender, EventArgs e)
  {
    // Get a ClientScriptManager reference from the Page class.
    ClientScriptManager cs = Page.ClientScript;

    // Create an instance of the custom label control and 
    // add it to the page.
    MyControl mycontrol = new MyControl();
    mycontrol.ID = "mycontrol1";
    PlaceHolder1.Controls.Add(mycontrol);
    PlaceHolder1.Controls.Add(new LiteralControl("<br/>"));

    // Create a button element with its onClick attribute defined
    // to create a postback event reference to the custom label control.
    HtmlInputButton b = new HtmlInputButton();
    b.ID = "mybutton1";
    b.Value = "Click";
    b.Attributes.Add("onclick", cs.GetPostBackEventReference(mycontrol, b.ID.ToString()));
    PlaceHolder1.Controls.Add(b);
    PlaceHolder1.Controls.Add(new LiteralControl("<br/>"));

    // Create a link element with its href attribute defined
    // to create a postback event reference to the custom label control.
    HtmlAnchor a = new HtmlAnchor();
    a.ID = "myanchor1";
    a.InnerText = "link";
    a.HRef = cs.GetPostBackClientHyperlink(mycontrol, a.ID.ToString());
    PlaceHolder1.Controls.Add(a);
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>ClientScriptManager Example</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:PlaceHolder id="PlaceHolder1" 
                       runat="server">
      </asp:PlaceHolder>
    </div>
    </form>
</body>
</html>

Thứ Hai, 11 tháng 3, 2013

Resolve problem of SimpleModal not being displayed when adding ScriptManager on the page

I came across the plug-in called "SimpleModal" that was developed by plasm in Mootools. You can read more and run the demo on http://simplemodal.plasm.it



This modal works great. However, SimpleModal doesn't work if there is ScriptManager on the page. I'm disappointed a bit because most of ASP.NET pages need ScriptManager to handle the Postback. After searching around for solutions but getting no luck. There seems to be no answers on Internet. I decided to investigate what the cause might be. Accidentally, I found a workaround. It's quite simple. I tried to do something with ScriptManager by going through all of its attributes. And here is the idea:

Workaround: Assign a value to ScriptPath. It could be any value, as long as it's not empty. See the highlighted section below:
<asp:ScriptManager ID="ScriptManager1" runat="server" ScriptPath="MyCustomScriptPath">
</asp:ScriptManager>

Now please compare the source view before and after adding ScriptPath. Use the online tool (http://www.diffnow.com/) to see the difference.

In below screen (click to room in), the left half represents the source that causes SimpleModal problem and the right half represents the changes (ScriptPath):


Now. It works pretty good. At least, I can use SimpleModal for many ASP.NET pages in my projects. For complicated pages, I'm not sure if there are any other conflicts :-) Then, I'll go about resolving it once I encounter these.

You can download the modified demo code at: SimpleModal

That's it. I'm so relieved!
Please share with me on my blogs if you have any finding with this plug-in.