3

私はJavaScriptを初めて使用し、ダックタイピングの概念と少し混乱しています。私の知る限り、私はその概念を理解しました。しかし、それは私の考えに奇妙な結果をもたらします。次の例で説明します。

私は現在、jQueryMobileを使用してモバイルWebアプリに取り組んでいます。ある時点vmousedownで、キャンバスのイベントをキャプチャします。タッチのプレッシャーに興味があります。物件を見つけましたTouch.webkitForce

$('#canvas').live('vmousedown', function(e){
    console.log(e.originalEvent.originalEvent.touches[0].webkitForce);
}

これは、Chromeのリモートデバッグを使用する場合に正常に機能します。originalEventただし、プロパティはタッチイベントではなく、クリックイベントであるため、OperaFireflyでテストするときに例外をスローします。

したがって、自分の権限下にないオブジェクトのプロパティにアクセスするたびに、存在とタイプを確認する必要がありますか?

if( e.originalEvent &&
    e.originalEvent.originalEvent &&
    e.originalEvent.originalEvent.touches && 
    e.originalEvent.originalEvent.touches[0] && 
    e.originalEvent.originalEvent.touches[0].webkitForce) {

    console.log(e.originalEvent.originalEvent.touches[0].webkitForce);
}

誰かが私のためにそれを明確にしてくれませんか?

4

3 に答える 3

4

自分の権限を持たないオブジェクトのプロパティにアクセスするたびに、存在と型を確認する必要があるのでしょうか?

はい、パス全体を一度に1回確認する必要があります。または、自動化することもできます。

function deepObject(o, s) {
    var ss = s.split(".");

    while( o && ss.length ) {
        o = o[ss.shift()];
    }

    return o;
}

var isOk = deepObject(e, "originalEvent.originalEvent.touches.0.webkitForce");

if ( isOk ) {
    // isOk is e.originalEvent.originalEvent.touches.0.webkitForce;
}

テストケース:

var o = {
  a: {
    b: {
      c: {
        d: {
          e: {
          }
        }
      }
    }
  }
}

var a = deepObject(o, "a.b.c");
var b = deepObject(a, "d");

console.log(a); // {"d": {"e": {}}}
console.log(b); // {"e": {}}
console.log(deepObject(o, "1.2.3.3")); // undefined
于 2012-11-06T10:11:36.670 に答える
1

トライキャッチを使う

$('#canvas').live('vmousedown', function(e) {
   try {
       console.log(e.originalEvent.originalEvent.touches[0].webkitForce);
   } catch(e) {
       console.error('error ...');
   }
}
于 2012-11-06T10:22:33.920 に答える
0

特定のフレームワークを使用してイベントをキャプチャしているため、originalEvent は常に定義されていると想定する必要があると思います。そうでない場合は、イベントのキャプチャのどこかで明らかに問題が発生したため、エラーをスローすることをお勧めします。

ただし、イベントはMouseEventまたはTouchEventである可能性があり、webkitForceプロパティがサポートされていない場合もあります。これらは、検出したいケースの種類です:

// assume that originalEvent is always be defined by jQuery
var originalEvent = e.originalEvent.originalEvent;
if (originalEvent instanceof TouchEvent) {  // if touch events are supported
  // the 'touches' property should always be present in a TouchEvent
  var touch = originalEvent.touches[0];
  if (touch) {
      if (touch.webkitForce) {
        // ...
      } else {
        // webkitForce not supported
      }
  }  // else no finger touching the screen for this event
} else {
   // probably a MouseEvent
}
于 2012-11-06T10:41:21.053 に答える