Strange onkeydown behaviour (works with alert, NOT without)

F

F. Da Costa

Hi,

This is a strange issue I'v been staring at for half a day now.
It concerns catching keys via the onkeydown handler.

In IE5+ it works fine but in Moz 1.6 (& Firebird 0.7+) it behaves most
peculiar. The 'offensive' code is included below.

The weird thing lies in the alert box preceded by // **.
* function textboxReplaceSelect *
If the alert is active it works perfect. No key duplication in the textbox
on the screen.
insert the comment ()i.e. take out the alert) and one gets two characters
instead of one.
It almost looks like something 'shoots through' because (to make things
worse) the last alert shows me a singular entry as well.

To test the code just use the following

TIA
Fermin DCG

<html>
<head>
<script>
var isIE = navigator.userAgent.indexOf('MSIE') > 1;
var isMoz = navigator.userAgent.indexOf('Mozilla/5.') == 0;var _character;
var _keyCode;
var _charCode;

// decipher key down codes
function showDown(oTextbox, evt) {
_keyCode = _charCode = _character = null;
evt = (evt) ? evt : ((event) ? event : null);

if (evt) {
_keyCode = evt.keyCode;
if (evt.charCode) _charCode = evt.charCode;
else _charCode = (isIE) ? _keyCode : ((_charCode) ? _charCode : _keyCode);
_character = String.fromCharCode(_charCode).toLowerCase();
}
textboxReplaceSelect(oTextbox, _character);
return false;
}


/** THE OFFENSIVE CODE
* Replace the currently selected text with some other text
* F.e.: when a <x> is pressed in an empty textbox it should come out with
1 x only on the screen.
* @param oTextbox = the textbox to act on
* @param sText = the text to insert
*/
function textboxReplaceSelect (oTextbox, sText) {
if (isIE) {
var oRange = document["selection"].createRange();
oRange.text = sText;
oRange.collapse(true);
oRange.select();
} else if (isMoz) { // THIS DOES NOT WORK AS EXPECTED
var oldText = oTextbox["value"];
var iSelEnd = oTextbox["selectionEnd"];
var iStart = oTextbox["selectionStart"];
oTextbox.value = "";
// ** UNCOMMENT AND THE CODE WORKS
//alert("1.textboxReplaceSelect::"+oldText+" - "+sText+" - "+
oTextbox.value);
//oTextbox.value = oTextbox.value.substring(0, iStart) + sText +
oTextbox.value.substring(oTextbox.selectionEnd, oTextbox.value.length);
oTextbox.value = oldText.substring(0, iStart) + sText +
oldText.substring(iSelEnd, oldText.length);
//alert("2.textboxReplaceSelect::"+oTextbox.value+" - "+sText);
oTextbox.setSelectionRange(iStart + sText.length, iStart + sText.length);
}

oTextbox.focus();
alert("exit.textboxReplaceSelect::"+oTextbox.value+" - "+sText);
}

</script>
</head>
<body>
<input type="text" value="" id="txtSearch" onkeydown="return showDown(this,
event);" />
</body>
</html>
 
J

Janwillem Borleffs

F. Da Costa said:
var isIE = navigator.userAgent.indexOf('MSIE') > 1;
var isMoz = navigator.userAgent.indexOf('Mozilla/5.') == 0;

Don't use the userAgent string for browser detection, but test for available
objects/functions instead:

var isIE = document.all;
var isMoz = document.getElementById && !document.all;
oTextbox.setSelectionRange(iStart + sText.length, iStart +
sText.length);

This should be:
oTextbox.setSelectionRange(iStart, iStart + sText.length);


JW
 
J

Janwillem Borleffs

HikksNotAtHome said:
IE is not the only browser that can pass that test. Opera can pass it (in IE
spoof mode), as well as one that Jim Ley mentioned a while back (can't remember
the name of it), that supports both document.all and document.layers

You are right, but I believe that document.all represents a function rather
then a property, so:

var isOpera = document.all && 'function' == typeof document.all;

would evaluate for Opera without using the window.opera property.


JW
 
R

Richard Cornford

IE is not the only browser that can pass that test. Opera can
pass it (in IE spoof mode), as well as one that Jim Ley mentioned
a while back (can't remember the name of it), that supports both
document.all and document.layers

Along with Konqueror (so probably Safari), IceBrowser, Web Browser 2.0
and so on, indeed there are probably more browsers these days that
support document.all than don't.

But its still better than attempted browser detection :)

var useGEBI = document.getElementById;
var useAll = document.all;
var useLayers = document.layers;

