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

时间:2014-01-31 15:57:27

标签: javascript jquery greasemonkey tampermonkey

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

我已经在Firefox的暂存器中使用了jQuery。这个脚本完全符合我的目标:

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

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

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

  1. 选择延迟值是有问题的。如果由于通常原因导致页面加载缓慢,则固定延迟可能不充分。
  2. 延迟较长时间仍然无法正常工作,并且会在很长时间内减慢/停止用户脚本。
  3. 一个非常动态的页面,setTimeout最多只会捕获第一个实例。将丢失后续节点。
  4. 更好的方法是使用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"} )
        }
    }