HTML 表单根据选择选项更改 url 参数

Posted

技术标签:

【中文标题】HTML 表单根据选择选项更改 url 参数【英文标题】:HTML form change url parameters based on select option 【发布时间】:2020-11-15 01:46:23 【问题描述】:

我有一个重定向到另一个网站的 html 表单。问题是我想根据选择选项更改 URL 参数。

This form when "keyword" is selected, the URL is https://library.econ.upd.edu.ph/ir/discover?scope=123456789%2F6&scope=&query=web 应该是这样。我想做的是,选择“标题”和“作者”选项时,应省略“&scope =”。

这可以用 Vanilla javascript 实现吗? Jquery 也可以。如果这是实现我想要实现的目标,我还没有阅读 javascript 中的 URL 参数。

<div class="search-form">
  <div style="background-color: rgba(255,255,255,0.85);">
    <div class="form-group"><b>Search:</b>
      <form id="ebscohostCustomSearchBox" class="form-inline" style="overflow: auto;" action="https://library.econ.upd.edu.ph/ir/discover" method="get" target="_blank">
        <input id="scope" name="scope" type="hidden" value="123456789/6" />
        <select id="delimiter" class="delimiterselect" style="width: 120px; border: 1px solid #540000;" name="scope" size="1" onchange="#">
          <option id="keyword" selected="selected" value="">Keyword</option>
          <option id="title" value="title&filter_relational_operator_1=contains&filter_1">Title</option>
          <option id="author" value="author&amp;filter_relational_operator_1=contains&amp;filter_1">Author</option>
        </select>

    </div>
    <div class="form-group">
      <input id="ebscohostsearchtext" class="form-control" style="border: 1px solid #540000;" name="query" size="50" type="text" placeholder="Search for books, articles, databases and more" /></div>
    <div class="form-group"><input class="search" style="border: 1px solid #540000;" type="submit" value="SEARCH" /></div>
    </form>
  </div>
</div>

【问题讨论】:

答案是可以的。你能用你的尝试更新我给你做的sn-p吗?看看URLSearchParams 嗨!更新了我猜的截图。完成编辑然后保存。 编辑,滚动Dow,点击sn-p上方的编辑,将JavaScript粘贴到左下窗格 通过 ajax 提交表单并将所需的参数传递给它。 1.您有两个名为 scope 的元素。 2. 选项上不能有 ID 【参考方案1】:

看看这个。

查看您的版本后更新

注意选项上的值而不是无效 HTML 的 ID

$(document).ready(function() 
  $("#ebscohostCustomSearchBox").on("submit", function(e) 
    e.preventDefault()
    const q = $("#ebscohostsearchtext").val().trim();
    if (q === "") return;

    const searchType = $("#selectid").val()
    const isKeyword = searchType === "keyword";
    let url = this.action;
    url += "?scope=" + (isKeyword ? "123456789/6" : "123456789/6");
    url += isKeyword ? "&query=" : `&filtertype_1=$searchType&filter_relational_operator_1=contains&filter_1=` 
    url += encodeURIComponent(q);
//    window.location.href = url;
    console.log(url);
  )
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="search-form">
  <div style="background-color: rgba(255,255,255,0.85);">
    <div class="form-group"><b>Search:</b>
      <form id="ebscohostCustomSearchBox" class="form-inline" style="overflow: auto;" action="https://library.econ.upd.edu.ph/ir/discover" method="get" target="_blank">
        <input id="scope" name="scope" type="hidden" value="123456789/6" />
        <select id="selectid" class="delimiterselect" style="width: 120px; border: 1px solid #540000;" name="query" size="1">
          <option value="keyword" selected="selected">Keyword</option>
          <option value="title">Title</option>
          <option value="author">Author</option>
        </select>

    </div>
    <div class="form-group">
      <input id="ebscohostsearchtext" class="form-control" style="border: 1px solid #540000;" name="query" size="50" type="text" placeholder="Search for books, articles, databases and more" /></div>
    <div class="form-group">
      <input class="search" style="border: 1px solid #540000;" type="submit" value="SEARCH" />
    </div>
    </form>
  </div>
</div>

【讨论】:

您好,感谢您的提示,我能够根据我的用例调整您的代码。我将在答案中提出。【参考方案2】:

更新:仍然把这个放在这里,但是 mplungjan 的代码比我的少。

通过mplungjan查看最新答案,我只需要调整这段代码:

url += "&query=" + encodeURIComponent(q);

到此代码:

url += isKeyword ? "&query=" + encodeURIComponent(q) : "=" + encodeURIComponent(q);

所以最终的jquery代码如下:

$(document).ready(function() 
  $("#ebscohostCustomSearchBox").on("submit", function(e) 
    e.preventDefault()
    const q = $("#ebscohostsearchtext").val().trim();
    if (q === "") return;
    const val = $("#selectid").val()
    const isKeyword = val === "keyword";
    let url = this.action;
    url += "?scope=" + (isKeyword ? "123456789/6" : "123456789/6");
    url += isKeyword ? "" : `&filtertype_1=$val&filter_relational_operator_1=contains&filter_1` 
    url += isKeyword ? "&query=" + encodeURIComponent(q) : "=" + encodeURIComponent(q);
    //url += "&query=" + encodeURIComponent(q);
//    window.location.href = url;
    console.log(url);
  )
);

非常感谢mplungjan! :)

