潜在的Dojo错误

时间:2014-05-22 07:58:32

标签: jquery dojo html-entities

当我想要解码html实体时,我发现了一个潜在的Dojo错误。看我的例子:

require(["dojox/html/entities", "dojo/dom"], function(entity, dom){
    dom.byId('test'). innerHTML = entity.decode('€');
    dom.byId('test2').innerHTML = entity.decode('€');
});

divs都会显示欧元符号。在我的情况下,我想显示&符号后跟'欧元;'。我知道如何才能做到这一点,但这不是我的问题。当我做同样的解码'在jQuery我得到了预期的结果。

$(document).ready(function(){
    $('#test3').html('€').val();
    $('#test4').html('€').val();
}); 

第一个案例将告诉我'&欧元;'(没有空间),第二个'€'

对我来说,jQuery示例是预期的行为。我是对的,可以打开Dojo票吗?

http://jsfiddle.net/NT8GX/

1 个答案:

答案 0 :(得分:3)

只是查看了JavaScript代码,它确实是一个错误。会发生以下情况:

decode-process使用两个映射,一个用于常规HTML字符(如&),另一个用于拉丁字符(如€)。解码时会发生什么following

// Apply the basic mappings.  HTML should always come first when decoding
// as well.
str = _applyDecodingMap(str, dhe.html);
str = _applyDecodingMap(str, dhe.latin);

因为它分两步进行,这意味着在第一步&转换为&,第二步€转换为欧元符号。这里的罪魁祸首是这两个地图的使用,如果它们合并为一个地图就不会发生。

例如,如果您解码",它将返回预期的",因为两个实体都位于同一地图中。

console.log(entity.decode('"')); // Returns '"'

如果您现在需要解决方案,可以自行合并地图来解决问题:

var allEntities = entity.html.concat(entity.latin);
console.log(entity.decode('€')); // Returns '€'

但请注意,调用innerHTML也会对实体进行解码,因此您仍会看到欧元符号。


所以,为了回答你的问题,你确实可以开票。请注意,这是DojoX库的一部分(这意味着它是由其他人开发的,而不是Dojo核心提交者)。文件说它仍然保留,但我不知道需要多长时间才能看到。