首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Javascript命名空间分配给HTML元素并从元素调用命名空间中定义的函数

将Javascript命名空间分配给HTML元素并从元素调用命名空间中定义的函数
EN

Stack Overflow用户
提问于 2011-08-10 09:43:25
回答 2查看 1.8K关注 0票数 3

如何将Javascript命名空间分配给HTML元素,并在该元素上调用在所述命名空间中定义的函数?

我问了另一个问题:Attaching JavaScript to the prototype of an ASCX client side instance

上一个问题回答了如何做到这一点,但现在我很好奇这是如何在纯Javascript/HTML级别上工作的。我还没想明白呢。

假设我有一个只有一个文本框的HTML页面:

代码语言:javascript
复制
<html>
   <body>
    <div>
     <input type="text" id="MyTextBox" />
    </div>
   </body>
</html>

在浏览器中,我可以执行document.getElementById('MyTextBox')

然而,我的问题是,仅仅使用javascript,我如何给返回的对象分配一个javascript类型,这样我就可以从对象中调用在名称空间中定义的函数?

例如,我想这样做:

代码语言:javascript
复制
var x = document.getElementById('MyTextBox');
x.SetTheText('blah');

在我的自定义名称空间/类型/类中,我会将SetTheText定义为

代码语言:javascript
复制
function SetTheText(text) {
    this.value = text;
}

如何说MyTextBox是一个可以运行JS名称空间中定义的函数的对象。我希望这是有意义的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-10 09:48:53

基本上,您可以向(几乎)任何类型的JS对象添加任何类型的属性。如果您将一个函数添加到一个对象,则该函数的this将是该对象。

换句话说

代码语言:javascript
复制
var x = document.getElementById('MyTextBox'); // a DOM object
x.setTheText = function(text) {
     this.value = text;
};
x.setTheText('blah'); // bingo

如果您想要扩展整个对象类,也可以通过原型来实现

代码语言:javascript
复制
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(...)的持续调用相比,它生成了一些非常漂亮的代码,但这仍然是一条稍微危险的路线

票数 3
EN

Stack Overflow用户

发布于 2011-08-10 11:01:51

你不应该修改主机对象,所有主要的库都同意这一点。改用包装器对象:

代码语言:javascript
复制
<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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7005023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档