2017-03-21 4 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'を入れた場合、私はそれを私に与えたい<button type="button" id="btnPrint" class="btn">...</button>コンソールでgetElementByIdを実行すると、私のモジュールの変数を最初に使用すると得られることになります(同じ意味です)。私は同じことをしたかっただけです連鎖された方法で。

編集:完全を期すため、これはトラヴィスが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()); 

私は同意するものとします。絶対に必要でない限り、これは悪く見えます。 v変数を避けるために

+0

は、任意の入力のparamsなしで呼び出された場合myPublicMethod()は未定義を返しませんか? – 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?

はい。 Elementを返します(一致しない場合はundefined)。 Elementは一般的な関数群を公開し、要素が特定の型(例えばフォーム)であれば、特定の一連の関数を公開することもできます。

読むより一般的な要素タイプの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 = 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'); 

:あなたは、このように返された値からv要素にアクセスすることになり、チェーンのセットアップを利用したい場合は、は、ここに行っている可能性は何

私はあなたが「渡される同じ値を返す関数を呼び出す」と説明しましたが、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

ああ、そうではありません。連鎖は左から右へと進む。まず、 'myPublicMethod'を含むオブジェクトである' MODULE'を取得します。次に、関数を呼び出す '.myPublicMethod()'(モジュールオブジェクト上で利用可能であるため)を使用してそのオブジェクトにアクセスします。この場合、 'undefined'が返されます。第三に、あなたは '.document'を使って' undefined'にアクセスします。これは 'undefined'がプロパティ文書を持っていないので問題が発生します。 –

+0

document.getElementById( 'element')を実行すると、どうしてうまくいかないのですか。MODULE.myPublicMethod(e); (または、同じ結果がない場合)。 Uncaught TypeError:未定義のプロパティ 'myPublicMethod'を読み取ることができません – johnny

2

、あなたは

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

documentを使用する必要があります(windowオブジェクトの)グローバルプロパティである、あなたはそれをオフそのmyPublicMethod()からチェーンに戻ってきたする必要があると思います。引数が渡されていない場合、それは恒等関数であることを考えると、あなたも

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

Bergi私は2番目を試しました。私は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はしませんでしたが、この解決策は 'document'にはあまりにも特異的だと思います。 OPが 'document'だけでなく、' Date'などの解決策を求めていたらどうでしょうか?もちろん、これは単なる別の仮定です。なぜなら、質問そのものは実際にはっきりしていないからです。 – Xufox

関連する問題