2009-11-16 63 views
1

我試圖用jQuery的data()函數來存儲和檢索元素上的數據。我想要檢索存儲在textarea中的數據,只要用戶輸入空格鍵。然而,每次我這樣做,我從data()得到undefinedGreaseMonkey中的jQuery數據()函數

現在,如果我在HTML中定義完全相同的Javascript ,它的工作方式與預期的相同。是否有一些「疑難雜症」到data(),使它無法在GreaseMonkey中工作?

這裏是的GreaseMonkey腳本:

(function(){ 
    //boilerplate greasemonkey to wait until jQuery is defined... 
    function GM_wait() 
    { 
    if(typeof unsafeWindow.jQuery == 'undefined') { 
     window.setTimeout(GM_wait,100); 
    } else { 
     var $ = unsafeWindow.jQuery; 
     $(function() { letsJQuery($); }); 
    } 
    } 
    GM_wait(); 

    function letsJQuery($) 
    { 
    //store the data initially 
    $('textarea[name=comment]').data('tst', 'abc'); 

    //retrieve the data on spacebar 
    $('textarea[name=comment]').live('keypress', function(e) { 
     if(e.which == 0x20) { //spacebar 
     alert("the stored data is: " + $(this).data('tst')); 
     return false; 
     } 
    }); 
    } 
})(); 

這裏是我的非常簡單的測試HTML文件:

<html> 
<head> 
<script type="text/javascript" 
    src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
</head> 
<body> 
<textarea name="comment"></textarea> 
</body> 
</html> 

這是我的問題的一個非常簡化的版本,當然。

回答

1

下面應該工作:

function letsJQuery($) 
    { 
    //store the data initially 
    var ta = $('textarea[name=longtext]').data('tst', 'abc'); 

    //retrieve the data on spacebar 
    ta.live('keypress', function(e) { 
     if(e.which == 0x20) { //spacebar 
     alert("the stored data is: " + ta.data('tst')); 
     return false; 
     } 
    }); 
    } 
+1

我很好奇:你能描述一下爲什麼這個代碼工作,並提交者的代碼不?他們看起來像他們應該做同樣的事情。 –

+1

在傳遞給live方法的函數內部,隱式變量顯然不能正確地運行jQuery數據方法(至少在Greasemonkey中)。有更多的調查要做,以確定爲什麼。一種可行的解決方案(至少在OP中給出的代碼示例)是使用來自一個變量的數據方法,該變量不在此函數內部基於此設置。我在這裏展示的是在方法之外的範圍。您也可以在函數內部設置ta var - 正好在警報線上方工作。 – micahwittman