代码在控制台/暂存器中工作,但在Greasemonkey脚本中不起作用?

我正在尝试编写一个脚本,以便在Google Flights上增加地图。

我已经在Firefox的暂存器中使用了jQuery。 这个脚本正是我想要完成的:

$('div').filter(function(){ return $(this).css('width') == '648px' }).css({"width":"900px","height":"550px"}); 

但是当我将其粘贴到Greasemonkey脚本中时,它不起作用。 如果我添加一些console.logs来调试,我可以validation脚本是否正在运行并且filter是否正常工作,但它并没有修改CSS。 有任何想法吗?

有时你需要确保在加载页面之后执行脚本

 $(function(){ // YOUR CODE HERE }); 

您也可以尝试使用setTimeout并输入2sec(2000)

 var myfunc = function(){ // YOUR CODE HERE }; setTimeout(myfunc, 2000); 

由AJAX驱动的页面添加的内容通常在用户脚本运行后添加很长时间,因此脚本通常不会看到它。

你可以使用一个长的,固定的间隔,如Kursion的答案所示,但这有缺点:

  1. 选择延迟值是有问题的。 如果由于通常原因页面加载缓慢,则固定延迟可能不充分。
  2. 延迟更长时间仍然无法正常工作,并且会因为烦人的长时间而减慢/停止用户脚本。
  3. 一个非常动态的页面,一个setTimeout最多只能捕获第一个实例。 后续节点将被遗漏。

更好的方法是使用MutationObserver或像waitForKeyElements()这样的实用程序。
两者都有优点和缺点,但我发现waitForKeyElements更简单,更通用。 (披露:我写了。)

这是一个完整的用户脚本,显示了在动态网页上工作的因素代码:

 // ==UserScript== // @name _Fix div CSS on AJAX-driven pages // @match http://YOUR_SERVER.COM/YOUR_PATH/* // @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js // @require https://gist.github.com/raw/2625891/waitForKeyElements.js // @grant GM_addStyle // ==/UserScript== //- The @grant directive is needed to restore the proper sandbox. waitForKeyElements ("div", adjustSelectDivdimensions); function adjustSelectDivdimensions (jNode) { if (jNode.css('width') == '648px') { jNode.css( {"width": "900px", "height": "550px"} ) } }