如何在 jquery 中创建查询字符串?

2024-01-09

我被困在这个问题上。我想在动态过滤器上创建查询字符串。现在我已经添加了过滤器类型Select your favorite sports and Select your favorite food:..所以将来将会有更多的过滤器,并且只会出现在复选框类型和选择框中。所以我想让它完全动态。这是我的 html 代码:-

<body>
    <select class="getfilterchange" name="hobby">
        <option value="">Select</option>
        <option value="Chess">Chess</option>
         <option value="Hockey">Hockey</option>
    </select>
    <h3>Select your favorite sports:</h3>
    <label><input class="getfilter" type="checkbox" value="football" name="sport"> Football</label>
    <label><input class="getfilter" type="checkbox" value="baseball" name="sport"> Baseball</label>
    <label><input class="getfilter" type="checkbox" value="cricket" name="sport"> Cricket</label>
    <label><input class="getfilter" type="checkbox" value="boxing" name="sport"> Boxing</label>
    <label><input class="getfilter" type="checkbox" value="racing" name="sport"> Racing</label>
    <label><input class="getfilter" type="checkbox" value="swimming" name="sport"> Swimming</label>
    <br>
    <h3>Select your favorite food:</h3>
    <label><input class="getfilter" type="checkbox" value="choclate" name="food"> Choclate</label>
    <label><input class="getfilter" type="checkbox" value="biscuits" name="food"> Biscuits</label>
    <label><input class="getfilter" type="checkbox" value="candy" name="food"> Candy</label>
    <label><input class="getfilter" type="checkbox" value="Cake" name="food"> Cake</label>
    <br>
</body>

这里我尝试了一些 jquery 代码:-

<script type="text/javascript">
$(document).ready(function() {
    var names = [];
    $(".getfilter").click(function(){
        if(jQuery.inArray($(this).attr('name'), names )=='-1'){
            names.push($(this).attr('name')); 
        }
        var favorite = [];
        $.each($("input[name='"+$(this).attr('name')+"']:checked"), function(){
            favorite.push($(this).val());
        });
        console.log(names);
        console.log(favorite);
    });
});

我的预期输出如下

?sport=football~baseball~cricket&food=choclate~biscuits

如果用户首先选择了食物,那么它应该是这样的:-

?food=choclate~biscuits&sport=football~baseball~cricket

请帮助我如何实现此类功能 注意:- 我的过滤器将是动态的,这意味着如果我添加更多过滤器,它将自动嵌入到查询字符串中。 在图像中,它显示 Getvalues 按钮。我想在单击复选框时获取查询字符串。忘记没有按钮。谢谢


提交表格

使用过滤器参数构建和发送请求的最简单方法是将包含过滤器控件的表单提交到由表单的action属性值。如果您需要在每次更改过滤器时应用过滤器,那么只需调用.submit() https://api.jquery.com/submit/形式中的方法change事件处理程序。

序列化表单

如果您需要手动构建请求 URL,那么您可以使用.serialize() https://api.jquery.com/serialize/方法。只需将控件放置到表单中,就可以通过表单序列化来获取查询字符串。

