如何build立与Javascript的查询string
只是想知道是否有任何内置到JavaScript,可以采取一个窗体,并返回查询参数,例如:“VAR1 =值&VAR2 =值2&ARR [] = FOO&ARR [] =酒吧…”
多年来我一直在想这个。
前段时间我试图寻找这个问题的答案,但我最终写了我自己的函数,从窗体中提取值。
这不是完美的,但它符合我的需求。
function form_params( form ) { var params = new Array() var length = form.elements.length for( var i = 0; i < length; i++ ) { element = form.elements[i] if(element.tagName == 'TEXTAREA' ) { params[element.name] = element.value } else if( element.tagName == 'INPUT' ) { if( element.type == 'text' || element.type == 'hidden' || element.type == 'password') { params[element.name] = element.value } else if( element.type == 'radio' && element.checked ) { if( !element.value ) params[element.name] = "on" else params[element.name] = element.value } else if( element.type == 'checkbox' && element.checked ) { if( !element.value ) params[element.name] = "on" else params[element.name] = element.value } } } return params; }
form_params返回参数的(键 – >值)映射。 input是表单元素(DOM元素)
它不处理允许多个select的字段。
如果你使用jQuery,你可能想看看jQuery.param()
http://api.jquery.com/jQuery.param/
例:
var params = { parameter1: 'value1', parameter2: 'value2', parameter3: 'value3' }; var query = $.param(params); document.write(query);
没有jQuery
var params = { parameter1: 'value_1', parameter2: 'value 2', parameter3: 'value&3' }; var esc = encodeURIComponent; var query = Object.keys(params) .map(k => esc(k) + '=' + esc(params[k])) .join('&');
这不会直接回答你的问题,但是这是一个通用的函数,它将创build一个包含查询string参数的URL。 参数(名称和值)被安全地转义以包含在URL中。
function buildUrl(url, parameters){ var qs = ""; for(var key in parameters) { var value = parameters[key]; qs += encodeURIComponent(key) + "=" + encodeURIComponent(value) + "&"; } if (qs.length > 0){ qs = qs.substring(0, qs.length-1); //chop off last "&" url = url + "?" + qs; } return url; } // example: var url = "http://example.com/"; var parameters = { name: "George Washington", dob: "17320222" }; console.log(buildUrl(url, parameters)); // => http://www.example.com/?name=George%20Washington&dob=17320222
有了jQuery,你可以通过$.param
$.param({ action: 'ship', order_id: 123, fees: ['f1', 'f2'], 'label': 'a demo' }) // -> "action=ship&order_id=123&fees%5B%5D=f1&fees%5B%5D=f2&label=a+demo"
不,我不认为标准的JavaScript有内置的,但Prototype JS有这个function(当然大多数其他JS框架也有,但我不知道它们),他们称之为序列化 。
我可以推荐Prototype JS,它工作的很好。 唯一的缺点,我真的注意到它的大小(几百kb)和范围(大量的代码为AJAX,DOM等)。 因此,如果你只想要一个表单序列化器,这是过度的,严格来说,如果你只想要它的Ajaxfunction(主要是我用它),这是矫枉过正。 除非你小心,否则可能会发现它有点“魔法”(比如扩展每个与Prototype JS函数接触的dom元素只是为了find元素),使得它在极端情况下变得缓慢。
如果你不想使用库,它应该覆盖大部分/全部相同的表单元素types。
function serialize(form) { if (!form || !form.elements) return; var serial = [], i, j, first; var add = function (name, value) { serial.push(encodeURIComponent(name) + '=' + encodeURIComponent(value)); } var elems = form.elements; for (i = 0; i < elems.length; i += 1, first = false) { if (elems[i].name.length > 0) { /* don't include unnamed elements */ switch (elems[i].type) { case 'select-one': first = true; case 'select-multiple': for (j = 0; j < elems[i].options.length; j += 1) if (elems[i].options[j].selected) { add(elems[i].name, elems[i].options[j].value); if (first) break; /* stop searching for select-one */ } break; case 'checkbox': case 'radio': if (!elems[i].checked) break; /* else continue */ default: add(elems[i].name, elems[i].value); break; } } } return serial.join('&'); }
你实际上并不需要一个表单来做Prototype。 只需使用Object.toQueryString函数 :
Object.toQueryString({ action: 'ship', order_id: 123, fees: ['f1', 'f2'], 'label': 'a demo' }) // -> 'action=ship&order_id=123&fees=f1&fees=f2&label=a%20demo'
我不完全确定我自己,我记得看到jQuery在一定程度上做了,但它根本不处理分层logging,更不用说php友好的方式。
我确实知道的一件事情是构buildURL并将产品粘贴到dom中,不要仅仅使用string粘贴来完成,否则您将打开一个方便的页面断开器。
例如,某些广告软件可以在Flash中运行版本string。 当adobes通用简单的string时,这是很好的,但是,这是非常天真的,并且在安装了Gnash的人们感到尴尬的混乱,因为gnash'es版本string恰好包含完整的GPL版权许可证,完整的URL和<a href>标签。 在您的string胶水广告客户生成器中使用此function会导致页面打开,并在DOM中出现不平衡的HTML。
故事的寓意:
var foo = document.createElement("elementnamehere"); foo.attribute = allUserSpecifiedDataConsideredDangerousHere; somenode.appendChild(foo);
不:
document.write("<elementnamehere attribute=\"" + ilovebrokenwebsites + "\">" + stringdata + "</elementnamehere>");
Google需要学习这个技巧。 我试图报告问题,他们似乎不在乎。
正如Stein所说,你可以使用来自http://www.prototypejs.org的原型javascript库。; 包括JS,这是非常简单的, $('formName').serialize()
将返回你想要的!
对于我们这些喜欢jQuery的人,你可以使用表单插件: http ://plugins.jquery.com/project/form,它包含一个formSerialize方法。
查询string可以帮助。
所以你可以
const querystring = require('querystring') url += '?' + querystring.stringify(parameters)
现在回答你的问题可能已经太迟了。
我有同样的问题,我不喜欢附加string来创build一个URL。 所以,我开始使用$ .param作为techhouse解释。
我还发现了一个URI.js库,可以为您轻松创buildurl。 有几个例子可以帮助你: URI.js文档 。
这是其中之一:
var uri = new URI("?hello=world"); uri.setSearch("hello", "mars"); // returns the URI instance for chaining // uri == "?hello=mars" uri.setSearch({ foo: "bar", goodbye : ["world", "mars"] }); // uri == "?hello=mars&foo=bar&goodbye=world&goodbye=mars" uri.setSearch("goodbye", "sun"); // uri == "?hello=mars&foo=bar&goodbye=sun" // CAUTION: beware of arrays, the following are not quite the same // If you're dealing with PHP, you probably want the latter… uri.setSearch("foo", ["bar", "baz"]); uri.setSearch("foo[]", ["bar", "baz"]);`