如何将Javascript命名空间分配给HTML元素,并在该元素上调用在所述命名空间中定义的函数?
我问了另一个问题:Attaching JavaScript to the prototype of an ASCX client side instance
上一个问题回答了如何做到这一点,但现在我很好奇这是如何在纯Javascript/HTML级别上工作的。我还没想明白呢。
假设我有一个只有一个文本框的HTML页面:
<html>
<body>
<div>
<input type="text" id="MyTextBox" />
</div>
</body>
</html>在浏览器中,我可以执行document.getElementById('MyTextBox')。
然而,我的问题是,仅仅使用javascript,我如何给返回的对象分配一个javascript类型,这样我就可以从对象中调用在名称空间中定义的函数?
例如,我想这样做:
var x = document.getElementById('MyTextBox');
x.SetTheText('blah');在我的自定义名称空间/类型/类中,我会将SetTheText定义为
function SetTheText(text) {
this.value = text;
}如何说MyTextBox是一个可以运行JS名称空间中定义的函数的对象。我希望这是有意义的
发布于 2011-08-10 09:48:53
基本上,您可以向(几乎)任何类型的JS对象添加任何类型的属性。如果您将一个函数添加到一个对象,则该函数的this将是该对象。
换句话说
var x = document.getElementById('MyTextBox'); // a DOM object
x.setTheText = function(text) {
this.value = text;
};
x.setTheText('blah'); // bingo如果您想要扩展整个对象类,也可以通过原型来实现
HTMLTextAreaElement.prototype.setTheText = function(text) {
this.value = text;
};
someRandomTextArea.setTheText("blah"); // bingo. Again.但是,并不建议这样做,因为您正在处理超出您控制范围的对象(即,由于其他脚本和浏览器更新以及其他可能会遇到的障碍,这些对象很脆弱)。此外,这样做可能会破坏一些其他代码。
一个更好的解决方案(在许多方面)是jQuery解决方案,它将一个未修改的DOM元素包装在另一个对象中,并在包装器对象上调用方法,而不是直接调用元素(就我个人而言,我更喜欢那些可以通过扩展原生JS对象获得的“漂亮”代码,但遗憾的是,这样做并不安全,所以我打算放弃这种做法。)
附注:类在javascript中被大写;方法是camelCase。我已经相应地编辑了代码。它不是由任何东西强制执行的,而是风格的风格。
编辑:作为比较,您可以看看the prototype.js library,它通过扩展DOM发挥了它的魔力。同样,在我看来,与jQuery对$(...).xyz(...)的持续调用相比,它生成了一些非常漂亮的代码,但这仍然是一条稍微危险的路线
发布于 2011-08-10 11:01:51
你不应该修改主机对象,所有主要的库都同意这一点。改用包装器对象:
<input type="text" id="inp0">
<script type="text/javascript">
function CreateCustomElement(el) {
this.element = el;
}
CreateCustomElement.prototype = {
setTheValue: function(text) {
this.element.value = text;
}
}
var x = new CreateCustomElement(document.getElementById('inp0'));
x.setTheValue('foo');
</script>https://stackoverflow.com/questions/7005023
复制相似问题