Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为DOM节点提供Javascript功能_Javascript_Html_Dom - Fatal编程技术网

为DOM节点提供Javascript功能

为DOM节点提供Javascript功能,javascript,html,dom,Javascript,Html,Dom,我正在开发一个单页应用程序,相当多的DOM节点构造函数返回对它们创建的对象的引用。这里有一个例子来说明我的意思: if (!document.getElementById('playlistHeader')) { appView.buildKit.playlist.headerWrap(); } // construct element var secondaryBtnsWrap = document.createElement("div");

我正在开发一个单页应用程序,相当多的DOM节点构造函数返回对它们创建的对象的引用。这里有一个例子来说明我的意思:

if (!document.getElementById('playlistHeader')) {
        appView.buildKit.playlist.headerWrap();
    }

    // construct element
    var secondaryBtnsWrap = document.createElement("div");
    secondaryBtnsWrap.id = "playlistSecondaryBtnWrap";
    secondaryBtnsWrap.className = "clearright right";

    // attach it
    document.getElementById('playlistHeader').appendChild(secondaryBtnsWrap);

    // return reference to dom node
    return secondaryBtnsWrap;
我认为在视图之间切换时销毁和重新创建节点是多余的,因此我开始致力于能够擦除某些节点(站点的子部分)的内容,方法是为它们提供一个处理擦除的自定义函数

// build wipe function
    secondaryBtnsWrap.wipe = function(){

        // do custom wiping here
    }
其思想是“重置”UI的部分,并重建视图之间的差异。例如,如果有一个按钮,我们需要不管,擦拭功能不会删除它。这样就省去了创建相同元素的额外工作

在某些情况下,获取对节点的引用并触发附加的自定义函数要容易得多,但我想知道这到底是一个好主意还是一个好主意(但不是)


TL;DR版本


给DOM节点提供Javascript函数是个好主意吗

DOM节点是一级对象。为它们指定您自己的属性没有错。只是不要试图覆盖任何内置程序(可能除了事件处理程序,但您应该真正使用
attachEvent
/
addEventListener
)。在我看来,这是javascript在用户界面开发方面最方便的特性之一

您还可以使用生成自己的DOM节点的标准对象构建页面。您可以附加事件侦听器,这些侦听器调用所述对象上的函数进行交互。使用闭包引用所有者对象。例如:

function Foo() {
    this.element = undefined;
    this.createTextbox();
}

Foo.prototype.createTextbox = function() {
    var $self = this;
    this.element = document.createElement('input');
    this.element.type = 'text';
    this.element.addEventListener('change', function() { 
        $self.onChange.apply($self, arguments); 
    });
}

Foo.prototype.onChange = function() {
    console.log(this.element.value);
}

Foo.prototype.Render = function(target) {
    target = target || document.body;
    target.appendChild(this.element);
}

var foo = new Foo();
foo.Render();

这两种方法都同样有效,但我想说,当设计或功能需要显著修改时(而不是在两个位置更改ID、类和布局,您只需在其中一个位置更改它们),后者可能更方便。

非常简洁明了+1对于这样一个优秀的答案和干净的代码。优质材料:)