我正在寻找一种非常通用的方法来使用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;
}
});
});
}
我觉得它仍然可以更快/更清洁。
答案 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.keys和each方法迭代每个查询字符串参数,并将匹配的表单输入(使用输入名称属性)设置为查询参数对象中的匹配值。 / 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对象中获取表单数据。