此特定代码之前已被问过两次,但从未提出过问题"它实际上做了什么?"。它出现在克罗克福德书的第41页。
这是本书前面的句法糖:
Object.prototype = function (name, func){
if(!this.prototype[name]){
this.prototype[name] = func;
}
这是deentityify方法:
String.method('deentityify', function ( ) {
var entity = {
quot: '"',
lt: '<',
gt: '>'
};
return function () {
return this.replace(
/&([^&;]+);/g,
function (a, b) {
var r = entity[b];
return typeof r === 'string' ? r : a;
}
);
};
}());
如果在编辑器中你写了类似的东西:
document.writeln( '<">'.deentityify( ));
您将在浏览器中看到:
但是,如果您在浏览器中键入此内容:
document.writeln( '<">');
你还会看到:
&LT;&#34;&GT;
我发现当我尝试使用预填表格数据时,通过设置如下所示的值字段,这种方法实际上并没有替换实体:
var venueInput = document.createElement("input");
...
venueName = '<>"'; // for example
venueInput.value = venueName.deentityify();
form.appendChild(venueName);
form.appendChild(venueInput);
警报还显示实体未被替换。
任何人都可以帮我看看我做错了什么吗? 谢谢!
答案 0 :(得分:1)
在修复了您分享的代码的一些错误后,它就像一个魅力:
Object.prototype.method = function (name, func){
if(!this.prototype[name]){
this.prototype[name] = func;
}
}
String.method('deentityify', function ( ) {
var entity = {
quot: '"',
lt: '<',
gt: '>'
};
return function() {
return this.replace(
/&([^&;]+);/g,
function (a, b) {
var r = entity[b];
return typeof r === 'string' ? r : a;
}
);
};
}());
var venueInput = document.createElement("input");
var label = document.createElement("label");
venueName = '<>"'; // for example
venueInput.value = venueName.deentityify();
label.innerHTML = venueName;
document.getElementById('form').appendChild(label);
document.getElementById('form').appendChild(venueInput);
&#13;
<div id="form"></div>
&#13;
答案 1 :(得分:1)
这是本书前面的语法糖
您复制错误。它应该是这样的:
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
venueName = '<>"'; // for example
实体应以&#34 ;;&#34;结尾。你忘记了那个。