I built a very simple app using a PHP form with a bit of Javascript.

In my form, I have a text input which I used to run a database search. In case I have multiple values, I have a bit of code that puts a comma in between each.

The weird part is this:

In Firefox, I can go do MS Excel, copy 5 values and paste them in the text input control. I can see all 5 values pasted and commas in between.

In Internet Explorer version 8, I can go do MS Excel, copy 5 values but only ONE value (the first number) gets pasted in the text input control.

This is my html

<fieldset>
<label for="DBRIDs">RIDs</label><input type="text" id="DBRIDs" name="DBRIDs" onchange = "removespaces(this)">
</fieldset>

This is my Javascript in my page header

<script language="javascript" type="text/javascript">
function removespaces(which) {
str = which.value;
str = str.replace (/\s|\n/g,","); // replace space or newline by commas
document.myform.DBRIDs.value = str;
}

Pretty basic stuff.

Tried changing textinput to textarea. No change. Am able to paste without problems from Firefox, Chrome, Safari and even Opera! IE is a no go.

What am I missing? How come IE cannot paste like Firefox?

Dani AI

Generated

The root cause is not your regex — it's the control and browser behavior. Per the HTML spec an input[type="text"] value must not contain CR/LF, and browsers differ in how they handle multi-line clipboard data when you paste into a single-line input. Firefox/Chrome will typically collapse or convert the pasted lines so your replacer sees everything; older Internet Explorer (IE8/IE11 historically) will only insert up to the first newline, so you end up with just the first cell. (w3.org)

A robust, cross‑browser approach: accept multi-line input (use a textarea styled to look like a single line) or intercept the paste and normalize the clipboard text before letting it land. Use the paste event (ClipboardEvent.clipboardData in modern browsers) and, for legacy IE, onbeforepaste/onpaste or window.clipboardData; read the plain-text payload, replace any runs of whitespace/newlines with your chosen delimiter, trim leading/trailing delimiters, then programmatically set the field and cancel the default paste to avoid double-insert. The paste API docs and IE onbeforepaste notes explain the differences and when to prevent default. (devdoc.net)

Implementation tips (no brittle hacks): don’t simply slice off the last character — that breaks if the user edits or if there was no trailing whitespace. Instead, collapse consecutive whitespace into one delimiter and trim delimiters at both ends (or filter out empty tokens after a split). Also read plain text from the clipboard: Excel places several formats (including HTML) on the clipboard, so pulling the text/plain entry avoids embedded table markup. Add a final server-side sanity check for the submitted IDs. (brandonpugh.com)

Good troubleshooting and suggestions from the thread: found the typo and the textarea fix; pushed the whitespace-normalization idea; ’s split/join concept is a simple and efficient strategy. The cleanest UX is a one-line textarea + a single paste handler that normalizes and trims — that avoids IE’s newline cutoff and the duplicate-comma/onchange pitfalls you saw.

Recommended Answers

All 8 Replies

Maybe something like this:

str = str.replace(/\s/g,",").replace(/\r\n/g,",").replace(/\n/g,",");

When you have it working, then think about squeezing the parts into a single regexp.

Airshow

I had a typo so using textarea is working now. I can copy a column and paste it from IE

Of course (sarcasm), it is introducing a new problem:

It duplicates my commas and I am unclear it's because of textarea or my Javascript:

function removespaces (which) {
    var str = which.value;
    str = str.replace(/\s|\n/g, ","); // replace space or newline by commas
    which.value = str;
}
function handlePaste (which) {  
    var str = window.clipboardData.getData("Text");    
    str = str.replace(/\s|\n/g, ","); // replace space or newline by commas
    which.value = str;
    return false; // kill the paste event so you don't get duplicate data.
}
...
<textarea id="DBRIDs" name="DBRIDs" rows="1" cols="20" onchange="removespaces(this)" onpaste="handlePaste(this)"></textarea>

Any idea?

str = (/*b.b. Troy III p.a.e.*/String(str).split(/\s+/).join());

In removeSpaces(), try:

str = str.replace(/\s+|\n/g, ","); // replace space or newline by commas

I don't recognise the onpaste event so can't work out how/when handlePaste() is supposed to work.

Airshow

I figured out what's wrong.

1) my html was incorrect ; onpaste is not a recognized event of textarea so here is the correct version

<textarea id="DBRIDs" name="DBRIDs" rows="3" cols="20" onchange="removespaces(this)"></textarea>

2) but it introduced a new problem by giving me double commas ; I corrected my regex and use the slice method to remove the last comma

function removespaces (which) {
    var str = which.value;
    str = str.replace(/\s+/g, ",");
    var newStr = str.slice(0, -1)
    which.value = newStr;
}

I am in business. Thanks for your help.

In removeSpaces(), try:

str = str.replace(/\s+|\n/g, ","); // replace space or newline by commas

I don't recognise the onpaste event so can't work out how/when handlePaste() is supposed to work.

Airshow

-you've made yourself a redundant code there double effort at least 4x more expensive.
your regexp is sort of an equivalent of say: /John|J|o|h(...etc)/
which is wrong.

Hi Troy.

Your split().join() is much better.

I wouldn't have posted my suggestion if I had seen your post first.

Airshow

I somehow managed to drop the main line from my feedback and the reason I wrote my last post which was to be stating that \n, \t, \r and similar, are all white-spaces equal to \s.
But wouldn't go into explaining that \s+ will also match double or more inline white-spaces including their combinations appearing successively in your string.

I've added String constructor to it to make sure it is not running on a plain stream of char-tokens which is a possible situation to run into when copying and pasting from text areas or other similar text sources where \n and other family members happen to be represented literally with "\n" and other corresponding escaped characters.

For leading and trailing white-spaces advise the trim() method to be used as a Preparator agent.

The split() method fed with the (/\s+/) RegExp will make sure to return a qualitative Array consisting of bounds only. And since Arrays use a comma-separator syntax for their values, returning a duck typed array into a string representation will contain the required commas on its end-result by default.
This way the join() operation added there would become optional, or unnecessarily redundant; when arg is omitted [its default join char is also a comma],- but it is there for precaution measures since there are cases when array feed may not necessarily undergo a type conversion - and there's no harm keeping it there as an extension, even if you are sure that a desired duck-type conversion is immanent, cause it will make it ready for instant modification of a join/separator character so you'll be able to insert a (dot) "." join instead, or whatever else you may need to on the fly. And;

This is what appears to be my 2 last cents on the topic.
Regards.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.