Javascript 如何在querystring中嵌入带撇号的值

Javascript 如何在querystring中嵌入带撇号的值,javascript,Javascript,我有以下javascript: tr.append("<a href='add_widget.html?id=" + data[i].id + "&pg=" + data[i].page_number + "&dest=" + data[i].dest + "&name=" + data[i].name.replace("'","\\'") + "'</a><button class='btn btn-xs btn-primary'>Edit

我有以下javascript:

tr.append("<a href='add_widget.html?id=" + data[i].id + "&pg=" + data[i].page_number + "&dest=" + data[i].dest + "&name=" + data[i].name.replace("'","\\'") + "'</a><button class='btn btn-xs btn-primary'>Edit</button>&nbsp;</td>");
如何更改上述代码,以便将整个字符串“John’s stuff”传递到add_widget.html页面

谢谢

替换(“”,“%27”)

试试这是一个在线URL编码器/解码器。

当你试图“保护”字符时,你必须记住你要保护他们不受什么影响。在这种情况下,您需要担心两个口译员:

  • 您正在构建HTML,因此您必须担心HTML解析器
  • 您正在构建一个URL,因此您必须担心浏览器和服务器将如何解析URL
要解决第一个问题,可以用HTML实体等价物(
';
)替换引号。要处理第二个问题,可以使用
encodeURIComponent()

我认为您应该首先执行
encodeURIComponent()
调用,以避免HTML实体符号混乱。HTML解析器处理完字符串后,实体表示法将消失:

function qEncode(str) {
  return encodeURIComponent(str).replace(/'/g, "&#39;");
}
要使用它:

tr.append("<a href='add_widget.html?id=" + 
  qEncode(data[i].id) + "&pg=" + 
  qEncode(data[i].page_number) + "&dest=" + 
  qEncode(data[i].dest) + "&name=" + 
  qEncode(data[i].name) + 
  "'</a><button class='btn btn-xs btn-primary'>Edit</button>&nbsp;</td>"
);

tr.append(使用
escape(data[i].name)
而不是
data[i].name.replace(“'”,“\\'”)
,将解决您的问题。

您需要思考,我的代码将被解释为什么,那么我需要进行escape做什么

  • 您的代码将由浏览器中的HTML解释器进行解释
  • 您的代码将被解释为URI
  • 这意味着您需要以相反的顺序对它们进行转义/编码。幸运的是,JavaScript提供了一个URI编码器作为
    encodeURIComponent
    ,但它没有提供HTML编码器(可能是因为我们有DOM方法),但对于重要的字符(例如

    function html_encode(str) {
        var re_chars = /[<>'"]/g;
        function replacer($0) {
            return '&#' + $0.charCodeAt(0) + ';'
        }
        return str.replace(re_chars, replacer);
    }
    // example follows
    html_encode('<foo bar="baz">'); // "&#60;foo bar=&#34;baz&#34;&#62;"
    

    为了完整起见

    function html_decode(str) {
        var re = /&(?:#\d{1,3}|amp|quot|lt|gt|nbsp);/g, // notice extra entities
            d = document.createElement('div');
        function replacer($0) {
            d.innerHTML = $0;
            return d.textContent;
        }
        return str.replace(re, replacer);
    }
    // and an example
    html_decode('&#60;foo bar=&#34;baz&#34;&#62;'); // "<foo bar="baz">"
    
    函数html\u解码(str){
    var re=/&(?:#\d{1,3}amp | quot | lt | gt | nbsp);/g,注意额外的实体
    d=document.createElement('div');
    函数替换器($0){
    d、 innerHTML=$0;
    返回d.textContent;
    }
    返回str.replace(re,replacer);
    }
    //举个例子
    html#U解码('<;foo bar=";baz";>;')/“
    
    您应该使用
    encodeURIComponent()
    对参数值进行编码。编辑(但我猜这对引号没有帮助)您使用的是jQuery吗?如果是这样,有一种更好的方法来执行您正在执行的操作。内置(通常不推荐)的
    escape()
    函数将执行此操作。使用javascript encodeURI或encodeURI组件是消除不需要的URL字符的最佳方法。可能最好使用全局替换:
    replace(/”/g,“%27”)
    @Jean Philipper是,但请尝试它-
    encodeURI()
    encodeURIComponent()
    不会将单引号字符替换为
    %27
    @formix它取决于URL如何到达“href”DOM节点的属性。在OP中,它是通过HTML标记到达的,因此HTML解析器将在解析
    标记时解释实体符号。在“href”的值中不会有HTML实体符号属性。URI编码
    %xx
    是否不同于HTML编码
    &#xx;
    ?,即HTML解释器不会忽略
    %xx
    ?edit没有完整读取OP的代码,它位于URI中,因此可以对其进行编码both@PaulS.右-OP出现问题的原因是URL不正确ng构建为嵌入HTML标记的属性值。HTML解析器是导致问题的原因,因为它将单引号字符视为终止属性值。抱歉@Pointy能否稍微修改您的答案,以便为我提供需要进行的两个函数调用的完整示例?只想确定我在同一页上,如果您想了解
    html\u decode
    ,我会将它们逐个匹配地放入
    中,而不是一次全部匹配,以避免意外加载或代码执行(例如
    attrib_value = html_encode(/* ... + */ encodeURIComponent(data[i].name) /* + ... */ );
    
    function html_decode(str) {
        var re = /&(?:#\d{1,3}|amp|quot|lt|gt|nbsp);/g, // notice extra entities
            d = document.createElement('div');
        function replacer($0) {
            d.innerHTML = $0;
            return d.textContent;
        }
        return str.replace(re, replacer);
    }
    // and an example
    html_decode('&#60;foo bar=&#34;baz&#34;&#62;'); // "<foo bar="baz">"