2012-11-06 46 views
3

我是JavaScript新手,與鴨打字概念有點混淆。據我所知,我理解了這個概念。但是這在我的思想中導致了一個奇怪的後果。我將用以下示例來解釋:檢查JavaScript中是否存在屬性

我目前正在使用jQuery Mobile開發移動Web應用程序。有一次,我捕獲了一個畫布的vmousedown事件。我對觸摸的壓力感興趣。我發現了Touch.webkitForce屬性。

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

對於Chrome使用Remote Debugging時,此工作正常。但在Opera Firefly中測試時會引發異常,因爲originalEvent屬性不是觸摸事件,而是點擊事件。

因此,每次訪問一個不屬於我的權限的對象的屬性時,我是否必須檢查存在和類型?

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

所以每次我訪問一個不屬於我的權限的對象的屬性,我是否必須檢查存在和類型?

是的,你將不得不檢查整個路徑,一旦在同一時間,也可以自動執行它:

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 
+0

我喜歡你的答案,但有什麼辦法,不使用字符串,但簡單的'object.property'符號? –

+0

@ Angelo.Hannes然後你需要使用'try,catch'作爲[at] Prodigy的答案:http://stackoverflow.com/a/13248964/887539 – andlrc

1

使用try catch

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

由於您使用特定的框架來捕捉您的事件,我認爲您應該假設原始事件是總是定義。 如果不是,那麼拋出一個錯誤可能是一件好事,因爲在事件捕獲的某個地方出現明顯錯誤。

然而,該事件可能是一個的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 
}