2017-03-21 87 views
1

如果我有這個模塊的模式:是可以鏈接的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

回答

1

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

2

爲了避免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

1

你可以從你的函數返回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