0

alt一致したすべてのテキストを別のテキストに置き換えたいのですが、そのテキストがorhref属性にある場合は置き換えたくありません。例:

<p>Hello world!</p>
<p><img src="hello.jpg" alt="Hello"/></p>
Hello

私のコード:

var replacepattern = new RegExp('Hello', 'gi');
newcontent = newcontent.replace(replacepattern, function(match, contents, offset, s) {
var link = 'demo.com'
    index++;
    if (link != '') {
        return '<a href="' + link + '">' + match + '</a>';
    } else {
        return match;
    }
});

テキストのみで完璧に機能します。img srcなどを除くテキストを一致させるにはどうすればよいaltですか?

4

1 に答える 1

2

jQuery 自体を使用して、置換を支援できます。

$(html)
    .contents()
    .filter(function() {
        return this.nodeType == 1 || this.nodeType == 3;
    }).each(function() {
        this.textContent = this.textContent.replace(replacepattern, 'whatever');
    });

テキスト ノードを の子として持つことは技術的に無効であるため、 の最後のオカレンスHelloは置き換えられないことに注意してください<body>

また、IE < 9 または 10 で動作するように変更する必要があります。基本的に、ブラウザはサポートすることが期待されていnode.textContentます:)

アップデート

問題はもう少し複雑でした。または、私の心がそれをより難しくしているのかもしれません。テキスト ノードを jQuery に置き換えるのは簡単ではないため、そのためにはいくつかの純粋な JS が必要です。

$('<div><p>Hello world!</p><p><img src="hello.jpg" alt="Hello"/></p>Hello</div>')
  .find('*')
  .andSelf()
  .each(function() {
    for (var i = 0, nodes = this.childNodes, n = nodes.length; i < n; ++i) {
      if (nodes[i].nodeType == 3) {
        var txt = nodes[i].textContent || nodes[i].innerText,
            newtxt = txt.replace(/Hello/g, 'Bye');
        if (txt != newtxt) {
          var txtnode = document.createTextNode(newtxt);
          this.replaceChild(txtnode, nodes[i]);
        }
      }
    }
})
  .end()
  .end()
  .appendTo('body');
于 2013-03-28T16:13:42.260 に答える