是可以链接的document.getElementById方法吗?

问题描述:

如果我有这个模块的模式:是可以链接的document.getElementById方法吗?

var MODULE = (function(window){ 
    var myPublicStuff = {}; 

    myPublicStuff.myPublicMethod = function(e){ 
     return e; 
    }; 
    return myPublicStuff; 

})(window); //edit: forgot to put I have this 

这工作:(编辑为清楚起见)

v = document.getElementById('some-element'); //works as expected 
MODULE.myPublicMethod(v); //works. 

但是,这并不工作,

MODULE.myPublicMethod().document.getElementById('some-element'); 

document.getElementById('some-element').MODULE.myPublicMethod(). 

我认为如果在狱中的前一个成员返回一个值,你可以链接到下一个链接?这在这里不起作用,但我不知道为什么。

编辑:感谢所有的答案。我想要做的就是获取元素,并通过链接将该方法打印回。就这样。如果我把'btnPrint'放在'btnPrint'中,我想让它给我<button type="button" id="btnPrint" class="btn">...</button>如果我在控制台上得到了ElementById,那么如果我首先为模块使用一个变量(这是有道理的),那就是我所得到的。我只想做同样的事情用链式方法。

编辑:为了完整,这是特拉维斯上的jsfiddle把什么(感谢):

<button type="button" id="btnPrint" class="btn">...</button> 

Element.prototype.myPublicMethod = function(){ 
//in the prototype scheme that JavaScript uses, 
//the current instance of the Element is *this*, 
//so returning this will return the current Element 
//that we started with. 
return this; 

} 

console.log(document.getElementById("btnPrint").myPublicMethod()); 

我同意。这看起来很糟糕,除非绝对必要

+0

不myPublicMethod()返回一个不确定的,如果叫没有任何输入PARAMS? – jithinpt

+0

是的。这就是为什么我想调用getElementById函数。 – johnny

+1

'MODULE.myPublicMethod()。document.getElementById('...')'只有在'MODULE.myPublicMethod'返回一个具有'document'属性的对象时才有效,后者又具有'getElementById'属性。但是'document'是'window'的全局属性,所以你不能仅仅把它作为别的属性来使用。 – Xufox

Is document.getElementById a method that can be chained?

是。它返回一个元素(如果没有匹配,则返回undefined)。该元素公开了一组通用函数,并且如果元素是特定类型(例如表单),那么它也可能具有一组特定的函数。

https://developer.mozilla.org/en-US/docs/Web/API/Element

I want to do this:

v = document.getElementById('some-element'); //works as expected 
MODULE.myPublicMethod(v); 

这里了解更多关于通用元件类型,v很简单,对不对?它只是获得id="some-element"的元素。好的,从那里你将它传递给myPublicMethod(v)。当你这样做时,你所做的只是调用一个函数,该函数返回的值与传入的值相同。除此之外,没有任何分配或存储发生在上面显示的代码中。

可以在这里做什么,如果你想利用链接设置的,将是再从返回的值访问v元素是这样的:

v = document.getElementById('some-element'); 
var vId = MODULE.myPublicMethod(v).id; 
console.log(vId);// this will log "some-element" to the console 

But this does not work,

MODULE.myPublicMethod().document.getElementById('some-element'); 

所以上面我解释说你正在“调用一个返回相同值的函数”,请记住myPublicMethod里面只有return e;?那么这意味着你使用undefined作为结果,因为在使用这行代码时没有任何东西被传入。换句话说,上面的代码可以检查为undefined.document.getElementById('some-element'),这有希望显然是有问题的。

if I put in 'btnPrint' I want it to give me <button type="button" id="btnPrint" class="btn">...</button>

例如,你的代码编写会做到这一点这样:

var MODULE = (function(window){ 
 
    var myPublicStuff = {}; 
 

 
    myPublicStuff.myPublicMethod = function(e){ 
 
     return e; 
 
    }; 
 
    return myPublicStuff; 
 
})(window); 
 

 
console.log(MODULE.myPublicMethod(document.getElementById('btnPrint')));
<button type="button" id="btnPrint" class="btn">...</button>

+0

为什么它在调用myPublicMethod()之前没有得到'some-element'?我认为这就是链接工作的方式。编辑:我想我倒过来了。 – johnny

+1

啊,这不是它的工作原理。链接从左到右。所以首先,你得到'MODULE',它是一个包含'myPublicMethod'的对象。其次,然后使用'.myPublicMethod()'访问该对象(因为它在模块对象上可用),它调用一个函数并在这种情况下返回'undefined'。第三,然后你可以使用'.document'访问'undefined',这是问题出现的地方,因为undefined没有属性文件。 –

+0

当你做document.getElementById('element')。MODULE.myPublicMethod(e); (或没有e,相同的结果)。它返回Uncaught TypeError:无法读取未定义的属性'myPublicMethod' – johnny

为了避免v变量,你需要使用

MODULE.myPublicMethod(document.getElementById('some-element')); 

document是一个全球性的属性(在window对象的),你需要已经返回,从myPublicMethod()到链断了。由于它是身份的功能,你甚至可以做这样的事情

MODULE.myPublicMethod(document).getElementById('some-element'); 
MODULE.myPublicMethod(window).document.getElementById('some-‌​element'); 
+0

Bergi我试过第二个。我通过了IIFE中的窗口对象。我忘了把它放在我原来的。编辑:第一个是我不想要做的。 – johnny

+0

在IIFE中放置'window'不会改变任何东西。是的,你可以链接'window',但是你会使用'MODULE.myPublicMethod(window).document.getElementById('some-element');'然后 - 你的方法返回它的参数,而不是'window'。而且我仍然没有得到你“*不想做的事情”* - 由于你的脚本目前没有做任何实际的工作,你可以完全忽略它。那么你的模块的目的是什么? – Bergi

+0

Bergi,我有现有的对象,我想用更好的模式重做。这是理解基础的第一次尝试。我读过很多东西,但它不能替代实际的做法,所以这就是我所处的位置。 – johnny

你可以从你的函数返回document如果没有参数传递:

var MODULE = (function(window){ 
    var myPublicStuff = {}; 

    myPublicStuff.myPublicMethod = function(e){ 
     return e || document; 
    }; 
    return myPublicStuff; 

})(); 

var text = MODULE.myPublicMethod().getElementById('element').innerHTML; 

console.log(text); 

JSBin

+1

甚至可以用'window'来做他的确切例子。 – Xufox

+1

请分享你的推理与反对票,因此每个人都可以从这里学习什么是错误和更好的方式做这个 –

+0

没有downvote,但我认为这是因为这个解决方案过于具体到'文档'。如果OP想要一个解决方案,不仅是为了'document',还是为了'Date'?当然,这只是另一个假设,因为问题本身并不十分清楚...... – Xufox