5

我正在为 CasperJS 编写脚本。我需要单击包含“1”跨度的链接。在 jQuery 中可以使用:contains('1'),但纯 Javascript 中的选择器的解决方案是什么?

HTML:<a class="swchItem"><span>1</span></a><a class="swchItem"><span>2</span></a>

jQuery 变体:$('a .swchItem span:contains("1")')

UPD CasperJS 代码:

casper.then(function () {
    this.click('a .swchItem *select span with 1*')
})
4

4 回答 4

7

0.6.8开始,CasperJS 提供了XPath 支持,所以你可以这样写:

var x = require('casper').selectXPath;

casper.then(function() {
    this.click(x('//span[text()="1"]'))
})

希望这可以帮助。

于 2012-05-22T15:56:14.280 回答
1
var spans = document.getElementsByTagName('span'),
    len = spans.length,
    i = 0,
    res = [];

for (; i < len; i++) {
    if (spans.innerHTML == 1) res.push(spans[i]);
}

除非浏览器支持本机 css 查询,否则您必须这样做。

于 2012-04-13T11:00:02.760 回答
1

试试下面的。我的答案和 gillesc 的答案之间的区别在于,我只获得了a带有您指定的类名的标签,因此如果a页面上有更多没有该类的标签,他的回答可能会产生意想不到的结果。这是我的:

var aTags = document.getElementsByTagName("a");
var matchingTag;

for (var i = 0; i < aTags.length; i++) {

    if (aTags[i].className == "swchItem") {
        for (var j = 0; j < aTags[i].childNodes.length; j++) {
            if (aTags[i].childNodes[j].innerHTML == "1") {
                matchingTag = aTags[i].childNodes[j];
            }
        }
    }
}
于 2012-04-13T11:11:11.580 回答
1

jQuery 是 JavaScript。还有许多选择器引擎可供选择。

如果你想从头开始,你可以使用 querySelectorAll 然后寻找合适的内容(假设内容选择器没有实现),如果不可用,实现你自己的。

这意味着通过标签名称获取元素,过滤类,然后寻找具有匹配内容的内部跨度,因此:

// Some helper functions
function hasClass(el, className) {
  var re = new RegExp('(^|\\s)' + className + '(\\s|$)');
  return re.test(el.className);
}

function toArray(o) {
  var a = [];
  for (var i=0, iLen=o.length; i<iLen; i++) {
    a[i] = o[i];
  }
  return a;
}

// Main function
function getEls() {

    var result = [], node, nodes;

    // Collect spans inside A elements with class swchItem
    // Test for qsA support
    if (document.querySelectorAll) {
      nodes = document.querySelectorAll('a.swchItem span');

    // Otherwise...
    } else {

      var as = document.getElementsByTagName('a');
      nodes = [];

      for (var i=0, iLen=as.length; i<iLen; i++) {
        a  = as[i];

        if (hasClass(a, 'swchItem')) {
          nodes = nodes.concat(toArray(a.getElementsByTagName('span')));
        }
      }
    }

    // Filter spans on content
    for (var j=0, jLen=nodes.length; j<jLen; j++) {
      node = nodes[j];

      if ((node.textContent || node.innerHTML).match('1')) {
        result.push(node);
      } 
    }
    return result;
}
于 2012-04-13T12:33:30.117 回答