2011-08-31 70 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脚本?