2010-12-03 7 views
1

が考える自身を参照するには?私はオブジェクト内のものを参照する必要があるので、スタンドアロンの外部関数を望んでいません。Javascriptが、設計機能は

たとえば、関数は、ganttChartオブジェクトの特定のインスタンスで定義されたvariable1/2/3を参照できます(複数のチャートオブジェクトを持つことができます)。

希望は意味があります! EG:

function ganttChart(gContainerID) { 

    this.variable1 = "lol"; 
    this.variable2 = "hai dere"; 
    this.variable3 = "cometishian"; 

.... 
    this.gContainer.innerHTML += "<div id=\"gBar" + i + 
      "\" class=\"gBar\" onmousedown=\"gInitBarDrag(this)\">Hello</div>"; 
.... 

    gInitBarDrag = function(thisGanttObject) 
    { 
     alert(thisGanttObject.variable2); 
     // This line wont work because it doesn't know what ganttChart to reference! 
    } 

} 
+0

@Tom「this」の値は何を指していますか? –

+0

ガントチャートオブジェクト。 –

+0

@Tom「granttChartクラス」とはどういう意味ですか? granattChartは関数であり、JavaScriptにはクラスが存在しません。 –

答えて

2
function gnattChart(gContainerID) { 
    var div = document.createElement('div'); 
    div.id = 'gBar'; 
    div.className = 'gBar'; 

    //If you want to reference properties from the gnattChart object... 
    //Use `self` where you'd normally use `this` in the handler function 
    var self = this; 

    div.onmousedown = function() { 
    //contents of gInitBarDrag here... 
    }; 

    //If you want the container to be emptied... 
    this.gContainer.innerHTML = ''; 

    this.gContainer.appendChild(div); 
} 
+0

+1これは正しいと見て、それを実装しようとします –

+0

+1それはそれを行う必要があります。 (私はライブラリーを使ってイベントハンドラーをつけるのが好きですが) –

+0

@ŠimeVidas - Javascriptについて話すときに接線を外すのはとても簡単です。物事を単純なものにしようとしています。幸運にも、 'onevent' DOMNodeプロパティを使用するのは、100%クロスブラウザーであり、インラインイベント属性よりも少なくとも一桁は優れています。 – MooGoo

0
this.gContainer.innerHTML += "<div id=\"gBar" + i + "\" class=\"gBar\" onmousedown=\"function(){ alert('here'); }\">Hello</div>"; 

が、インライン関数は、一般的に眉をひそめています。

+0

私の目はちょうど死んだ。醜いですが、正しさは+1です。 – Stephen

+0

申し訳ありませんが、私の質問ポイントを逃し、関数は、メインのganttChartオブジェクト内の変数にアクセスできる必要があります –

-1
var gInitBarDrag = function(){ 
    ///function body here 
}; 

function ganttChart(gContainerID) { 
.... 

    this.gContainer.innerHTML += "<div id=\"gBar" + i + "\" class=\"gBar\" onmousedown=\"gInitBarDrag(this)\">Hello</div>"; 
.... 


} 
+0

その関数は、ganttChartオブジェクト内に含まれる変数を参照することができますか? –

+0

いいえ... 'gInitBarDrag'というグローバル関数を探し、見つからず、例外 – MooGoo

+0

のコピー貼り間違いをスローします。それを修正しました –

0

OK、私はそれをテストし、prototypejsを使用せずにお答えしますが、私はあなたがワークアウト自分のための機能を使用すると、JSフレームワークを使用しないことができるかどうかを確認しています。次に、あなたの新しいdiv要素(変数dを配置するdocument.appendChildを使用する必要があります

var d = document.createElement("div"); 
// Set your div properly. 

まず、あなたはこのような何か、のdocument.createElementを使用しての代わりにHTMLを注入し、あなたのdivを作成することになるでしょう)をあなたのページに表示します。 "難しい"部分:マウスダウンのイベントを聞き、それに応じて行動します。これを行うには、Event.observe(prototypejs)とbind(prototypejs)を使用してオブジェクトをリスナーにバインドします。そのため、変数(this.variable1、variable2など)を使用できます。

これは、多少のようなコードを提供します:

function ganttChart(gContainerID) { 

this.variable1 = "lol"; 
this.variable2 = "hai dere"; 
this.variable3 = "cometishian"; 

// Create Element part (createElement, appendChild, etc). 
var d = document.createElement("div"); 
// continue from here. 


this.gInitBarDrag = function() 
{ 
    alert(this.variable2); 
}; 

$(d).observe("mousedown", this.gInitBarDrag.bind(this)); 

} 

いくつかの注意:結合して、観察はJSフレームワークなしで簡単に多少実装することができます。 このコードはテストされていません。

0

オブジェクトにthis点次に、オブジェクトのプロパティとしての機能を定義する場合:

するvar myObjectという= {FOO:真、バー:関数(){{doStuff((this.foo)場合); }};

thisがオブジェクトを返すコンストラクタ関数で使用される場合、返される新しいオブジェクトにはthisがバインドされます。投稿したコードにthisを使用している場合、thisはJavaScriptの不良部分の1つであるグローバルスコープを指しています。

だから、ここで私はこれに近づくだろう方法は次のとおりです。

function GanttChart(gContainerID) { 
    var chart = { 
    variable1: "lol", 
    variable2: "hai dere", 
    variable3: "cometishian", 
    containerId: gContainerID, 
    gInitBarDrag: function(){ 
     alert(this.variable2); 
     } 
    } 
    return chart; 
} 
myChart = new GanttChart("chart1"); 
document.getElementById(myChart.containerId).innerHTML += "<div id=\"gBar" + i + "\" class=\"gBar\" onmousedown=\"myChart.gInitBarDrag();\">Hello</div>"; 

私はオブジェクトを返すコンストラクタ関数は大文字で、慣例によりなぜなら資産計上さガントチャート機能を変更しました。