Суть в следующем: есть веб-форма на ASP.Net WebForms, где есть TextBox, в который клиенту необходимо отсканировать штрихкод (GS1 Databar).
В штрихкоде согласно спецификации присутствует символ FNC1 (0x1D) ASCII Group Separator (непечатный).
Проблема в том, что сканнер при сканировании имитирует нажатия клавиш. То есть, данный символ кодируется как зажатый CTRL+0xDD. В текстбокс, соответственно, данный символ не попадает и никак не отображается. Ну и на сервер в итоге передаются только печатные символы.
Проблема на клиентской части, с JS знаком весьма посредственно, наваял такой вот скрипт:
<script type="text/javascript">
var ctrlReceived = false;
function handleStroke(event) {
var ctl = document.getElementById('hfTargetControl').value;
if (ctrlReceived && event.keyCode == 221)
document.getElementById(ctl).value += '|';
ctrlReceived = (event.keyCode == 17);
return null;
};
</script>
hfTargetConrtrol - hidden input, в который с сервера записывается id требуемого текстбокса.
Соответственно, комбинацию GS я подменяю на |, а на сервере заменяю обратно.
Сам текстбокс формируется так:
<input name="ctl00$ContentPlaceHolder1$ctl02$txtScanBoxBarcode"
type="text"
id="txtScanBoxBarcode"
class="TextField"
onkeydown="handleStroke(event);"
style="width:60%;" />
Проблема: протестировал на всех браузерах, везде код работает, кроме Safari. Почему - для меня загадка, да и протестировать сложно, т. к. работаю под виндой. Кто-нибудь может предположить, в чём проблема?
И второй вопрос: а в принципе, как-нибудь попроще передать FNC1 в текстбокс можно?