2015-11-12 56 views
2

以下罰款是代碼:什麼能在Greasemonkey的腳本停止運行Array.prototype.filter()運行在控制檯

function fil(val) { 
    console.log('fil'); // never written to console when run in greasemonkey 
    return true; 
} 
var temp = unsafeWindow.someobject; 
console.log(temp); // looks fine 
temp.filter(fil); // never happens in greasemonkey 

如果我上運行同樣的代碼(當然沒有unsafeWindow)它在螢火蟲控制檯輸出相同的對象就好了。可能是什麼原因?

編輯說明:在greasemonkey中運行時,字符串'fil'永遠不會寫入控制檯,該控制檯顯示fil()永遠不會被調用。另外,如果我執行類似console.log(temp.filter(fil));的操作,當代碼從greasemonkey運行時,我無法在控制檯中看到結果。 (雖然我知道它應該是因爲線上方告訴我temp存在和代碼運行到這一點

+0

你是什麼意思「它輸出很好」?你看到過濾的數組?螢火蟲控制檯會向你展示函數調用的結果,以方便使用,但這不是標準行爲,而如果你沒有明確要求你不會有任何輸出,你的代碼可以在greasemonkey中正常工作。 – Aaron

+0

console.log('fil')是要求輸出嗎? 「輸出很好」意味着我可以在控制檯中看到字符串'fil'(多次) – blues

+0

哦,從來沒有想過,我忽略了你的過濾函數,並且認爲你期望輸出過濾後的數組。我真的不知道,對不起。 – Aaron

回答

0

在我的情況下,在Firefox 45和Greasemonkey的3.7,此代碼工作正常:

// ==UserScript== 
// @name  Array.prototype.filter() test 
// @namespace http://stackoverflow.com/questions/33675675/ 
// @include  http://stackoverflow.com/questions/33675675/* 
// @version  1.0 
// @grant  none 
// ==/UserScript== 

function fil(val) { 
    console.log('fil'); // never written to console when run in greasemonkey 
    return true; 
} 
var temp = unsafeWindow.allowedHosts; 
console.log(temp); // looks fine 
temp.filter(fil); // never happens in greasemonkey 

和輸出:

Array [ "stackoverflow.com", "serverfault.com" ] 
fil 
fil 

但改變none,例如,在GM_getValue行:

// @grant  none 

只輸出:

Array [ "stackoverflow.com", "serverfault.com" ] 

這是因爲傳遞給@grantnone以外的任何值使沙箱,並從我所看到的,包裝的對象不支持採取​​回調函數作爲參數的方法。

您可以用上面鏈接中的兼容層替換一些GM_*權限。然後,您可以通過設置@grant none來禁用沙箱,並且您已全部設置。

但是,如果您需要原始功能,則可以使用[].filter.call(temp, fil)而不是temp.filter(fil),如註釋中所述。

+1

'[] .filter.call(temp,fil);'適用於我。這可能是[Aaron](http://stackoverflow.com/users/1678362/aar​​on)在[評論]中的含義(http://stackoverflow.com/q/33675675/1529630#comment55125157_33675675)。 – Oriol

相關問題