2015-06-01 177 views
1

我有一個函數,將點擊觸發(使用jQuery)。Javascript變量無法訪問

我不明白爲什麼以下不起作用,並顯示undefined

var testFunc = function(event) { 
    var data  = event.data; 
    var category = data.category; 
    var action = data.action; 
    var label = data.label; 

    console.debug(data); 
    // prints: 
    // {'category': 'CCC', 'action': 'AAA', 'label': 'LLL'} 

    console.debug(data.category); 
    // prints: undefined 

    console.debug(category); 
    // prints: undefined 

    console.debug(data[category]); 
    // prints: undefined 
}; 
$(document).ready(function() { 
    $('.test').on('click', function() { 
     var jsonData; 
     try { 
      jsonData = JSON.parse($(this).data('test')); 
     } 
     catch (e) { 
      // I guess here is the problem: 
      jsonData = $(this).data('test'); 
      // ..but why JSON.parse doesn't work 
     } 

     try { 
      testFunc({ data: jsonData }); 
     } catch (e) { 
     } 
    }); 
}); 

HTML:

<a href="about:blank" target="_blank" class="test" 
    data-test="{'category': 'CCC'}">click event triggered here</a> 

如何訪問event.data.category?

FIDDLE:http://jsfiddle.net/ytqp45wj/

+0

你能在小提琴中重放嗎? – tymeJV

+1

'typeof'數據是什麼? –

+0

數據是一個普通的對象,還是一些實現toString不同的結構? – phtrivier

回答

2

event.data是你的小提琴中的字符串。

這是因爲您的data-test字段中的JSON無效。 因此,在解析它時傳入異常處理程序,並使用String本身。

(好像你不能在JSON使用單引號,根據http://jsonlint.com/

如在別處指出的,裏面的數據屬性解決的事情,你可以使用雙引號。

請注意,data[category]將無法​​正常工作,所以您仍然得到undefined

+0

Tricky!通過更改引號解決它像'data-test ='{「json」:「val」}'' – DanFromGermany

0

要訪問嵌套的對象屬性使用[]符號,例如:

event['data']['category'] 
+4

沒有理由爲什麼你應該使用括號符號而不是點符號,除非在var名稱中有空格 – inorganik

0

這應該工作:

var testFunc = function(event) { 
    var data  = event.data; 
    var category = data.category; 
    var action = data.action; 
    var label = data.label; 

    console.debug(data); 
    // prints: 
    // {'category': 'CCC', 'action': 'AAA', 'label': 'LLL'} 

    console.debug(data.category); 
    // prints: CCC 

    console.debug(category); 
    // prints: CCC 

    console.debug(data[category]); 
    // prints: undefined 
}; 

testFunc({data: {'category': 'CCC', 'action': 'AAA', 'label': 'LLL'}}); 

小提琴:http://jsfiddle.net/t5xhrbna/

你可能沒有了預期的對象輸入。

0
'use strict'; 

var event = {data:{ 
    category: 'CCC', 
    action:'AAA', 
    label: 'LLL' 
}}; 


var testFunc = function(event) { 
    var data = event['data']; 
    var category = event['data']['category']; 


    console.debug(data); 
    console.debug(category); 

    //get keys for every data entry 
    Object.keys(data).forEach(function(key){ 
     console.log(key, data[key]); 
    }); 
}; 

testFunc(event); 

JSFiddle

你需要有一個有效的JSON對象,所以你需要使用JSON對象來訪問它。

+0

請不要發佈「僅限代碼」的答案。 – DanFromGermany

+0

我對我的帖子做了一個安慰。 – Felix

2

您的JSON數據格式不正確。您需要爲鍵值使用雙引號。

<a href="about:blank" target="_blank" class="test" data-test='{"category": "CCC", "action": "AAA", "label": "LLL"}'>click event triggered here</a>