Проверьте содержимое скрытого поля в JavaScript - PullRequest
0 голосов
/ 08 июня 2009

У меня есть скрытое поле, и я добавляю к нему строку, разделенную точкой с запятой. Как я могу проверить дублирование при добавлении новой строки?

Я делаю как

function AddToHiddenField(source, hdnFieldId)
    {
        var srcList = document.getElementById(source);
        var hdnFieldSubstring = document.getElementById(hdnFieldId);
        var len = srcList.length;
        hdnFieldSubstring.value = '';
        for(var i = 0; i < len; i++) 
        {
            if (srcList.options[i] != null) 
            {
                if (hdnFieldSubstring.value  == "")
                {
                    hdnFieldSubstring.value  = srcList.options[i].text;
                }
                else 
                {    
                    hdnFieldSubstring.value = hdnFieldSubstring.value + ";" + srcList.options[i].text;
                }                    
            }
        }
    }

Как проверить, что строка уже существует в hdnFieldSubstring перед добавлением в нее (в javascript)?

Ответы [ 3 ]

1 голос
/ 08 июня 2009

Это было бы проще, если в значение всегда ставить точку с запятой. * 1001 Т.е. *

if (srcList.options[i] && hdnFieldSubstring.value.indexOf(srcList.options[i].text + ";") == -1)
    hdnFieldSubstring.value += srcList.options[i].text + ";";

Теперь вы всегда можете искать строку с точкой с запятой в конце.

  • Не забудьте убедиться, что в строках уже нет точек с запятой.
  • Если последняя точка с запятой вызовет у вас проблемы, удалите ее непосредственно перед отправкой формы, установив обработчик на кнопку отправки.
0 голосов
/ 08 июня 2009

Честно говоря, я не сохранил бы данные в поле, я сделал бы это в массиве.

function AddToHiddenField(source, hdnFieldId)
{
    //create storage if it doesn't exist
    if (typeof(window.hiddenFieldData)=='undefined')
    {
      window.hiddenFieldData = [];
    }

    var srcList = document.getElementById(source);
    for(var i=0, n=srcList.length, value; i<n; i++)
    {
      if (srcList.options[i] != null) 
      {
        var value = srcList.options[i].text;
        /* 
        ignores duplicates by virtue of overwriting index - 
        if you didn't want to just overwrite you'd wrap this with:
          if(typeof(window.hiddenFieldData[value])=='undefined')         
        */
        window.hiddenFieldData[value] = value;
      }
    }

    //serialise storage to hidden field
    document.getElementById(hdnFieldId).value = window.hiddenFieldData.join(';');
}

Практическое правило: если вам необходимо десериализовать строку для сохранения целостности, вам не следует использовать строку в качестве хранилища данных.

примечание: если ваш исходный источник по какой-то причине находился в скрытом поле, я все равно сделал бы это так, но я бы начал свой массив со строкой.

0 голосов
/ 08 июня 2009

Вы можете использовать метод JavaScript indexOf(). Если возвращаемое значение больше '-1', то оно находится в строке.

Несколько комментаторов отметили, что indexOf() возвращает ложные срабатывания. Я обновил свой ответ, чтобы исправить это, а также включил исправления орфографии. Я использую метод contains() из этого вопроса . Конечно, это будет работать только в том случае, если ваш srcList не содержит точек с запятой.

function contains(arr, obj) {
  var i = arr.length;
  while (i--) {
    if (arr[i] === obj) {
      return true;
    }
  }
  return false;
}

function AddToHiddenField(source, hdnFieldId)
{
    var srcList = document.getElementById(source);
    var hdnFieldSubstring = document.getElementById(hdnFieldId);
    var len = srcList.length;
    var value = '';
    for(var i = 0; i < len; i++) 
    {
        var currentOption = srcList.options[i].text;
        if (srcList.options[i] != null) 
        {
            if (value  == "")
            {
                value  = currentOption;
            }
            else if(!contains(val.split(';'), currentOption))
            {
                value += ";" + currentOption;
            }                    
        }
    }
    hdnFieldSubstring.value = value;
}

На вашем месте я бы исправил орфографические ошибки в именах ваших переменных. Позже вы поблагодарите себя, если будете использовать правильное написание для всех имен переменных (если вы действительно не хотите использовать «filed» вместо «field»)

...