2011-08-31 71 views
1

我有一個腳本沒有在移動Twitter上執行的問題。我已經在包括FF5,FF8和FF9在內的許多Firefox版本上嘗試過。移動Twitter,Greasemonkey腳本不起作用

我已經使用了最新版本的Greasemonkey。現在我有FF9和GM 0.9.10。我在正常的twitter上執行腳本沒有任何問題,但在移動設備上它不起作用。也許與HTTPS有關?

下面是腳本:

// ==UserScript== 
// @name   Twitter Mobile 
// @namespace  http://www.test.com 
// @include  https://mobile.twitter.com/* 
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js 
// ==/UserScript== 

function MainLoop() { 

if(typeof unsafeWindow.jQuery == 'undefined') { 
    window.setTimeout(MainLoop, 100); 
    return; 
} 

var $ = unsafeWindow.jQuery; 

$(document).ready(function(){ 
      //do something here 
}); 
window.setTimeout(MainLoop, 2000); 
} 

MainLoop(); 

我曾嘗試一切可能。另外,檢查了@require替代品並嘗試了它們。我不知道它爲什麼拒絕執行。

回答

0

所有這一切MainLoop東西不是必需的,也強制錯誤的jQuery實例。

請執行下列操作:

  1. 切換回最新穩定版本的Firefox(目前版本6)。

  2. 刪除腳本// ==/UserScript==之後的所有內容,但//do something here部分除外。

    1. 請勿使用unsafeWindow.jQuery
    2. 你不需要任何$(document).ready調用; Greasemonkey默認在適當的時候執行。
    3. 刪除當前setTimeout()來電;他們是反生產力的。


  3. 更改@require指令:

    // @require http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js 
    


  4. 粘貼或鏈接到完整的腳本!當前腳本可能失敗的主要原因是它正在檢查AJAXed-in頁面上的某些內容。
    得到解決,與這樣的代碼:

    //--- This handles both page-load delays, and AJAX changes. 
    setInterval (function() { checkForTweetbox(); }, 500); 
    
    function checkForTweetbox() { 
        var tweetbox = document.querySelector ('div.tweet-box textarea'); 
        if (tweetbox) { 
         if (! tweetbox.weHaveProcessed) { 
          tweetbox.weHaveProcessed = true; 
          alert ('New tweet-box found!'); 
         } 
        } 
    } 
    

事實上,這個腳本工作得很好:

// ==UserScript== 
// @name   _mobile twitter 
// @include   https://mobile.twitter.com/* 
// @require   http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js 
// ==/UserScript== 

setInterval (function() { checkForTweetbox(); }, 500); 

function checkForTweetbox() { 
    var tweetbox = document.querySelector ('#message_text'); 
    if (tweetbox) { 
     if (! tweetbox.weHaveProcessed) { 
      tweetbox.weHaveProcessed = true; 
      tweetbox.value    = 'GM\'s jQuery version is: ' + $.fn.jquery; 
     } 
    } 
} 

如果您登錄到Twitter手機,它將預裝消息框中的推文(但不發送)。

+0

非常感謝代碼Brock。那麼checkForTweetbox裏面的代碼並不適用於我,但我用我的twitter代碼取代了它,它工作。上面的代碼,我沒有自己寫,除了操縱twitter的代碼。我從一個網站複製它。所以,我不知道它究竟做了什麼。雖然它曾經在twitter mobile上工作過,但它突然停止了。我真的很好奇,爲什麼這些代碼用於更早的工作,現在不工作。此外,它仍然在主推介上工作。再次感謝高效的代碼。 –

+0

它顯然停止工作,因爲Twitter手機停止使用 - 或改變了他們如何使用 - jQuery。 GM腳本使用了過於複雜和過於脆弱的方法。事實上,這個問題是爲什麼不以這種方式進行編碼的一個很好的實例。 (^_^) –

0

mobile.twitter.com返回其響應下面的HTTP標頭:

X-Content-Security-Policy: allow 'self'; img-src *.twitter.com *.twimg.com maps.google.com data:; media-src *.twitter.com *.twimg.com; style-src *.twitter.com *.twimg.com; frame-ancestors *.twitter.com; script-src *.twitter.com *.twimg.com api-secure.recaptcha.net; report-uri https://mobile.twitter.com/csp_violation_report 

此標頭定義一個Content Security Policy。這裏的重要部分是script-src *.twitter.com *.twimg.com api-secure.recaptcha.net,這會將此頁面上的腳本限制爲幾個域。來自其他域的腳本無法加載,甚至無法加載GreaseMonkey(如果打開錯誤控制檯,您將看到相應的警告)。

我建議你將jQuery粘貼到GreaseMonkey腳本中,而不是嘗試將它注入到網頁中。這會增加腳本的大小,但至少您可以可靠地使用它 - 並且不再需要等待jQuery加載。

附註:我猜測Twitter正在移動網站上測試CSP,它在影響較小的移動網站上也將其部署在主站點上。所以你的主站點的腳本也可能會很快停止工作。

+1

這是不正確的,Greasemonkey的'@ require'指令加載幾乎所有的腳本,從任何網站,就好上mobile.twitter.com。 OP也顯然沒有試圖注入任何東西。事實上,他錯誤地嘗試使用頁面的jQuery,但mobile.twitter.com要麼不使用jQuery,要麼掩蓋它。 (並且CSP會阻止在頁面範圍內調用'eval()'的東西。) –

+0

@Brock:我沒有想到CSP警告。 Greasemonkey嘗試注入該腳本並失敗 - 無論OP的代碼是否正確。 –

+0

任何警告都可能與'unsafeWindow.jQuery'有關,因爲頁面沒有可訪問的'jQuery'對象。這不是注射;在'unsafeWindow'下創建對象或創建'

  • 11. 的Greasemonkey腳本
  • 12. 在Greasemonkey中啓動用戶腳本
  • 13. 使用Google Apps腳本和Twitter API搜索Twitter句柄 - 不起作用
  • 14. jQuery腳本不起作用
  • 15. 腳本不起作用
  • 16. node.js腳本不起作用
  • 17. 腳本不起作用Phantomjs
  • 18. BundleConfig腳本不起作用
  • 19. Python腳本不起作用
  • 20. shell腳本不起作用
  • 21. OAuth與Python中的Twitter腳本不起作用
  • 22. Twitter基本授權不起作用?
  • 23. 從另一個腳本啓動一個腳本不起作用
  • 24. 使用的Greasemonkey腳本
  • 25. Twitter Typeahead.js與滾動不起作用
  • 26. gmail的greasemonkey腳本
  • 27. Greasemonkey腳本注入
  • 28. greasemonkey畫布腳本
  • 29. GreaseMonkey登錄腳本
  • 30. 保護Greasemonkey腳本?