if (useGEBI){

}
else{
if (useAll){
Ain't object detection grand?

Fair enough, but the OPs decision making is related to, for example,
document.selection so the specific replacement for the next to useless -
isIE - test may be more along the lines of:-

var useDocSelection = ((document.selection)&&
(document.selection.createRange));

with additional test to verify that any created Range object has the
required - collapse - and - select - method prior to attempting to use
them. But the "Mozilla" branch would need to make a more direct test of
the features of the - oTextbox - object to see if it supported the
features required by that branch. Certainly support for -
document.getelementById - in the absence of - document.all - says
nothing about the ability to call - setSelectedRange - on the -
Textbox - object.

Richard.
 
F

F. Da Costa

Janwillem said:
Don't use the userAgent string for browser detection, but test for available
objects/functions instead:

var isIE = document.all;
var isMoz = document.getElementById && !document.all;
Point taken, but it does not influence the issue as described in any way.
sText.length);

This should be:
oTextbox.setSelectionRange(iStart, iStart + sText.length);
Noop, because the first part of th string should *not* be selected.
However, this also does *not* cover the issue at hand.
Thx anyway,
F DCG
 
F

F. Da Costa

F. Da Costa said:
Hi,

This is a strange issue I'v been staring at for half a day now.
It concerns catching keys via the onkeydown handler.

In IE5+ it works fine but in Moz 1.6 (& Firebird 0.7+) it behaves most
peculiar. The 'offensive' code is included below.

The weird thing lies in the alert box preceded by // **.
* function textboxReplaceSelect *
If the alert is active it works perfect. No key duplication in the textbox
on the screen.
insert the comment ()i.e. take out the alert) and one gets two
characters instead of one.
It almost looks like something 'shoots through' because (to make things
worse) the last alert shows me a singular entry as well.

To test the code just use the following

TIA
Fermin DCG
<html>
<head>
<script>
var isIE = navigator.userAgent.indexOf('MSIE') > 1;
var isMoz = navigator.userAgent.indexOf('Mozilla/5.') == 0;var _character;
var _keyCode;
var _charCode;

// decipher key down codes
function showDown(oTextbox, evt) {
_keyCode = _charCode = _character = null;
evt = (evt) ? evt : ((event) ? event : null);

if (evt) {
_keyCode = evt.keyCode;
if (evt.charCode) _charCode = evt.charCode;
else _charCode = (isIE) ? _keyCode : ((_charCode) ? _charCode : _keyCode);
_character = String.fromCharCode(_charCode).toLowerCase();
}
textboxReplaceSelect(oTextbox, _character);
return false;
}


/** THE OFFENSIVE CODE
* Replace the currently selected text with some other text
* F.e.: when a <x> is pressed in an empty textbox it should come out with
1 x only on the screen.
* @param oTextbox = the textbox to act on
* @param sText = the text to insert
*/
function textboxReplaceSelect (oTextbox, sText) {
if (isIE) {
var oRange = document["selection"].createRange();
oRange.text = sText;
oRange.collapse(true);
oRange.select();
} else if (isMoz) {
var oldText = oTextbox["value"];
var iSelEnd = oTextbox["selectionEnd"];
var iStart = oTextbox["selectionStart"];
oTextbox.value = "";
// === THE FOLLOWING DOES NOT WORK AS EXPECTED ===
// ** UNCOMMENT THE ALERT AND THE CODE WORKS WITHOUT IT, IT DOESN'T
//alert("1.textboxReplaceSelect::"+oldText+" - "+sText+" - "+
oTextbox.value);
//oTextbox.value = oTextbox.value.substring(0, iStart) + sText +
oTextbox.value.substring(oTextbox.selectionEnd, oTextbox.value.length);
oTextbox.value = oldText.substring(0, iStart) + sText +
oldText.substring(iSelEnd, oldText.length);
//alert("2.textboxReplaceSelect::"+oTextbox.value+" - "+sText);
oTextbox.setSelectionRange(iStart + sText.length, iStart + sText.length);
}

oTextbox.focus();
alert("exit.textboxReplaceSelect::"+oTextbox.value+" - "+sText);
}

</script>
</head>
<body>
<input type="text" value="" id="txtSearch" onkeydown="return showDown(this,
event);" />
</body>
</html>
 
T

Thomas 'PointedEars' Lahn

Janwillem said:
"HikksNotAtHome" <[email protected]> schreef in bericht
news:[email protected]...

It is called attribution _line_, not attribution novel.
Those who know what a message ID is, do know where to
find it.
You are right, but I believe that document.all represents a function
rather then a property, so:

Functions/methods are properties of type `function' (or `object').
var isOpera = document.all && 'function' == typeof document.all;

I prefer to use the constant value to be compared with right-hand side.
would evaluate for Opera without using the window.opera property.

It would not. Instead, it would falsely allow all UAs who support that
part of the DOM of the IE 4+ browser component to be handled as if Opera
would be used.


PointedEars

P.S.:
Your UA (Outlook Express) is borken which makes your postings hardly
leagible. Please use OE Quotefix, a similar tool or simply a working UA.
 
J

Janwillem Borleffs

Thomas 'PointedEars' Lahn said:
Your UA (Outlook Express) is borken which makes your postings hardly
leagible. Please use OE Quotefix, a similar tool or simply a working UA.

What is broken about my UA??????????
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,578
Members
45,052
Latest member
LucyCarper

Latest Threads

Top