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

Since 0.6.8, CasperJS offers XPath support, so you can write something like this:

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

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

Hope this helps.

于 2012-05-22T15:56:14.280 に答える
1

jQueryはジャバスクリプトです。代替手段として利用できるセレクターエンジンも多数あります。

最初からやりたい場合は、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 に答える
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 に答える