Всем привет,
У меня есть кусок javaScript, который удаляет запятые из предоставленной строки (в моем случае значения валюты)
Это:
function replaceCommaInCurrency(myField, val)
{
var re = /,/g;
document.net1003Form.myField.value=val.replace(re, '');
}
«MyField» - это моя попытка динамически выполнить эту работу для любого поля, которое я передаю, но это не работает, я получаю сообщения об ошибке «MyField» недействителен. Я вроде как получил, но думал, что это действительно так.
Я вызываю, используя: onBlur = "replaceCommaInCurrency (this.name, this.value); return false;"
this.name и this.value передают правильные значения ... имя поля и его значение.
Как мне сделать это динамически?
-Джейсон



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы закодируете его прямо в разметке, например, onblur = "replaceCommaInCurrency (this)", элемент управления, инициирующий событие, передается в качестве параметра. Тогда вы сможете сделать что-то вроде:
myField.value = myField.value.replace(re, '');
с jQuery:
var jqField = $(myField);
jqField.val(jqField.val().replace(re, ''));
Вы можете использовать eval, чтобы ваш фрагмент кода работал:
eval("document.net1003Form." + myField + ".value=val.replace(re, '');");
Как упоминалось ниже, квадратные скобки работают (и не отстой, как eval), глупо, что я забыл о них:
document.net1003Form[myField].value=val.replace(re, '');
Или попробуйте что-нибудь вроде этого:
function replaceCommaInCurrency(field){
var re = /,/g;
field.value = field.value.replace(re, '');
}
Что называется так:
onBlur = "replaceCommaInCurrency(this); return false";
Вам следует подумать об использовании инструментария javascript для таких вещей. Вы можете установить для каждого ввода такой класс, как «валюта», а затем использовать этот фрагмент Javascript на основе jQuery для обработки всего:
$(function(){
$("input.currency").bind('blur', function(){
this.value = $(this).val().replace(',', '');
})
});
Этот код запускается при готовности документа, присоединяет обработчик событий к каждому входу с валютой в качестве его класса, а затем выполняет замены. Обратите внимание, что вам также не нужно регулярное выражение для замены.
Вы можете этого избежать. Используйте квадратные скобки.
function removeCommaInCurrency(myField)
{
var re = /,/g;
myField.value=myField.value.replace(re, '');
}
- а затем назовите это так:
<input type = "text" name = "..." onchange = "removeCommaInCurrency(this);">
В общем, вы должны использовать фреймворк, который будет обрабатывать такие низкоуровневые функции, но конкретный ответ на ваш вопрос - использовать скобки для имени поля:
function replaceCommaInCurrency( myField, val)
{
var re = /,/g;
document.net1003Form[myField].value=val.replace(re, '');
}
Решение flatline и roenving с «this» является более чистым подходом, оно также позволяет избежать проблем, связанных с «document.formname.fieldname».
(Используйте 'document.forms.formname' для доступа к форме без возможного столкновения с формами, имеющими то же имя, что и члены объекта документа, и 'forms.elements.fieldname', чтобы сделать то же самое с полями. Как и все объекты JavaScript, object Также можно использовать [namevariable]. Или, лучше, добавьте идентификаторы и используйте однозначный метод document.getElementById.)
Перемещая привязку в скрипт, вы также можете удалить встроенный JavaScript атрибута onclick, сделав разметку еще более чистой:
<input type = "text" class = "number" name = "something" />
...
<script type = "text/javascript"> // external script is best, linked after all forms
function numberfield_bind() {
var inputs= document.getElementsByTagName('input');
for (var inputi= inputs.length; inputi-->0;)
if (inputs[inputi].className=='number')
inputs[inputi].onchange= numberfield_change;
}
function numberfield_change() {
this.value= this.value.split(',').join('');
}
numberfield_bind();
</script>
Если вы когда-нибудь сможете избежать использования eval-функции, вам следует, поскольку она является самой потребляющей функцией во всем мире ECMAscript ...