我正在创建自己的小部件:
Button = function(){};
Button.prototype = document.createElement('INPUT');
btn = new Button();
btn.type = 'BUTTON';
btn.value = 'test';
btn.onclick = function(){alert('TEST!')}
document.body.appendChild(btn);
如果我只是打开一个新选项卡,然后将其复制并粘贴到Firefox的控制台中,则运行起来非常好。但是,当我将它们放入一个js文件(用
$(document).ready
包装)并以HTML进行链接,然后在浏览器中打开HTML时,它失败了。在
btn.onclick
行上,它告诉我:uncaught exception: [Exception... "Illegal operation on WrappedNative prototype object" nsresult: "0x8057000c (NS_ERROR_XPC_BAD_OP_ON_WN_PROTO)" location: "JS frame :: main.js :: <TOP_LEVEL> :: line 12" data: no]
我有点理解错误,因为我继承了原型,但是我
new-ed
元素(不直接作用于它),它在控制台中可以正常运行。谁能指出这个问题? 最佳答案
您不能像这样创建DOM节点(而且无论如何您都无法正确进行原型设计,您需要使用HTMLInputElement.prototype
,但这是另一回事),而是
Button = function(){
var btn = document.createElement('INPUT');
btn.type = 'BUTTON';
return btn;
};
您仍然可以执行
new Button
,但这次可以正常运行。编辑:如果要使用
Button.prototype
定义属性和方法,可以将它们复制到构造函数中的btn
(这将是ByVal而不是ByRef)for (i in Button.prototype) { // make sure to var i
btn[i] = Button.prototype[i];
}
尝试使用以下原型,但请注意,对
Button.prototype
的更改不会反映在已经创建的btn
中。Button.prototype = {test: function () {console.log('invoked');}}