【讨论】:

【参考方案3】:

UPDATE2:添加了 javascript 代码,以防 jquery 不存在于与我类似用例的其他人。 按照 mplungjan 的提示,这里是我的用例的代码。下面是jquery:

$(document).ready(function()
const filters = 
  "title": "filtertype_1=title&filter_relational_operator_1=contains&filter_1",
  "author": "filtertype_1=author&filter_relational_operator_1=contains&filter_1",
  "keyword": ""

$("#ebscohostCustomSearchBox").on("submit", function(e) 
    
    if (document.getElementById('selectid').value == "keyword") 
  e.preventDefault()
  const q = $("#ebscohostsearchtext").val().trim();
  if (q === "") return;
  let url = this.action;
  filter = filters[$("#selectid").val()];
  url += "?scope=123456789/6";
  url += filter ? "&" + filter + "&" : "?";
  url = url.replace(/\?$/,"&") + "query=" + encodeURIComponent(q);
 window.location.href = url;
  
  //console.log(url);
     else 
  e.preventDefault()
  const q = $("#ebscohostsearchtext").val().trim();
  if (q === "") return;
  let url = this.action;
  filter = filters[$("#selectid").val()];

  url += "?scope=123456789/6";
  url += filter ? "&" + filter + "&" : "?";
  url = url.replace(/&$/,"") + "=" + encodeURIComponent(q);
  
  window.location.href = url;
  //console.log(url);
  
          
  
)
); 

以下是调整后的html代码:

<div class="search-form">
<div style="background-color: rgba(255,255,255,0.85);">
<div class="form-group"><b>Search:</b>
<form id="ebscohostCustomSearchBox" class="form-inline" style="overflow: auto;" action="https://library.econ.upd.edu.ph/ir/discover" method="get" target="_blank">
<input id="scope" name="scope" type="hidden" value="123456789/6" />
<select id="selectid" class="delimiterselect" style="width: 120px; border: 1px solid #540000;" name="query" size="1" >
<option id="keyword" selected="selected" value="">Keyword</option>
<option id="title" value="title">Title</option>
<option id="author"value="author">Author</option>
</select>

</div>
<div class="form-group">
<input id="ebscohostsearchtext" class="form-control" style="border: 1px solid #540000;" name="query" size="50" type="text" placeholder="Search for books, articles, databases and more" /></div>
<div class="form-group">
<input class="search" style="border: 1px solid #540000;" type="submit" value="SEARCH" />
</div>
</form></div></div>

这适用于我的应用程序,它有 jquery,但我不确定我是否将它移植到另一个我不确定它是否有 jquery 的应用程序。对于选择选项值“关键字”,我不得不使用 else if-else 语句。

JAVASCRIPT 代码:

<script>

const filters = 
  "title": "filtertype_1=title&filter_relational_operator_1=contains&filter_1",
  "author": "filtertype_1=author&filter_relational_operator_1=contains&filter_1",
  "keyword": ""


//jquery: function for submitbutton: 
function submitbutton()

//jquery: e.preventDefault()
event.preventDefault();

    const q = $("#dspacecustomsearchtext").val().trim();
    if (q === "") return;
    
    const searchType = $("#selectid").val()
    const isKeyword = searchType === "keyword";

    //in jquery: let url = this.action; 
    let url = document.getElementById('dspacecustomsearchbox').action

    url += "?scope=" + (isKeyword ? "123456789/6" : "123456789/6");
    url += isKeyword ? "&query=" : `&filtertype_1=$searchType&filter_relational_operator_1=contains&filter_1=` 
    url += encodeURIComponent(q);

    console.log(url);



</script>

【讨论】:

您的代码不是 DRY。请参阅我在看到您的版本后发布的第二个版本。可以大量简化 您好,谢谢。我已经尝试了代码,但似乎我们需要调整,因为如果选择了标题和作者,则应省略“&query”,如从“library.econ.upd.edu.ph/ir/discover?scope=123456789/…”到“library.econ.upd.edu.ph/ir/discover?scope=123456789/…”。对于关键字,它完美地工作。谢谢! 用户如何搜索标题或作者? 嗨!搜索参数应该是这样的: "scope=123456789/6&filtertype_1=title&filter_relational_operator_1=contains&filter_1=web" 注意 &query 被省略了。我正在考虑在语句 "url += isKeyword ? "" : &amp;filtertype_1=$val&amp;filter_relational_operator_1=contains&amp;filter_1" 中添加替换,但我遇到了一些错误。不能忽略“&query”,因为它是我的文本输入中的一个参数,ID 为“ebscohostsearchtext”。 嗨!当我尝试您更新的代码时,似乎当我替换要搜索的单词时,输入的第一个单词被输入到查询中,因为我们仍然必须将 encodeURIComponent(q) 放在 else 子句中?像这样 "url += isKeyword ? "&query=" + encodeURIComponent(q) : "" + encodeURIComponent(q);"

以上是关于HTML 表单根据选择选项更改 url 参数的主要内容,如果未能解决你的问题,请参考以下文章

WooCommerce 复合产品:如何使用 URL 参数更改组件的默认产品选项?

HTML 表单选择元素不允许更改

将选择选项值作为 url 参数传递到下一页

更改单选按钮选择的 URL

根据选项选择更改引导滑块中的值

基于 URL 参数选择的下拉列表 - PHP 还是 jQuery?