我正在尝试访问以下页面的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.js
从appsTableData
构造,因此我需要在此之后执行我的代码。我有一个工作代码修改表中的一些东西,所以它确实意味着jQuery在我的脚本执行时运行。但是,GM_getValue("appsTableData", [])
仍会产生undefined
。
我猜这是一个范围问题,但我仍然觉得这很奇怪,因为这是GM_getValue
的目的。有什么想法解决这个问题吗?
答案 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);
}