在javascript中填写表单的通用方法

时间:2008-11-02 19:41:19

标签: javascript html forms prototypejs

我正在寻找一种非常通用的方法来使用javascript“填写”基于参数字符串的表单。

例如,如果我有这种形式:

<form id="someform">
  <select name="option1">
    <option value="1">1</option>
    <option value="2">2</option>
  </select>
  <select name="option2">
    <option value="1">1</option>
    <option value="2">2</option>
  </select>
</form>

我希望能够采用这样的参数字符串:option1=2&option2=1

然后根据查询字符串中的选项选择正确的内容。

我有一种丑陋的解决方案,我会通过表单的子项检查它们是否与各种键匹配,然后设置值,但我真的不喜欢它。

我想要一种更干净,通用的方式,它可以适用于任何形式(假设param字符串具有所有正确的键)。

我正在使用原型javascript库,所以我欢迎使用它的建议。

编辑:这是我到目前为止所提出的(使用Form.getElements(form)的原型)

function setFormOptions(formId, params) {
  params = params.split('&');
  params.each(function(pair) {
    pair = pair.split('=');
    var key = pair[0];
    var val = pair[1];
    Form.getElements(form).each(function(element) {
      if(element.name == key) {
        element.value = val;
      }
    });
  });
}

我觉得它仍然可以更快/更清洁。

5 个答案:

答案 0 :(得分:6)

如果您使用Prototype,这很容易。首先,您可以在String对象上使用toQueryParams方法来获取具有每个参数的名称/值对的Javascript对象。

其次,您可以使用Form.Elements.setValue方法(似乎没有记录)将每个查询字符串值转换为实际的表单输入状态(例如,当查询字符串值为“on”时选中一个复选框)。使用name.value = value技术仅适用于文本和选择(一个,不是很多)输入。使用Prototype方法添加了对复选框和选择(多个)输入的支持。

至于一个简单的函数来填充你所拥有的东西,这很好用,而且并不复杂。

function populateForm(queryString) {
    var params = queryString.toQueryParams();
    Object.keys(params).each(function(key) {
        Form.Element.setValue($("someform")[key], params[key]);
    });
}

这使用Object.keyseach方法迭代每个查询字符串参数,并将匹配的表单输入(使用输入名称属性)设置为查询参数对象中的匹配值。 / p>

修改:请注意,您无需在表单元素上使用id属性即可使此解决方案正常工作。

答案 1 :(得分:3)

试试这个:

Event.observe(window, 'load', function() {
  var loc = window.location.search.substr(1).split('&');

  loc.each(function(param) {
      param = param.split('=');
      key = param[0];
      val = param[1];

      $(key).value = val;
  });
});

上面的代码假定您为每个表单元素分配id值和名称。它采用以下形式的参数:

?key=value&key=value

?option1=1&option2=2

如果您想将其保留在元素的名称上,请尝试代替以上内容:

Event.observe(window, 'load', function() {
  var loc = window.location.search.substr(1).split('&');

  loc.each(function(param) {
    param = param.split('=');
    key = param[0].split('_');

    type = key[0];
    key = key[1];
    val = param[1];

    $$(type + '[name="' + key + '"]').each(function(ele) {
      ele.value = val;
    });
});

此代码采用以下形式的参数:

?type_key=value&type_key=value

?select_option1=1&select_option2=2

答案 2 :(得分:1)

你说你已经完成了元素并设置了值。但是,也许这比你拥有的更干净了?

function setFormSelectValues(form, dataset) {
    var sel = form.getElementsByTagName("select");
    dataset.replace(/([^=&]+)=([^&]*)/g, function(match, name, value){
        for (var i = 0; i < sel.length; ++i) {
            if (sel[i].name == name) {
                sel[i].value = value;
            }
        }
    });                
}

然后,您可以根据需要调整它,而不仅仅是选择元素。

答案 3 :(得分:0)

prototype.js中的三行代码:

$H(query.toQueryParams()).each(function(pair) {
    $("form")[pair.key].setValue(pair.value);
});

答案 4 :(得分:0)

您可以使用 formManager 在JavaScript对象中获取表单数据。