使用URL Encode / Decode

时间:2015-05-05 18:24:20

标签: javascript jquery ajax json custom-data-attribute

这是我关于stackoverflow的第一个问题 - 需要所有专家的帮助。我们的网络应用程序允许用户输入转义/特殊字符。我们正在为极端情况做一些测试。我可以通过ajax / json传递转义字符。

var test = JSON.stringify({
  typeName: $("#typeName").val(),
  invoiceType: 'NewTypeArea'
});
$.ajax({
  type: "POST",
  url: "BackEnd/WebService.php",
  data: {
    newInvoice: test
  },
  dataType: 'json'
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

我的后端开发人员用转义/特殊字符做他们的事情。当我再次打电话时,我得到以下JSON数据

[{"propName":"Special '\"'\\","typeName":"type'\"\\"}]

返回的数据是正确的。为简单起见 - 本例中我只有一个对象 - 我将这些数据放入下拉列表中。

$.each(data, function(i, val) {
var output = '<option class="type" id="' + this.qfInvoiceNum + '" value="' + this.typeName + '">' + this.typeName +'</option>';
$('select#typeList').append(output);

});

它正确显示所有转义/特殊字符。例如:“type'\”\“显示为'\”\

类型

然后,用户选择一个列表项。我尝试使用数据属性,值等多种方式捕获typeName。这是一个例子:

$( '.selectChange1').change(function() {
typeGrab = $('select option.type:selected').val();
pullArea();
});

但这就是问题所在。如果他们选择带有特殊/转义字符的列表项,控制台的值将返回

"type'"

"type'\"\\"

当然,当我传入var typeGrab进行JSON / AJAX调用时,这是错误的。

关于如何从下拉列表中获取转义/特殊字符有一个很好的解决方案吗?或者,当我遍历数据时,我可能会遇到$ .each?或者,很可能,我错过了一些非常简单的事情。任何帮助或见解都会很棒。

谢谢。

其他信息第一个解决方案确实有效。但是,我最初没有使用它,因为有几次显示的文本不是我想要抓取的 - 这就是为什么我在尝试数据* -attributes。

例如:

$.each(data, function(i, val) {
var output = '<option id="' + this.qfInvoiceNum + '" class="type" data-index="' + this.typeName + '" >' + this.typeName +' | #' + this.qfInvoiceNum +'</option>';
$('select#typeList').append(output);
}); 

如果我想要带有转义/特殊字符的this.typeName的值,则提供的解决方案不起作用。我不能使用数据属性或html选项值。

然而,经过大量研究后,如果您希望将值传递给具有转义/特殊字符的数据属性,我找到了一个很好的解决方案。请在下面给我答案。

2 个答案:

答案 0 :(得分:3)

经过大量研究后,我找到了我正在寻找的解决方案。如果你想在html5数据属性中使用转义/特殊字符,那么使用encodeURI()/ decodeURI()是一个很好的解决方案:http://www.w3schools.com/jsref/jsref_decodeuri.asp

此问题的解决方案:

编码的url版本的值并设置select:

的值
$.each(data, function(i, val) {
     var uri = val.typeName;
     var res = encodeURI(uri);
     var output = '<option id="' + this.qfInvoiceNum + '" class="type" data-name="' + res + '" >' + this.typeName +' | #' + this.qfInvoiceNum +'</option>';
     $('select#typeList').append(output);
    }); 

在选择时,抓取编码的uri,然后解码uri

$('.selectChange2').change(function() {
    uriTypeGrab = $('select option.type:selected').data('name');
    typeGrab = decodeURI(uriTypeGrab);
});

typeGrab现在格式正确,包含所有转义/特殊字符,并准备传递给JSON.stringify()以进行ajax调用。

答案 1 :(得分:2)

不太确定真正了解整个问题。无论如何,这是我指出的导致一些问题的原因。

当你像这样创建<option>时:

'<option class="type" id="' + this.qfInvoiceNum + '" value="' + this.typeName + '">' + this.typeName +'</option>'

然后this.typeName用于填充value属性和节点内容。

在后一种情况下,正如您所报告的那样一切正常,因为从HTML角度来看,当前typeName内容没有什么特别之处。

但在value属性中,内容在引号内,并且在此处也不能为中性。

如果没有更深入的分析和测试,我不能严格肯定,但首先,非常简单,尝试不会填充value属性,使用HTML功能透明地推断{{1}当没有给出option时,来自其节点内容的值。

这样,内容应该以书写value来逃避制定的约束。让我知道它是否有效......