【问题标题】:Greasemonkey: look for a string between two elements [closed]Greasemonkey:在两个元素之间寻找一个字符串 [关闭]
【发布时间】:2012-10-08 15:53:47
【问题描述】:

我正在编写一个 Greasemonkey 脚本,它应该做一件简单的事情:如果在 <h2> 元素(页面上总是只有一个)和第一次出现的 <h3> 元素(可以是其中几个或根本没有),然后......(我已经完成了这部分)。

如果有条件的帮助,我将不胜感激。

【问题讨论】:

  • 这部分我已经完成了-那么问题是什么?
  • 至少,显示您正在谈论的 HTML 结构。第一个<h3> 是嵌套的吗?是兄弟姐妹吗?还有什么?

标签: javascript greasemonkey string-matching


【解决方案1】:

现在我恰好熟悉 Mikhail 正在编写的代码。

基本结构是

<div>
<div>
<h2>Something</h2>
<td>We want to search for the string here</td>
<td>We want to search for the string here</td>
</div>

<div>
<h3>Something else</h3>
<td>May contain the same string, but we are only interested if it contains in previous div .</td>
<td>May contain the same string, but we are only interested if it contains in previous div .</td>
</div>
</div>

字符串不是 h2 的子字符串,所以我认为 getElementsByTagName 不会起作用。不幸的是,实际上有数百个具有相同类 ID 的 div 层。在这种特殊情况下,标题是代码中唯一的唯一细节。所以在我看来,最好的方法是先找到 h2,去它的父级并将文本存储为字符串。然后在文本中搜索字符串。像这样的...

<script>
var searcharea = jQuery('h2').parent('div').text();
var searchstring = "superstring";
if( searcharea.indexOf( searchstring ) != -1 )
    alert("exchange alert to your own things");
</script>

至于h3,它可能存在也可能不存在,但由于它不是兄弟,所以这并不重要。 :) 感谢大家抽出宝贵时间回答我们的问题。

【讨论】:

    【解决方案2】:
    var masterString = document.body.innerHTML;
    var start = masterString.indexOf('<h2>'); 
    var end = masterString.indexOf('<h3>'); // Will find the position of first occurance of h3 - if any
    
    if (end <0)
    // there is no h3
    else {
      var searchMe = masterString.substr(start,end);  // now this is the portion of your HTML body that you want to look for a string match
      var numberOfOccurances = searchMe.match(/yourString/g);
    }
    

    【讨论】:

    • jQuery 不是这个问题的一部分,您也没有展示如何将它添加到 GM 脚本中(这不是给新的脚本编写者的)。因此,更改该 1 行。那么,这个答案可能是问题描述模糊的最好答案,所以+1。 ...但是,如果代码是大写(&lt;H2&gt;)等会发生什么? ;-)
    • 如果节点有属性会怎样? EG &lt;H2 class="chapterHead"&gt; 或者如果有一个&lt;h3&gt; before &lt;h2&gt;?
    • 你说得对。在很多情况下,这将无法完成工作或会产生问题,因为它会解析 html 源代码。但在某些情况下,这可能是一个快速而肮脏的解决方案。
    【解决方案3】:

    你试过getElementsByTagName吗?

    【讨论】:

    • 是的,我相信这是我应该使用的。不幸的是,我对 JavaScript 有非常基本的了解,所以如果你能详细说明... :-)
    【解决方案4】:
    //get all the H2 elements
    var h2 = document.getElementsByTagName("h2");
    
    //Just in case there are more than one...
    for(var i = 0; i < h2.length; i++){
     //check for the certain string
     if(h2[i].textContent == "SOME TEXT"){
      //get the first h3 element and do something...
      var h3 = document.getElementsBtTagName("h3")[0]; //first occurrence of H3
      //DO SOMETHING
    }
    

    https://developer.mozilla.org/en-US/docs/DOM/Node.textContent

    https://developer.mozilla.org/en-US/docs/DOM/element.getElementsByTagName

    【讨论】:

      猜你喜欢
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多