在javascript中检查隐藏字段的内容

时间:2009-06-08 11:31:33

标签: javascript asp.net-ajax

我有一个隐藏字段,我添加字符串,用分号分隔。如何在添加新字符串时检查重复项?

我正在做

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 个答案:

答案 0 :(得分:1)

如果你总是将半冒号放在值中,这会更简单。即。

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

现在你总是可以在末尾搜索带分号的字符串。

  • 不要忘记确保字符串不包含分号。
  • 如果最后一个分号会导致您出现问题,请在提交表单之前将其删除,方法是在提交按钮上放置一个处理程序。

答案 1 :(得分:0)

您可以使用JavaScript的indexOf()方法。如果返回值大于'-1',则它在字符串中。

一些评论者对indexOf()返回误报提出了一个很好的观点。我更新了我的答案以纠正错误,并且还包括拼写修复。我正在使用contains() method from this question。当然,这仅适用于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;
}

如果我是你,我会修改变量名中的拼写错误。如果你对所有变量名使用正确的拼写,你会感谢你自己(除非你真的想使用“已归档”而不是“字段”)

答案 2 :(得分:0)

老实说,我不会将数据保留在字段中,我会在数组中执行。

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(';');
}

经验法则:如果必须对字符串进行反序列化以保持完整性,则不应将字符串用作数据存储。

注意:如果您的原始源由于某种原因在隐藏字段中,我仍然会这样做,但我会用string.split

启动我的数组