【发布时间】:2012-01-02 16:41:23
【问题描述】:
我在 FireFox 和 Opera 中发现了一个错误。(我正在运行 Debian Whezee、Firefox 9.0.1、Opera 11.60、Chrome 16.0.912.63) 当您键入这样的内容时:
var a = document.createElement('a')
a.toString = function(){ return "Hello" }
alert(a+" World");
在 Chrome 中,您会看到带有“Hello World”的警告框,但在 firefox 和 opera(不了解 IE)中,您会看到类似“[object HTMLElement] World”的内容
我试图解决这个问题:
Object.prototype.toString = function(){ return "Hello" };
Function.prototype.toString = function(){ return "Hello" };
它不起作用因为 DOM 元素不是 Object(不继承自 Object 并因此继承 Function),甚至这也没有帮助:
HTMLElement.prototype.toString = function(){ return "Hello" };
Element.prototype.toString = function(){ return "Hello" };
Node.prototype.toString = function(){ return "Hello" };
因为 HTMLElement、Element、Node 都是接口而不是函数。
现在我的问题是在哪里报告这个错误?有人可以帮我解决这个问题吗?
//编辑
这是我原来的 toString 函数:
var a = document.createElement('a');
a.toString = function(){
var tmp=document.createElement('div');
tmp.appendChild(this);
return tmp.innerHTML;
}
如您所见,这是 outerHTML 的替代方法,我需要将其作为下一行中的默认行为
document.getElemntById('someID').innerHTML += "click this link:"+a;
结果应该是这样的:
<div id='someID'>click this link:<a></a></div>
【问题讨论】:
-
谁说这是一个错误?显然,Firefox 和 Opera 不允许覆盖 DOM 节点的
toString。因为它们是宿主对象,它们不受 ECMAScript 规范的约束,所以完全没问题。 -
所以也许有人知道我能做些什么来获得类似的效果。是否有任何其他方法可以覆盖可以解决问题。因为当我使用 Chrome 而其他人使用 Firefox 或 Opera 时,每次使用 a.toString() 并不是那么明显。我通常会说“奇怪,我的工作正常”,然后在需要的地方默默地添加 .toString()。
-
问题是,您究竟希望您的
toString函数做什么?如果你真的只想获取内部文本,你应该使用innerText或textContent。这是标准方式。 -
@fon60 为什么不只是
alert( a.innerHTML + ' World' );? -
我记得我自己一件事。此方法在对象中定义,但默认情况下引擎/javascript 不调用此方法。所以当我做 alert(a.toString()+" World");到处都能正常工作。我感兴趣的是。数组对象有 toString 可以被覆盖,但为什么 DOM 元素没有这个。请让 Node 继承自 Object。请。
标签: javascript firefox dom tostring