Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery(或JS)解码字符串中的HTML字符实体_Javascript_Jquery_Json_Decode_Html Entities - Fatal编程技术网

Javascript jQuery(或JS)解码字符串中的HTML字符实体

Javascript jQuery(或JS)解码字符串中的HTML字符实体,javascript,jquery,json,decode,html-entities,Javascript,Jquery,Json,Decode,Html Entities,我试图使用jQuery和JSON响应中返回的字符串数组中的选项值动态填充元素。选项值之一是Joe';s咖啡馆解码后是乔的咖啡馆。但是,当我使用以下代码时: $.each(optionVals, function(idx, elem) { $('#restaurant').append('<option value="' + elem + '">' + elem + '</option>'); }); $。每个(选项VAL、函数(idx、元素){ $(“#餐

我试图使用jQuery和JSON响应中返回的字符串数组中的选项值动态填充
元素。选项值之一是
Joe';s咖啡馆
解码后是乔的咖啡馆。但是,当我使用以下代码时:

$.each(optionVals, function(idx, elem) {
    $('#restaurant').append('<option value="' + elem + '">' + elem + '</option>');
});
$。每个(选项VAL、函数(idx、元素){
$(“#餐厅”)。附加(“”+elem+“”);
});
相应的选项不是我所期望的。我看到:

<option value="Joe's Cafe">Joe's Cafe</option>
乔的咖啡馆 与此相反:

<option value="Joe&#39;s Cafe">Joe&#39;s Cafe</option>
乔';s咖啡馆
如何防止jQuery解码HTML实体
'.append()
操作中执行code>?我检查了JSON响应,HTML实体完好无损。加载选项后,我检查了源代码,HTML实体已被解码为单个引号

为了避免解码HTML实体,您可以用
&;替换全局
&
在字符串中:

var optionVals=[“Joe';s Cafe”];
$.each(可选值、函数(idx、元素){
要素=要素替换(/&/g,“&;”;
$(“#餐厅”)。附加(“”+elem+“”);
});

如何防止jQuery解码HTML实体
'.append()
操作中执行code>

你不能,因为它不是

jQuery正在生成一些HTML,然后获取浏览器,将其转换为DOM。然后将该DOM片段附加到表示页面的文档DOM中

使用DOM检查器检查DOM时(或使用
innerHTML
将其转换为字符串时),您正在将DOM序列化为HTML。此时,浏览器不知道(因为它没有跟踪,因为它不需要跟踪)DOM中的撇号是否来自文字撇号或字符引用。它用来决定如何表示字符的算法使用的是文本代码(当它可以使用1个更可读的字符时,使用5个字符的代码是没有意义的)

Joe's Cafe
Joe';s Cafe
是两种不同的方式,用HTML编写完全相同的东西。你得到了什么并不重要



它在HTML中可能是相同的,但在数据库中存储时则完全不同

听起来您希望表单提交字符串
Joe';s Cafe
连接到服务器

乔';s Cafe
不会这样做

这需要:
value=“Joe&;s Cafe”

现在,您可以通过合理地生成DOM来实现这一点,而不是将字符串混合在一起(因为当您将字符串混合在一起时,HTML中具有特殊含义的字符会被视为具有特殊含义)

$(“#餐厅”)。附加(
$(“”).val(elem).text(elem)
);
然而您的意思是,在数据中使用原始撇号会破坏SQL

这意味着您很容易受到攻击,而真正的解决方案是修复服务器端的


查看或查找如何使用准备好的语句来防止在服务器上使用的任何编程语言中注入SQL。

是否使用良好的旧“视图源”(在许多浏览器中使用Ctrl+U)或通过DOM窗格检查实际HTML?@lvaroGonzález我使用Chrome的开发工具进行了检查。好的ol视图源代码不会显示HTML源代码的动态部分。看到了吗?这就是问题所在:你看不到实际的HTML。不确定Chrome,但如果您右键单击选择并选择“查看所选源”,Firefox将显示实际生成的HTML。已检入Chrome、Firefox和Microsoft Edge。。。所有三个都将实际生成的HTML显示为单引号,而不是HTML实体
'。它在HTML中可能是相同的,但在存储到数据库中时却完全不同。@Stewartside-更新了答案。你问错了问题。很好,这只是你最初的答案,对我来说,似乎缺少解决问题的方法,而只是掩盖了它为什么这么做+1@Stewartside-那是因为原始问题中没有实际问题。您在问如何将某个对象转换为相同的等效状态,这不是问题。:)@Quentin有趣的是,注意到(并了解到)将字符串混合在一起会导致HTML实体被视为它们的表示形式。所以你的变通方法非常有效。关于SQL注入攻击的漏洞,服务器端代码已经减轻了这种风险,但我很感谢对它的警告@Magicprogfr我同意第二个答案,但我意识到,多亏了你的回答,解决这个问题的方法不止一种,
$('#restaurant').append(
    $("<option />").val(elem).text(elem)
);