1

属性を更新しようとしている HTML 文字列がありますが、変更が反映されていないようです。簡単な例を次に示します。

var source = '<html><head></head><body><img src="abc" /><img src="abc" /></body></html>';

$(source).filter('img').each(function () {
    $(this).attr('src', '123');
});

// At this point if I look at source in a debugger 
// I'd expect to see the src attributes as all being 
// '123', but I still see them all as 'abc'. 

ソースが変更で更新されるようにするには、これをどのように記述する必要がありますか?

4

2 に答える 2

2

これは正常に機能するはずですが、セレクターはDOM要素ではなく文字列であるため、ここでは変更が影響しないため、htmlを文字列に再度割り当てるか、DOMに追加する必要があります。

var source = '<html><head></head><body><img src="abc" /><img src="abc" /></body></html>';
     var $source = $(source);
     $source.filter('img').each(function () {
             $(this).attr('src', '123');
        });
    console.log($source.wrapAll($('<div/>')).parent().html()); 
    //or
    source = $source.wrapAll($('<div/>')).parent().html();

フィドル

またはただする

 $(source).filter('img').attr('src', function () {
      return '123';
   }).appendTo('someselector');

デモ

明示的な .each を使用する代わりにattr、2 番目の例のように関数引数を使用できることに注意してください。

于 2013-07-08T04:31:25.420 に答える
2

Jquery は、要素の配列をバックグラウンドで使用します。あなたの例では、この配列は(疑似コードで)のように見えます['html']。つまり、要素が1つしかないことを意味します(html)。フィルターを使用すると、セレクターに一致しないすべての要素がこの配列から削除されます。たとえば、次のような要素のリストがある場合: ['div', 'img', 'div', 'img']、元のコードを使用して

var only_images = $(source).filter('img');

すべてのタグ['img', 'img']が削除されることになります。'div'そうは言っても、あなたの例には要素が1つしかない['html']ため、結果は空の配列になり[]ます。

ただし、このfindメソッドはすべての子孫で一致するものを検索します。つまり、文字列内のすべての要素が照合されますimg(元の親要素を除くhtml)。

うまく説明できたかどうかはわかりませんが、最終的に必要なことは、コードを切り替えてfindメソッドの使用を開始することです。以下のコード例:

var source = '<html><head></head><body><img src="abc" /><img src="abc" /></body></html>';

$(source).find('img').each(function () {
    $(this).attr('src', '123');
});
于 2013-07-08T04:46:16.353 に答える