var staticUrl = '/the/path/of/request';
$("#filter").change(function() {
  var queryString = $(this).serialize();
  var url = !queryString ? staticUrl : staticUrl + '?' + queryString;
  console.log(url);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<form id="filter">
  <h3>Select your favorite sports:</h3>
  <label><input class="getfilter" type="checkbox" value="football" name="sport"> Football</label>
  <label><input class="getfilter" type="checkbox" value="baseball" name="sport"> Baseball</label>
  <label><input class="getfilter" type="checkbox" value="cricket" name="sport"> Cricket</label>
  <label><input class="getfilter" type="checkbox" value="boxing" name="sport"> Boxing</label>
  <label><input class="getfilter" type="checkbox" value="racing" name="sport"> Racing</label>
  <label><input class="getfilter" type="checkbox" value="swimming" name="sport"> Swimming</label>
  <br>
  <h3>Select your favorite food:</h3>
  <label><input class="getfilter" type="checkbox" value="choclate" name="food"> Choclate</label>
  <label><input class="getfilter" type="checkbox" value="biscuits" name="food"> Biscuits</label>
  <label><input class="getfilter" type="checkbox" value="candy" name="food"> Candy</label>
  <label><input class="getfilter" type="checkbox" value="Cake" name="food"> Cake</label>
</form>

结果查询字符串是标准的。 PHP 服务器应该能正确解析它。但如果您需要任何特殊格式,您可以使用正则表达式转换字符串。例如,使用以下方法将同一字段的多个值分隔开~特点:

var staticUrl = '/the/path/of/request';
var delimiter = '~';
$("#filter").change(function() {
  var queryString = $(this).serialize().replace(/(?<=([^\?\&\=]+=)([^\&\=]+))(\&\1)/g, delimiter);
  var url = !queryString ? staticUrl : staticUrl + '?' + queryString;
  console.log(url);
});

您可以使用以下命令查看转换结果regex101 片段 https://regex101.com/r/nA9b0N/2.

请注意,正则表达式中使用了零宽度正向后断言。需要浏览器支持ES2018。

构建查询字符串形式数组

如果不可能使用零宽度正向后断言,那么您可以使用经典方法:使用以下命令将一组表单元素转换为名称和值的数组serializeArray https://api.jquery.com/serializeArray/方法,然后从数组构建查询字符串。

The serializeArray为每个控件创建一个项目。可以使用字段名称对表单值进行分组reduce https://www.w3schools.com/jsref/jsref_reduce.asp method.

var staticUrl = '/the/path/of/request';
var delimiter = '~';
$("#filter").change(function() {
  var query = $(this)
    // Create array
    .serializeArray()
    // Group array by key name
    .reduce(function(grouped, field) {
      grouped[field.name] = grouped[field.name] || [];
      grouped[field.name].push(field.value);
      return grouped;
    }, {});
  // Build query string
  var queryString = $
    .map(query, function(values, name) {
      return name + '=' + values.join(delimiter);
    })
    .join('&');
  // Build URL
  var url = queryString ? staticUrl + '?' + queryString : staticUrl;
  console.log(url);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="filter">
  <h3>Select your favorite sports:</h3>
  <label><input class="getfilter" type="checkbox" value="football" name="sport"> Football</label>
  <label><input class="getfilter" type="checkbox" value="baseball" name="sport"> Baseball</label>
  <label><input class="getfilter" type="checkbox" value="cricket" name="sport"> Cricket</label>
  <label><input class="getfilter" type="checkbox" value="boxing" name="sport"> Boxing</label>
  <label><input class="getfilter" type="checkbox" value="racing" name="sport"> Racing</label>
  <label><input class="getfilter" type="checkbox" value="swimming" name="sport"> Swimming</label>
  <br>
  <h3>Select your favorite food:</h3>
  <label><input class="getfilter" type="checkbox" value="choclate" name="food"> Choclate</label>
  <label><input class="getfilter" type="checkbox" value="biscuits" name="food"> Biscuits</label>
  <label><input class="getfilter" type="checkbox" value="candy" name="food"> Candy</label>
  <label><input class="getfilter" type="checkbox" value="Cake" name="food"> Cake</label>
</form>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 jquery 中创建查询字符串? 的相关文章

随机推荐

  • Highstock/Highcharts 上每条线都有不同的后缀

    有没有一种简单的方法可以在每行上使用不同的后缀值 现在我有 3 行 我正在尝试更改每行的后缀 但我只能使用格式化程序功能找到它 但是 如果我使用格式化程序功能 我需要编辑每个工具提示 使其与默认工具提示一样 而且我不知道默认格式 我的意思是
  • 进程启动和模拟

    我在 ASP NET 2 0 中的模拟上下文中启动进程时遇到问题 我正在我的网络服务代码中启动新流程 IIS 5 1 NET 2 0 WebMethod public string HelloWorld string path C KB G
  • 如何显示前 2 段?那么剩下的段落呢? - PHP

    我在一个字符串中有 4 段文本 每个段落都被包围 p p 我的第一个目标是输出前两段 我的第二个目标是将剩余段落输出到页面上的其他位置 有时我可能会处理包含超过 4 个段落的字符串 我已经在网上搜索了现有的任何内容 有很多关于仅显示第一段的
  • 更改现有张量流变量的设备放置

    如何更改 tf Variable 的设备放置 我尝试了两种方法 a tf Variable 1 name a a s device is not set with tf device gpu 0 a tf get variable a 1
  • com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障

    我正在努力让我的数据库与我的 Java 程序对话 有人可以给我一个使用 JDBC 的快速但肮脏的示例程序吗 我遇到了一个相当惊人的错误 Exception in thread main com mysql jdbc exceptions j
  • 如何从 ionic 2 中的导航获取当前页面

    我是 Ionic2 的新手 我正在尝试根据当前的菜单选择构建动态选项卡 我只是想知道如何使用导航控制器获取当前页面 export class TabsPage constructor navParams NavParams navCtrl
  • 有没有办法在 minizinc 中自定义 int_search ?

    我正在处理图形着色问题 想知道是否可以指定搜索策略 我找到了搜索注释 比如int search q first fail indomain min 但例如 我希望算法选择具有最高节点度数的下一个节点 假设这会导致更快的失败 因为具有高度数的
  • Prolog (SWI-Prolog) 中谓词“simple/1”的含义是什么

    我在看书时遇到了问题 我看到一个程序使用谓词 简单 我猜simple 1 我不知道这个谓词的含义是什么 我找不到它 help simple 在控制台中 但是当我在控制台中尝试一些查询时 它的工作原理如下 5 simple p x false
  • 如何向函数传递数组文字?

    如何传递数组而不使其成为单独的变量 例如我知道这有效 class Test public static void main String args String arbitraryStrings foo takesStringArray a
  • Angularjs 可以在多个 ng-app 中重用一个服务吗

    我正在尝试创建一个将使用多个角度ng应用程序的网络应用程序 并且至少两个可以使用相同的服务代码 它们不需要共享数据 但它们执行类似的功能 那么我如何避免代码重复 那是 myApp1 factories factory myservice f
  • 表中的 html 表有效吗?

    在html中 表内有表是否有效 table tr td table tr td td tr table td tr tr tr table 是的 完全有效 通过将您所拥有的内容粘贴到 W3C 验证器中 唯一的错误是关于文档类型 头标签等 没
  • 用纯Java学习JavaCV [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在努力学习JavaCV 众所周知 缺乏这方面的教材是一个很大的问题 在JavCV主页上 他们为 O
  • React Native开发服务器返回响应错误代码500

    错误 捆绑失败 错误 无法解析模块 react transform hmr lib index js from P React Native TryReactNative App js 模块 react transform hmr lib
  • ExponentialBackoffRetry 如何与 Azure 函数的 ServiceBus 触发器配合使用?

    我想在我的Azure函数中实现一个非常简单的行为 如果在处理过程中出现异常 我想推迟下一次重试一段时间 据我所知 在服务总线中没有直接的可能性 例如 除非创建一条新消息 但服务总线触发器有可能ExponentialBackoffRetry
  • “mean_squared_error”的负值

    我正在使用 scikit 并使用mean squared error作为 cross val score 中模型评估的评分函数 rms score cross validation cross val score model X y cv
  • 将多个列表 传递到 ArrayAdapter

    我从 活动 中开始 adapter new ItemAdapter Items this items totals setListAdapter adapter 现在这是 ItemAdapter public class ItemAdapt
  • 如何打开.sqlite-wal

    我想从 Mac 应用程序导出我的 Shazamed 标签 该应用程序不提供任何导出选项 Mac 版 Shazam 将它们存储在 sqlite 3 数据库中 该应用程序正在生成 3 个文件 ShazamDataModel sqlite Sha
  • 如何使用 MinGW 在 Windows 中构建 Google 的 protobuf?

    我使用 Code Blocks 作为 MingW 的 IDE 我正在尝试使用谷歌协议缓冲区 但我在构建 protobuf 时遇到了麻烦 protobuf 的自述文件说 如果您使用 Cygwin 或 MinGW 按照上面的 Unix 安装说明
  • 从 Netbeans 项目中删除文件,但不从硬盘中删除文件

    我的项目文件夹中有很多文件 但我不想将它们全部放在我的 Netbeans 项目中 Netbeans 还会使用更多内存和时间自动扫描它们 有没有办法从 Netbeans 项目中排除文件 文件夹 使用 Netbeans 7 3 的解决方案 在
  • 如何在 jquery 中创建查询字符串?

    我被困在这个问题上 我想在动态过滤器上创建查询字符串 现在我已经添加了过滤器类型Select your favorite sports and Select your favorite food 所以将来将会有更多的过滤器 并且只会出现在复