2017-04-04 7 views
0

プロパティの中に動的にロードされたDOM要素があるクラスを作成しています。この流れの非常に簡単な概要:Javascriptで構築した直後にオブジェクトメソッドを呼び出す

  1. ウィンドウがロードされている
  2. クラス SomeClassのオブジェクトが
  3. サムシング(DOM要素を動的にAJAXを使用してロード(2.1)いくつかの属性、および(2.2)で)作成され
  4. window.addEventListener("load",function(){ // Step 1 
        someObject = new someClass("element_id") // Step 2.1 
        someObject.loadToDOMThroughAJAX(function(){ // Step 2.2 
         someObject.optionalMethodAfterConstruction(); // Step 3 
        }); 
    }) 
    
    :これらのDOMエレメントの特性を有する任意に

このように(変換など)行われます10

編集:optionalMethodAfterConstruction()ためのスニペット:

someClass.prototype.optionalMethodAfterConstruction = function(){ 
    var element = this.element.querySelector(".someClass") 
    element.setAttribute("transform","translate(20,20)") 
} 

EDIT2:loadDOMThroughAjax()ためのスニペット:

someClass.prototype.loadDOMThroughAjax= function(){ 
    obj = this; 
    var ajax = new XMLHttpRequest(); 
    ajax.open("GET", "/path/to/html", true); 
    ajax.send(); 
    ajax.onload = function(e) { 
    obj.element.innerHTML = ajax.responseText 
    } 
} 

しかしながら、ステップ3が実行された場合、DOM要素がまだステップ2.2にロードされていません成功したdocument.querySelector()コールに依存しているため、手順3が失敗します。クラス.someClassのDOM要素は動的に読み込まれ、そのメソッドが呼び出されるときに存在するはずですが、そうではありません。手動でメソッドを呼び出すと機能します。

私は近くにいるように感じていますが、これを正しく行う方法と欠けていることを知りたいと思います。

コンストラクタ自体をコンストラクタにアタッチすることはできません。コンストラクタはすべてのオブジェクトに適用する必要があります。

jQueryはありません。

+0

'loadToDOMThroughAJAX'がコールバックを持っているようです、そのコールバックが機能していない場合は、その関数が何をしているかを知るために関数をポストする必要があります。 – adeneo

+0

これは、 'querySelector' がライブではないためです。 https://developer.mozilla.org/en/docs/Web/API/Document/getElementsByClassNameの代わりに 'getElementsByClassName'を試してください – Tareq

+0

あなたのコードに何か問題があるかどうかは、あなたが私たちに提示しなければそれを教えてください。 – JLRishe

答えて

1

2番目の編集から、実際にステップ2.2でパラメータとして送信する関数を呼び出さないことがわかります。次のように

someObject.loadToDOMThroughAJAX(function(){ // Step 2.2 
    someObject.optionalMethodAfterConstruction(); // Step 3 
}); 

しかし、あなたの機能は次のとおりです。

someClass.prototype.loadDOMThroughAjax= function(){ 
    obj = this; 
    var ajax = new XMLHttpRequest(); 
    ajax.open("GET", "/path/to/html", true); 
    ajax.send(); 
    ajax.onload = function(e) { 
    obj.element.innerHTML = ajax.responseText 
    } 
} 

またthuslyあなたのonload関数のパーなどのパラメータを呼び出す必要があります:

someClass.prototype.loadDOMThroughAjax= function(CALLBACK){ 
    obj = this; 
    var ajax = new XMLHttpRequest(); 
    ajax.open("GET", "/path/to/html", true); 
    ajax.send(); 
    ajax.onload = function(e) { 
    obj.element.innerHTML = ajax.responseText 
    if (someConditionIsTrue) { 
     CALLBACK(); 
    } 
    } 
} 
+0

ありがとう、私はメソッド内でコールバック呼び出しを追加し、 'ajax.onload'に配置しなければなりませんでした。今すぐ完璧に動作します!そのプロセスのコールバックについて多くのことを学びました。乾杯! –

関連する問題