yasser777 / nettiers

Automatically exported from code.google.com/p/nettiers
0 stars 0 forks source link

EntityDropDownList client javascript is not cross-browser friendly #332

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
What steps will reproduce the problem?
1. Run a populated entity drop down list in FireFox
2. Press a key when dropdown has focus and see javascript error "window.event 
is not defined"

What is the expected output? What do you see instead?
No javascript errors.

What version of .netTiers and CodeSmith are you using?
NetTiers 2.3.0
CodeSmith 5.2.2 Rev. 11561

Proposed Fix:

I changed Web/UI/EntityDropDownList.cs file, OnLoad method - specifically I 
added a javascript argument to pass in the event, and checked for the proper 
event and key code in a cross-browser fashion instead of assuming 
window.event.keyCode (Internet Explorer)
<begin pasted FIXED code>
        protected override void OnLoad( EventArgs e )
        {
            base.OnLoad( e );

            if ( !ReadOnly )
            {
                // define the client-side script
                StringBuilder script = new StringBuilder();
                script.Append( "function " + functionName + " (evt, dropdownlist,caseSensitive) {" + System.Environment.NewLine );
                script.Append( "  // check the keypressBuffer attribute is defined on the dropdownlist" + System.Environment.NewLine );
                script.Append( "  var undefined; " + System.Environment.NewLine );
                script.Append( "  if (dropdownlist.keypressBuffer == undefined) { " + System.Environment.NewLine );
                script.Append( "    dropdownlist.keypressBuffer = ''; " + System.Environment.NewLine );
                script.Append( "  } " + System.Environment.NewLine );
                script.Append( "  // get the key that was pressed " + System.Environment.NewLine );
                script.Append( "  evt = (evt) ? evt : (window.event) ? event : null;" + System.Environment.NewLine);
                script.Append( "  var keyCode = (evt.charCode) ? evt.charCode :((evt.keyCode) ? evt.keyCode :((evt.which) ? evt.which : 0)); " + System.Environment.NewLine);
                script.Append( "  var key = String.fromCharCode(keyCode); " + System.Environment.NewLine );
                script.Append( "  dropdownlist.keypressBuffer += key;" + System.Environment.NewLine );
                script.Append( "  if (!caseSensitive) {" + System.Environment.NewLine );
                script.Append( "    // convert buffer to lowercase" + System.Environment.NewLine );
                script.Append( "    dropdownlist.keypressBuffer = dropdownlist.keypressBuffer.toLowerCase();" + System.Environment.NewLine );
                script.Append( "  }" + System.Environment.NewLine );
                script.Append( "  // find if it is the start of any of the options " + System.Environment.NewLine );
                script.Append( "  var optionsLength = dropdownlist.options.length; " + System.Environment.NewLine );
                script.Append( "  for (var n=0; n < optionsLength; n++) { " + System.Environment.NewLine );
                script.Append( "    var optionText = dropdownlist.options[n].text; " + System.Environment.NewLine );
                script.Append( "    if (!caseSensitive) {" + Environment.NewLine );
                script.Append( "      optionText = optionText.toLowerCase();" + Environment.NewLine );
                script.Append( "    }" + System.Environment.NewLine );
                script.Append( "    if (optionText.indexOf(dropdownlist.keypressBuffer,0) == 0) { " + System.Environment.NewLine );
                script.Append( "      dropdownlist.selectedIndex = n; " + System.Environment.NewLine );
                script.Append( "      return false; // cancel the default behavior since " + System.Environment.NewLine );
                script.Append( "                    // we have selected our own value " + System.Environment.NewLine );
                script.Append( "    } " + System.Environment.NewLine );
                script.Append( "  } " + System.Environment.NewLine );
                script.Append( "  // reset initial key to be inline with default behavior " + System.Environment.NewLine );
                script.Append( "  dropdownlist.keypressBuffer = key; " + System.Environment.NewLine );
                script.Append( "  return true; // give default behavior " + System.Environment.NewLine );
                script.Append( "} " + System.Environment.NewLine );

                // register the client-side script block
                this.Page.ClientScript.RegisterClientScriptBlock( this.GetType(), functionName, script.ToString(), true );
                this.Attributes.Add( "onkeydown", "return " + functionName + "(event, this," + CaseSensitiveKeySort.ToString().ToLower() + ")" );
            }
        }
<end pasted code>

Original issue reported on code.google.com by lacu...@gmail.com on 8 Sep 2010 at 7:37

GoogleCodeExporter commented 9 years ago

Original comment by bniemyjski on 10 Sep 2010 at 2:26

GoogleCodeExporter commented 9 years ago
I am also getting same error.
Attached a new change event to EntityDropDownList, and based on the selection 
disable/enable some other controls. 

Throwing error, and bypass all other javascript events to be executed.
Error: window.event is undefined

I also checked, the lestst EntityDropDownList.cs.cst file, it has the same 
problem.
i am using version: v2.3.0.807

Original comment by lalit.9...@gmail.com on 25 Aug 2011 at 7:44

GoogleCodeExporter commented 9 years ago
Hello,

Can you see if the patch above resolves your issue. If it does I'll commit it 
into core.

Thanks
-Blake

Original comment by bniemyjski on 1 Sep 2011 at 7:49

GoogleCodeExporter commented 9 years ago
I tried the above code, this resolve the javascript error.
Please checkin it to trunk.

Original comment by lalit.9...@gmail.com on 2 Sep 2011 at 6:08