【问题标题】:I try to write the java script code like oops how to extend the DOM elements?我尝试编写类似 oops 的 java 脚本代码如何扩展 DOM 元素?
【发布时间】:2017-03-02 11:38:41
【问题描述】:

在我的代码中,

    function ElementBase(name) {
         this.tagName = typeof name != "" ? name : 'div';
         this.createElem();
     }

     ElementBase.prototype = {
            createElem: function() {
                this.elem = document.createElement(this.tagName);
            },
            getIndex: function() {
                var nodes = this.elem.parentNode.childNodes,
                    node;
                var i = count = 0;
                while ((node = nodes.item(i++)) && node != this.elem)
                    if (node.nodeType == 1) count++;
                return (count);
            }
};

我尝试创建的DOM元素标签是“div”。

function Div() {

    this.tagName = 'div'
    ElementBase.call(this, this.tagName);
}

Div.prototype = Object.create(ElementBase.prototype);

我的问题是,

1) 插入创建的对象后如何从html文档中访问getIndex函数? 示例:

var div = new Div();    
div.id = "d1"
document.body.appendChild(div.elem);
// After div.getIndex() working 

然后在某些情况下,我需要文档中该 div (id="d1") 元素的索引值。

var d= document.getElementById("d1");
d.getIndex()   //not working

我在上面的代码中犯了什么错误?

谢谢提前..

【问题讨论】:

  • 它看起来像基于 java 的结构和语法。它可能仅对我的代码语法有用。我举一个例子,它是原型方法。如何实现原型继承?你对此有什么想法吗?
  • @RobertJ.Hovey 不,那是 Javascript。它只是使用了您可能不熟悉的语言的一些功能。
  • @duskwuff 没错,我是编写 javascript 的初学者。我想写一个基于 jquery 的插件。所以我用js来写基于原型的语法。

标签: javascript html oop prototype


【解决方案1】:

我认为当您执行document.body.appendChild(div.elem) 时,您只需执行document.body.appendChild(document.createElement('div')) 即可。 当你这样做时,var d= document.getElementById("d1"); d 只是一个从 DOM 返回的对象,与你的 var div 无关。

你可以做的是:

Div.prototype.getIndex.call(d);

但这实际上并没有扩展您的对象。实际上扩展 DOM 对象是一种不好的做法(请查看http://perfectionkills.com/whats-wrong-with-extending-the-dom/)。

【讨论】:

    【解决方案2】:

    仔细查看您的代码。

    divDiv 的一个实例,它有一个属性 .elem 保存实际的 DOM 元素。

    所以当你做div.id = "d1"时,你并没有设置DOM元素的id。

    var div = new Div();
    div.id = 'd1';      // <div></div>
    div.elem.id = 'd1'; // <div id="d1"></div>
    

    但是还有一个问题:当你执行d= document.getElementById("d1") 时,你得到的是一个DOM 元素,而不是Div() 的一个实例。

    由于.getIndex() 是在.prototypeDiv() 上定义的,普通的旧DOM 元素无法访问它。

    你如何解决这种情况取决于你需要用你的代码完成什么。


    编辑1:回复OP's comment

    document.getElementById() 返回一个HTMLDivElement 的实例,这与Div 的实例根本不同。

    一种解决方案是使用 setter 方法:

    function Div() {
        // ...
    }
    Div.prototype.setId = function setId(id) {
        this.elem.id = id;
    }
    
    var div = new Div();
    div.setId('d1'); // same as doing div.elem.id = 'd1';
    

    另一种解决方案是在构造函数本身中使用id:

    function Div(id) {
        // ...
    
        this.elem.id = id; // or you can use "this.setId(id)"
        /*
            if "id" is provided, 
            it will take that value,
    
            else it is set to "undefined",
            which is the same as not being set
        */
    }
    Div.prototype.setId = function setId(id) {
        this.elem.id = id;
    }
    
    var div = new Div('d1'); // same as doing div.elem.id = 'd1';
    div.setId('d2'); // same as doing div.elem.id = 'd2';
    

    【讨论】:

    • 在我的代码中有错误。我在上面的问题中提到了这一点。我尝试按照您提到的方式设置 DOM 元素 ID(div.id)。我不想这样写div.elem.id。我尝试定义能够更改属性的对象
    猜你喜欢
    • 2017-05-07
    • 2018-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2016-12-07
    • 1970-01-01
    • 2013-02-24
    相关资源
    最近更新 更多