【问题标题】:appendedHow do I extract the text from a (dynamic) div, by class name, using a userscript?appended如何使用用户脚本按类名从(动态)div 中提取文本?
【发布时间】:2017-12-26 02:42:45
【问题描述】:

如何使用 JavaScript 从以下对象中提取值 2083236893?

<div class="gwt-Label">2083236893</div>

我为 Firefox 52.2.1(32 位)安装了 Greasemonkey 3.17,并测试了提供的每个代码示例,但都失败了。

var html = document.getElementsByClassName("gwt-Label")[0];
alert(html.innerHTML);

以上例子来自:Accessing Div, by class name, with javascript

是否应该在完整下载网页时运行代码?

附加:

var elements = document.getElementsByClassName("gwt-Label")[0];
alert(elements.innerHTML);

如果上述情况可能会失败

elements.length = 0

可能是文档未完全加载或查询结果 = 0 - 没有 DIV 对象包含查询字符串中的类名

Firebug 可以为文档(浏览器中的 HTML 版本)中的选定对象(innerHTML 或 innerTEXT)生成 XPath,让您验证查询中的类名是否正确且存在。

为 timeout 设置更大的值可能会让 HTML 文档被完全加载,以使您的脚本通过 Greasemonkey 或类似的插件运行,从而通过以下方式给出正确的结果

console.log(HTMLCollection.length) 

见上文。

【问题讨论】:

    标签: javascript class greasemonkey userscripts tampermonkey


    【解决方案1】:

    class="gwt-Label" 在 HTML 中强烈暗示该页面是由 Google Web Toolkit 驱动的——这意味着该页面是 AJAX 驱动的,静态技术(如其他一些答案)将不起作用。

    使用 AJAX 感知技术,例如 waitForKeyElements()。这是一个完整的脚本,它会将gwt-Label 值打印到浏览器控制台。 (Ctrl Shift I 打开所说的控制台。):

    // ==UserScript==
    // @name     _Print gwt-Label text
    // @match    *://YOUR_SERVER.COM/YOUR_PATH/*
    // @match    https://stacksnippets.net/js*
    // @require  https://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 (".gwt-Label", printNodeText);
    
    function printNodeText (jNode) {
        console.log ("gwt-Label value: ", jNode.text ().trim () );
    }
    

    如果有多个标签,这将打印每个标签。

    注意 waitForKeyElements 采用 jQuery 选择器。



    可以测试上面的脚本,方法是使用 Greasemonkey、Tampermonkey、Violentmonkey 或类似工具安装它,然后运行这个 sn-p:

    var lblbNum = 0;
    function addLableLine () {
        lblbNum++;
        $("body").append(`<div class="gwt-Label">New label: ${lblbNum}</div>`);
    }
    setInterval (addLableLine, 1333);  // New line every 1.3 seconds.
    .gwt-Label {display: inline-block;}
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="gwt-Label">2083236893</div>

    然后你会看到:

    gwt-标签值:2083236893 gwt-标签值:新标签:1 gwt-标签值:新标签:2 ETC...

    在浏览器控制台中。

    【讨论】:

    • 感谢您的出色回答。我还需要 2 个月的时间才能找到正确的答案。顺便说一句,我在 Greasemonkey 或控制台中运行您的脚本。我得到: ReferenceError: waitForKeyElements is not defined [Learn More] ,GM 没有计算出 gwt-Label 的值
    • 它不会按原样从控制台运行。但它确实从 Greasemonkey/Tampermonkey 运行。 完全按原样安装上面的脚本,但将@match 行更改为您的网站。它会起作用的。如果没有,请提供指向目标页面的链接。
    • 更新了脚本以完全按照原样运行,用于答案中的模拟 ajax 页面。如果它没有在您的目标页面中运行(在更改匹配线之后),那么您没有告诉我们的是问题所在。链接到您的目标页面。
    • 在 Greasemonkey 中没有生成值。在 Tampermonkey 中创建的脚本,启用,从菜单选项“没有脚本正在运行”
    • “没有脚本正在运行”在哪个页面上?如果它是您的目标页面,那么您没有设置@match 正确。给我们一个指向目标页面的链接。如果是 this 页面,请确保完全按照上述方式安装脚本。然后在单击“运行代码 sn-p”按钮之前,您不会看到它显示为正在运行。
    【解决方案2】:

    如果你想在 jQuery 中使用 .text() 可能会更容易!

    查看此链接:http://api.jquery.com/text/

    这应该选择你的文本:

    $(window).load(function(){
        $(".gwt-Label").text();
    });
    

    【讨论】:

    • 谢谢。上面的代码在 Fiddle fiddle.jshell.net/tfyssyqb 中运行良好,在 Greasemonkey 中失败。顺便说一句,为什么在我单击按钮之前执行代码?
    • 由于我没有看到 jQuery,你可以使用 .textContent,它的香草 JS 版本。是的,它不受 IE8 及以下版本的支持,但应该无关紧要
    • 你准备好迎接挑战了吗?我想从srv1.yogh.io/#mine:height:0这个地方提取块头数据并保存到文件中,从0到向上递增高度。
    • 我可以问一个问题吗?
    猜你喜欢
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多