GM_getValue在Greasemonkey

时间:2016-07-06 18:53:07

标签: javascript jquery scope greasemonkey

我正在尝试访问以下页面的appsTableData变量:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <!-- some css and metadata -->
    <script type="text/javascript" src="/static/jquery/jquery-1.8.2.min.js">
    </script>
    <script type="text/javascript" src="/static/jquery/jquery-ui-1.9.1.custom.min.js">
    </script>
    <script type="text/javascript" src="/static/dt-1.9.4/js/jquery.dataTables.min.js">
    </script>
    <script type="text/javascript" src="/static/yarn.dt.plugins.js">
    </script>
    <script type="text/javascript">
        $( function () {
            $( '#nav' ).accordion( {autoHeight: false, active: 0} );
            appsDataTable = $( '#apps' ).dataTable( {
                bStateSave: true, "fnStateSave": function ( oSettings, oData ) {
                    data = oData.aoSearchCols;
                    for( i = 0; i < data.length; i++ ) {
                        data[i].sSearch = ""
                    }
                    sessionStorage.setItem( oSettings.sTableId, JSON.stringify( oData ) );
                }, "fnStateLoad": function ( oSettings ) {
                    return JSON.parse( sessionStorage.getItem( oSettings.sTableId ) );
                }, bJQueryUI: true, sPaginationType: 'full_numbers', iDisplayLength: 20, aLengthMenu: [20, 40, 60, 80, 100], 'aaData': appsTableData, bDeferRender: true, bProcessing: true
                , aoColumnDefs: [
                    {'sType': 'string', 'aTargets': [0], 'mRender': parseHadoopID}
                    , {'sType': 'numeric', 'aTargets': [5, 6], 'mRender': renderHadoopDate}
                    , {'sType': 'numeric', bSearchable: false, 'aTargets': [9], 'mRender': parseHadoopProgress}], aaSorting: [[0, 'desc']]
            } ).fnSetFilteringDelay( 188 );
        } );
    </script>
    <div id="jsnotice" class="ui-state-error">
        This page will not function without javascript enabled. Please enable javascript on your browser.
    </div>
    <script type="text/javascript">
        $( '#jsnotice' ).hide();
    </script>
    </div>
    <table id="apps">
        <thead>
            <tr>
                <th class="id">
                    ID
                </th>
                <!-- etc -->
            </tr>
        </thead>
        <script type="text/javascript">
            var appsTableData = [ /*some array*/ ];
        </script>
        <tbody>
        </tbody>
    </table>
    </td>
    </tr>
    </tbody>
    </table>
</html>

但是,我无法通过以下GM代码来抓住它的价值:

// ==UserScript==
// @name        ...
// @namespace   ...
// @description ...
// @include     ...
// @updateURL   ...
// @downloadURL ...
// @version     2
// @grant       GM_getValue
// ==/UserScript==

document.body.onload = function() {
    console.log(GM_getValue("appsTableData", []));
}

我的真实代码使用document.body.onload但不是超时。使用此回调的原因是该表在加载页面时由jquery.dataTables.min.jsappsTableData构造,因此我需要在此之后执行我的代码。我有一个工作代码修改表中的一些东西,所以它确实意味着jQuery在我的脚本执行时运行。但是,GM_getValue("appsTableData", [])仍会产生undefined

我猜这是一个范围问题,但我仍然觉得这很奇怪,因为这是GM_getValue的目的。有什么想法解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

找到解决方案,为子孙后代留下答案。我发现您可以使用window访问该页面的unsafeWindow对象。您还需要@grant到您的脚本:

// ==UserScript==
// @name        ...
// @namespace   ...
// @description ...
// @include     ...
// @updateURL   ...
// @downloadURL ...
// @version     2
// @grant       unsafeWindow
// ==/UserScript==

document.body.onload = function() {
    console.log(unsafeWindow.appsTableData);
}