2016-10-31 26 views
2

私はjavascriptを初めて使用しています。私はjqueryをチェックしていました。私は同じことをするために何かを作ることができるかどうかを見たいと思っていました。これは私が私がIDテストでDOMを取得$('#test')を呼び出すと、私のjsがJavaScriptの機能

//returns a dom 
    var $ = function(selector) { 
    return document.querySelector(selector); 
    }; 
    //adds something to the dom 
    var append = function(value) { 
    this.innerHTML += value; 
    }; 
    //clears dom 
    var empty = function() { 
    while (this.lastChild) this.removeChild(this.lastChild); 
    }; 

ファイルです。私は$('#test').append('hi there')と呼ぶとうまくいきます。しかし、私が試したとき$('#test').empty()私はUncaught TypeError: $(...).empty is not a function何か考えているのですか?私が何かを間違ってやっているなら、私に知らせてください。ありがとう

+0

JQueryは変数 '$'を定義していますので、 'var $ = ...'を実行するとjQueryの定義が上書きされます。 'append'関数は' this'がウィンドウであるためにのみ機能します。 – Tibrogargan

+0

@Tibrogargan彼はjQueryを使用しようとしていないので、彼は同様のものを実装しようとしています。 – Barmar

+0

あなたは 'append()'と 'empty()'という別々の関数を作成していますので、それらを '$'変数から連鎖させて利用することはできません。言い換えれば、 'empty'は '$'変数の一部ではないので、 '$ .empty'を実行することはできません。 –

答えて

7

あなたの関数はDOM要素のプロトタイプチェーンに追加されません(それは良い考えではありません)ので、DOM要素のメソッドとして呼び出すことはできません。

append DOMノードにはすでにappendというメソッドがあり、appendという変数に格納した関数とは関係がないため、機能します。

jQueryは、DOM要素のコレクションを保持するコンテナオブジェクトを作成し、独自のメソッドを持っています。 EG:

var $ = function(selector) { 
    var objects = document.querySelectorAll(selector); 
    return { 
     append: function () { 
     // do something to `objects` here 
     }, 
     empty: function () { 

     }, 
    }; 
}; 
+0

私が.append()を試したとき、私は何か正しいことをしたと思って興奮しました。助けてくれてありがとう –

+0

@bena駄目なのは申し訳ありませんが、後で見つけたほうがいいです。私の答えの中でコードを使いこなしたいのであれば、 'querySelectorAll'から' var object = querySelector'(1つのオブジェクトだけを選択する)に切り替えて、 'object.innerHTML'を使って独自のappendを実装することができます。また、関数に 'console.log'を追加して、組み込みのappendではなく、自分自身のappendであることを確認することもできます。 – Paulpro