【问题标题】:why the following jquery code does not work in tampermonkey为什么以下 jquery 代码在 Tampermonkey 中不起作用
【发布时间】:2014-11-10 06:00:09
【问题描述】:

我在http://www.thefreedictionary.com/abnormally 网站上有下面的代码要由 Tampermonkey 在 chrome 中执行

我在页面中单独尝试了它,它可以工作,但不能通过 Tampermonkey 工作。

代码如下:

// ==UserScript==
// @name       linkify span href
// @namespace  http://use.i.E.your.homepage/
// @version    0.1
// @description  enter something useful
// @match      http://www.thefreedictionary.com/*
// @require    http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js
// @copyright  2012+, You
// @grant      GM_log
// ==/UserScript==
//alert("hello");

jQuery(document).ready (Greasemonkey_main);

function Greasemonkey_main ()
{  
   alert("hjello");

   jQuery("span.hvr").each(function () { jQuery(this).wrap('<a href="/' + jQuery(this).text() + '" style="text-decoration:none;color:inherit" target="_blank"></a>')})
}

为了检查我也放了一个警报,警报有效,但不是 jquery 一行代码。

不知道为什么。请帮忙。

注意:

这一行代码是做什么的?

它只是将页面中的每个 span 标签都用一个锚标签包裹起来。

如何在该页面中试用该代码?

添加jQuery链接的脚本标签,然后从控制台执行那一行就可以了。

【问题讨论】:

  • 你检查你是否进入了每个循环?用 console.log 什么的?
  • 没有。但这并不意味着这条线是错误的。来证明它。将以下代码作为书签粘贴到加载的页面上 javascript:var jq = document.createElement('script'); jq.src = "//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"; document.getElementsByTagName('head')[0].appendChild(jq);然后执行 jQuery("span.hvr").each(function () { jQuery(this).wrap('')})它按预期工作..

标签: javascript jquery tampermonkey


【解决方案1】:

问题在于span.hvr 链接是动态生成的:当页面加载时,它们不存在,但稍后某个脚本会生成它们。

因此,为了让您的脚本正常工作,它应该首先等待span.hvr 元素出现,然后再进行任何进一步的操作。

以下修改后的脚本应该可以工作:

// ==UserScript==
// @name       linkify span href
// @namespace  http://use.i.E.your.homepage/
// @version    0.1
// @description  enter something useful
// @match      http://www.thefreedictionary.com/*
// @require    http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js
// @copyright  2012+, You
// @grant      GM_log
// ==/UserScript==
//alert("hello");

jQuery(document).ready(Greasemonkey_main);

function Greasemonkey_main ()
{  
    var isReady = jQuery("span.hvr").length > 0;

    if (!isReady) {
        setTimeout(Greasemonkey_main, 500);
        return;
    }

    jQuery("span.hvr").each(function () {         
        jQuery(this).wrap('<a href="/' + jQuery(this).text() + '" style="text-decoration:none;color:inherit" target="_blank"></a>')
    });
}

如果某些页面中可能没有span.hvr 元素,那么您应该使脚本更智能——例如,在 5-10 秒后停止重试。

【讨论】:

  • 是的。非常感谢。那行得通。我很困惑... jquery .ready 是否不能确保所有内容都已加载?所以脚本可以异步运行?
  • 所以你的意思是说加载了一个javascript文件,仅此而已,脚本可以在之后运行,这不会在jquery准备好?
  • jQuery.ready 在 DOM 准备好后立即触发。一个站点可能会在 DOM 准备好之后甚至之后运行自己的一些脚本。在这种情况下,thefreedictionary.com 正在运行一个脚本,该脚本会在您的脚本运行后创建 span.hvr 元素。因此,您的脚本应该在执行任何其他操作之前不断检查并等待 span.hvr 元素出现。
猜你喜欢
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2021-08-27
  • 1970-01-01
  • 2014-02-14
相关资源
最近更新 更多