Today I stumbled upon an interesting mistake that took a long time to get to the bottom.
Customization
The form on the page. When new FormData() , data is captured, and a new FormData() object is created with it.
This object is sent with an xhr and xhr request to a .php script, which then returns an ok / error message.
The code looks something like this: (simplified version, without the need for fluff)
<form name="frm" id="frm" action="" method="post" onsubmit="save(event, this);" enctype="multipart/form-data"> <input name="name" id="name" type="text" value="..." /> <input name="email" id="email" type="text" value="..." /> <input name="phone" id="phone" type="text" value="..." /> <input name="website" id="website" type="text" value="..." /> <textarea name="details" id="details"></textarea> <input name="send" type="submit" value="Send" /> </form> <script type="text/javascript"> function save(e, frm) { if (document.getElementById('nume').value == '' || document.getElementById('email').value == '' || document.getElementById('telefon').value == '' || document.getElementById('site').value == '') { alert('Forms empty'); } else { var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); xhr.onreadystatechange = function () { if (xhr.readyState == 4) { var r = JSON.parse(xhr.responseText); if (r.code == 0) { document.getElementById('message_ok').style.display = 'block'; } else { document.getElementById('message_err').style.display = 'block'; } } }; xhr.open('POST', 'http://url', true); var data = new FormData(frm); xhr.send(data); } e.preventDefault(); } </script>
Sending this message to .php will cause the array to look like this:
Array ( [name] => some name [email] => some email [phone] => 11111111 [website] => some site [details] => some details [send] => Send )
and .php will respond either {"message":"ok","code":0} , or {"message":"error","code":1}
Now this is the expected behavior. This is what I get from Chrome, IE or Safari.
Problem
In Firefox, however, I get the same array, except for a pair of submit input ( name="send" ) 2>:
Array ( [name] => some name [email] => some email [phone] => 11111111 [website] => some site [details] => some details )
I tried on both Linux and Windows to cover my base, but it still gave the same unsatisfactory result.
Decision
After searching the Internet and the appearance of an empty path, as I decided (more fixes, not solutions), I had to rewrite the send key / value:
var data = new FormData(frm); data.append('send', 'Send'); xhr.send(data);
This works because if it is already defined (Chrome, etc.), it is overwritten, if it does not exist, it is created.
Questions
- Similar . Have you ever come across something similar?
- To fix . I believe my decision is hacked, do you have any ideas for a better fix?