2

まずJavaScriptコードを見てみましょう=>

function ConstructNodes(className,hiddenId,alertMsg,formName){
    this.className = className;
    this.hiddenId  = hiddenId;
    this.alertMsg  = alertMsg;
    this.formName  = formName;
}

ConstructNodes.prototype.getId = function(){
    var nodes = document.getElementsByClassName(this.className);
    for (var i=0;i<nodes.length;i++){
        nodes[i].onclick = function(){
            var r = confirm(this.alertMsg);
            if (r==true){
                alert(this.hiddenId); // undefined
            } else {
                return;
            }
        };
    }
};

var obj = new ConstructNodes("className","hiddenId","Are you sure ?","formName");
obj.getId();

この状況での私の問題は、定義されたオブジェクトがgetIdの無名関数で定義されていないことです。どうすればこの状況を解決できますか?ありがとう

4

3 に答える 3

4

thisあなたのコードは、それがイベントハンドラー内の「ConstructNodes」オブジェクトを参照すると誤って想定しています。そうではありません。それが要素になります。代わりにthis、オブジェクトに保存すると、状況が改善されます。

ConstructNodes.prototype.getId = function(){
    var nodes = document.getElementsByClassName(this.className), obj = this;
    for (var i=0;i<nodes.length;i++){
        nodes[i].onclick = function(){
            var r = confirm(obj.alertMsg);
            if (r==true){
                alert(obj.hiddenId); // undefined
                document.getElementById(obj.hiddenId).value = this.id;
                alert(obj.hiddenId);
            } else {
                return;
            }
        };
    }
};

(あなたが何をしようとしているのかはまったく明確ではないので、まだいくつかの問題があるかもしれません。)

于 2012-08-22T22:07:30.497 に答える
1

あなたの質問を理解するのに1分かかりました。

thisgetIdの無名関数で参照することはできません。thisたとえばvar me = this無名関数の外部の変数に保存してから、を使用する必要がありますme.hiddenId

これは、それを実証するためのJSFiddleです。

于 2012-08-22T22:06:00.290 に答える
1

そのような機能でundefinedはアクセスできないからです。thisすべての関数はそれ自体の実行コンテキストで呼び出されるためthis、その場合は関数の外部とは異なります。

次のように、外側のスコープでを定義varし、内側のスコープでそれにアクセスすることで、これを解決できます。

function ConstructNodes(className,hiddenId,alertMsg,formName){
  this.className = className;
  this.hiddenId  = hiddenId;
  this.alertMsg  = alertMsg;
  this.formName  = formName;
}

ConstructNodes.prototype.getId = function() {
  var _this = this; // a reference that will be known in your closure/function
  var nodes = document.getElementsByClassName(this.className);
  for (var i = 0; i < nodes.length; i++) {
    nodes[i].onclick = function(){
      if (confirm(_this.alertMsg)) {
        alert(_this.hiddenId); // no longer undefined
      } else {
        return;
      }
    };
  }
};

var obj = new ConstructNodes("className", "hiddenId", "Are you sure?", "formName")
obj.getId();
于 2012-08-22T22:13:25.973 に答える