如何在我的JavaScript中构建一个有效的URL。
如何在我的JavaScript中构建一个有效的URL。
我有以下的JavaScript代码,根据用户的输入构建URL参数:-
$(document).ready(function(){ $('#button').click(function(e) { var count=1; var s=""; var inputvalue = $("#journal").val(); var inputvalue2 = $("#keywords").val(); var inputvalue3 = $("#datepub").val(); var inputvalue4 = $("#title").val(); var inputvalue5 = $("#localcurrency").val(); var inputvalue6 = $("#locations").val(); var inputvalue7 = $("#dropdown1").val(); var inputvalue8 = $("#dropdown2").val(); if(inputvalue!=null && inputvalue!="") { s = s+ "FilterField"+count+"=Journal&FilterValue"+count+"="+inputvalue+"&"; count++; } if(inputvalue2!=null && inputvalue2!="") { s = s+ "FilterField"+count+"=KeyWords&FilterValue"+count+"="+inputvalue2+"&"; count++; } if(inputvalue3!=null && inputvalue3!="") { s = s+ "FilterField"+count+"=datepub&FilterValue"+count+"="+inputvalue3+"&"; count++; } if(inputvalue4!=null && inputvalue4!="") { s = s+ "FilterField"+count+"=Title&FilterValue"+count+"="+inputvalue4+"&"; count++; } if(inputvalue5!=null && inputvalue5!="") { s = s+ "FilterField"+count+"=localcurrency&FilterValue"+count+"="+inputvalue5+"&"; count++; } if(inputvalue6!=null && inputvalue6!="") { s = s+ "FilterField"+count+"=locations&FilterValue"+count+"="+inputvalue6+"&"; count++; } if(inputvalue7!=null && inputvalue7!="") { s = s+ "FilterField"+count+"=dropdown1&FilterValue"+count+"="+inputvalue7+"&"; count++; } if(inputvalue8!=null && inputvalue8!="") { s = s+ "FilterField"+count+"=dropdown2&FilterValue"+count+"="+inputvalue8+"&"; count++; } window.location.replace("/teamsites/Bib%20Test/Forms/search.aspx?"+s); }); });
现在以上代码将生成如下的URL:
http://***/teamsites/Bib%20Test/Forms/search.aspx?FilterField1=Journal&FilterValue1=123 http://***/teamsites/Bib%20Test/Forms/search.aspx?FilterField1=Journal&FilterValue1=123&FilterField2=localcurrency&FilterValue2=USD&
一切都运作正常,直到我尝试传递包含&
的搜索参数。例如,我想要搜索一个期刊为General&Procedure
的记录,所以使用上述的代码,URL将如下所示:
http://***/teamsites/Bib%20Test/Forms/search.aspx?FilterField1=Journal&FilterValue1=General&Procedure&
我没有得到任何结果,因为应用程序认为Procudure
是一个参数,而不是FilterValue1
的一部分。为了解决这个问题,我决定使用encodeURIComponent()
函数来构建URL参数,代码如下:
var inputvalue = encodeURIComponent($("#journal").val()); var inputvalue2 = encodeURIComponent($("#keywords").val()); var inputvalue3 = encodeURIComponent($("#datepub").val()); var inputvalue4 = encodeURIComponent($("#title").val()); var inputvalue5 = encodeURIComponent($("#localcurrency").val()); var inputvalue6 = encodeURIComponent($("#locations").val()); var inputvalue7 = encodeURIComponent($("#dropdown1").val()); var inputvalue8 = encodeURIComponent($("#dropdown2").val());
现在生成的URL将如下所示:
http://***teamsites/Bib%20Test/Forms/search.aspx?FilterField1=Journal&FilterValue1=General%26Procedure
我得到了预期的结果。但我不确定仅对参数值使用encodeURIComponent()
是否是一个有效的修复方法,因为如果它是查询字符串参数的一部分,我将对&
进行编码,但URL仍然包含未编码的&
用于分隔URL参数。现在,我从最后一个URL获取的结果是正确的,但不确定我是否正确地做了这些操作?是否有内置的函数可以为我完成这个工作?谢谢
如何在JavaScript中构建有效的URL
在这个问题中,提到了使用encodeURIComponent是唯一修复URL中特殊字符的方法。对URL中的值进行编码是为了防止XSS攻击。然后给出了两种改进代码的方式。
第一种方式是使用jQuery的filter和map方法来过滤和映射输入的值,并使用encodeURIComponent对值进行编码,然后将编码后的值拼接到URL中,最后使用window.location.replace方法将URL替换为新的URL。
第二种方式是使用URL对象(不支持IE浏览器),通过new URL方法创建URL对象,然后使用forEach方法遍历输入的值,并使用encodeURIComponent对值进行编码,然后使用URL对象的searchParams.append方法将编码后的值添加到URL中,最后使用window.location.replace方法将URL替换为新的URL。
不管是哪种方式,都需要使用encodeURIComponent对值进行编码,因为根据规范,URLSearchParams对象的append方法并不保证会对值进行编码。
在最后的问题中,某些情况下是否可以使用jQuery.param方法来对参数进行编码,回答者表示可以使用jQuery.param方法,因为它在内部使用了encodeURIComponent。
问题出现的原因是代码中的URL拼接方式不够简洁和可维护,需要进行改进。解决方法是使用更简洁的方式来构建有效的URL。
代码中使用了一个数组和forEach循环来拼接URL的参数部分。首先,代码使用jQuery选择器获取了一系列元素的值,然后将这些值存储在数组中。接下来,使用forEach循环遍历数组,对每个值进行判断,如果值不为空,则将其拼接到URL字符串中。
然而,这种方式在代码可读性和可维护性上存在问题。首先,代码中使用了大量的重复代码,每个jQuery选择器都需要重复写入。其次,代码中使用了特定的变量名来存储每个元素的值,这不利于代码的理解和维护。最后,代码没有提供对URL的合法性进行验证的机制。
要改进这段代码,可以采用以下方法:
1. 将重复的代码封装成一个函数或方法,以减少代码的重复性。可以将选择器和拼接逻辑封装到一个函数中,并在需要使用的地方调用该函数。
2. 使用更具有语义化的变量名来存储元素的值,以提高代码的可读性。可以使用有意义的变量来命名,例如title、journal等。
3. 添加对URL的合法性进行验证的机制,以确保构建的URL是有效的。可以使用正则表达式或其他方式来验证URL的格式和参数的合法性。
通过以上改进,可以使代码更加简洁、可读性更高,并且提供了对URL的合法性进行验证的机制,从而构建一个有效的URL。这样的代码更易于维护和调试,减少了出错的可能性。
如何在我的Javascript中构建有效的URL
在构建有效的URL时,需要遵循URL语法规则。以下是URL语法的来源:
- 维基百科的统一资源标识符(Uniform Resource Identifier)页面提供了易于理解并且权威的足够的组件定义。
- 维基百科的查询字符串页面提供了有关查询组件的详细信息。
- 维基百科的非允许字符的百分比编码页面提供了非允许字符的百分比编码规则。
此外,RFC 3986中的“统一资源标识符(URI):通用语法”也提供了URL语法的定义。该文档提供了URL组件、查询组件和百分比编码的规范。
查询组件的内容没有标准化,但现实中的标准是使用和号(&)作为分隔符。因此,如果数据中包含和号并且不是作为分隔符使用时,必须进行百分比编码。
其他特殊字符如等号(=)、百分号(%)和井号(#)也需要进行百分比编码。因此,遵循约定的查询组件应该如下所示:
?field1=value1&field2=value2
在Javascript中,可以方便地使用encodeURIComponent函数进行百分比编码。还需要对字段进行编码。
此外,有许多库可以处理这种转换,例如URI.js。如果使用jQuery,可以方便地使用jQuery.param进行转换。
在代码示例中,使用jQuery.param将输入值转换为查询字符串。在构建URL时,不需要将字段名作为值传递,只需使用“field=value”的形式即可。
如果希望在查询字符串中不包含值为空的字段,可以在代码中进行相应的修改。
以上是关于如何在Javascript中构建有效URL的解决方法。遵循URL语法规则和使用合适的编码函数可以确保URL的有效性和正确性。