【问题标题】:shorten querystring for searching and many filters缩短用于搜索的查询字符串和许多过滤器
【发布时间】:2012-12-14 10:56:02
【问题描述】:

我正在构建一个使用许多过滤器的搜索功能。我决定使用 get 方法而不是 post(不同的原因)。问题是,当使用许多过滤器时,查询字符串会变得很长,尤其是当我使用同名过滤器时,我会得到

myurl.com?filter1[]=val1&filter1[]=val2&filter2=val

为了获得更好的控制并防止出现 0 值,我尝试了 serializeArray:

var array = {}; 
jQuery.each(jQuery('form').serializeArray(), function(index,val) {
if (val.value != 0 )
    array[value.name] = val.value;
});

但是这样它会用 filter1 的最后一个值覆盖第一个 filter1,所以多个值不起作用。然后我有“问题”来创建查询字符串。我不是 javascript 教授。所以我需要一点帮助。

我能做什么,所以我得到一个查询字符串,如下所示:

myurl.com?filter1=val1|val2&filter2=val and so on

HTML 是“普通”输入字段

<input type="checkbox" name="filter1[]" />
<input type="text" name="filter2" />

提前谢谢你

鲁文

【问题讨论】:

  • 您必须先向我们展示您开始使用的原始数据是什么样的,然后我们才能建议如何将其转换为更短的 URL。我在这里假设 RAW 数据是你的 HTML 的状态,所以我认为我们需要看看你的 HTML 是什么样的。
  • 嗨 jfriend00 我编辑了它。数据来自html中的输入字段
  • 我认为你这里一切正常,你应该在 PHP 中得到一个不错的数组,比如 $_POST['filter1'] 将是 array('val1', 'val2'),为什么那么糟糕?
  • @RuvenJR.Maerson - 我不清楚您如何从提供的 HTML 中获取相同过滤器名称的多个值,这是您要求我们提供帮助的问题的一部分和。我们不知道您的页面是什么样的,而您要求我们解决需要该信息的问题。我们现在能做的就是猜测。具体和准确的答案需要查看您所询问问题的实际 HTML。
  • jQuery.each(jQuery('form').serializeArray(), function(index,val) {...});??? .serializeArray() 返回一个字符串,而字符串上的$.each 是无稽之谈。您唯一现实的希望是 POST 而不是 GET。

标签: javascript jquery url serialization query-string


【解决方案1】:

这个怎么样(working demo):

<form action="search.html">
    <input type="text" value="val1" name="filter1" />
    <input type="text" value="val2" name="filter1" />
    <input type="text" value="val" name="filter2" />
    <input type="submit" value="search" name="cmdSearch" />
</form>
​
<script>
    // don't do anything until document is ready
    $(function() {

        // register to form submit event
        $('form').submit(function(e){

            // stop the form from doing its default action (submit-GET)
            e.preventDefault();

            // initialise url
            var url = '';

            // keep track of previously enumerated field
            var prev = '';      

            // iterate all fields in the form except the submit button(s)
            $('input:not([type="submit"])', $(this)).each(function(){

                // get the name of this field, with null coalesce
                var name = $(this).attr('name') || '';

                // get the value of this field
                var val = $(this).attr('value');

                // does this field have the same name as the previous?
                if (name.toLowerCase() == prev.toLowerCase()) {

                    // same name therefore we have already appended the name
                    // append value separator
                    url += '|';
                }
                else {

                    // different name, track new name
                    prev = name;

                    // append parameter separator, parameter name, equals char
                    url += '&' + name + '=';
                }

                // append value of this field         
                url += val;
            });

            // removing leading ampersand
            if (url.length && [0] == '&') {
                url = url.substring(1);            
            }       

            // insert leading question mark
            url = '?' + url;

            // insert url from "action" attribute of the form
            url = $(this).attr('action') + url;

            // display url (delete this line)
            alert(url);

            // redirect to the new url (simulates the GET)
            window.location.href = url;
        });
    });
</script>

【讨论】:

  • 你是最棒的。我真的不明白你的代码,但这就是我要找的。也许你可以解释一下?会很好,所以我明白了一点。
  • 啊,现在我明白了。认为我在 javascript 中学到了很多东西。非常感谢您的服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多