使用jQuery更新每个()循环中HTML字符串的属性

使用jQuery更新每个()循环中HTML字符串的属性,jquery,Jquery,我有一个试图更新属性的HTML字符串,但似乎看不到更改。以下是一个简化的示例: 该如何编写,以便使用更改更新源?这应该可以正常工作,但您需要重新将html分配给字符串,或者附加到DOM,因为更改在这里没有任何效果,因为选择器不是DOM元素,而是字符串 var source = '<html><head></head><body><img src="abc" /><img src="abc" /></body>&l

我有一个试图更新属性的HTML字符串,但似乎看不到更改。以下是一个简化的示例:


该如何编写,以便使用更改更新源?

这应该可以正常工作,但您需要重新将html分配给字符串,或者附加到DOM,因为更改在这里没有任何效果,因为选择器不是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();

请注意,不要使用显式。如第二个示例中所示,您可以使用attr的函数参数。

这应该可以正常工作,但您需要重新将html分配回字符串或附加到DOM,因为更改不会产生任何效果,因为选择器不是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();

请注意,不要使用显式。每个函数都可以使用attr的函数参数,如第二个示例所示。

Jquery在幕后使用元素数组。在您的示例中,这个数组在伪代码中类似于['html'],这意味着您只有一个元素html。当您使用过滤器时,该数组将删除与选择器不匹配的所有元素。例如,如果您有这样一个元素列表:['div',img',div',img'],使用您的原始代码

var only_images = $(source).filter('img');
将导致['img','img']删除所有'div'标记。也就是说,由于您的示例只有一个元素['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');
});

Jquery在幕后使用一组元素。在您的示例中,这个数组在伪代码中类似于['html'],这意味着您只有一个元素html。当您使用过滤器时,该数组将删除与选择器不匹配的所有元素。例如,如果您有这样一个元素列表:['div',img',div',img'],使用您的原始代码

var only_images = $(source).filter('img');
将导致['img','img']删除所有'div'标记。也就是说,由于您的示例只有一个元素['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');
});

谢谢你的回复,你给了我一些希望。当我使用您的示例并查看source的最终值时,我确实看到图像属性已经更改。唯一的问题是,图像周围的所有HTML都消失了,即使我从filter切换到find,我也只能看到img标记。正如我在回答中所说,HTML解释器会去掉body标记之外的任何内容,包括body标记本身。您的文档中只能有1个html元素和1个正文,这些元素是在页面加载时创建的。@user1090698您能解释一下为什么需要在文档中添加html、head、body标记吗?@user1090698据我所知,您不能用jquery创建html、head、body元素,您看到的是一个字符串。因此,如果您需要它们,请将它们附加到.html的结果中。@user1090698这里有一个小提琴,您可以用这种方式来代替。谢谢您的回复,您给了我一些希望。当我使用您的示例并查看source的最终值时,我确实看到图像属性已经更改。唯一的问题是,图像周围的所有HTML都消失了,即使我从filter切换到find,我也只能看到img标记。正如我在回答中所说,HTML解释器会去掉body标记之外的任何内容,包括body标记本身。您的文档中只能有1个html元素和1个正文,这些元素是在页面加载时创建的。@user1090698您能解释一下为什么需要在文档中添加html、head、body标记吗?@user1090698据我所知,您不能用jquery创建html、head、body元素,您看到的是一个字符串。因此,如果您需要它们,请将它们附加到.html的结果中。@user1090698这里有一个提琴,您可以用这种方式来代替。感谢您的回复,关于filter和find之间差异的解释非常好。问题是,即使使用find,在代码执行之后,我也看不到源代码的更新值。我运行了您的原始代码。看起来HTML解释器去掉了所有不在body标记之间的内容。这意味着$source最终是['img','img'],因此find将不起作用,因为它只查看子元素,而不查看原始元素。然而,话虽如此,你的
原始代码似乎工作正常。我很好奇,是什么让你认为src没有被更新?我对jQuery还是相当陌生,所以我可能遗漏了一些明显的东西,但这里有一个我看到的例子。我明白问题所在。源是文本形式的原始标记。哎呀,太快按enter键了。让我很快为你做一把小提琴。谢谢你的回复,关于过滤器和查找的区别的解释非常好。问题是,即使使用find,在代码执行之后,我也看不到源代码的更新值。我运行了您的原始代码。看起来HTML解释器去掉了所有不在body标记之间的内容。这意味着$source最终是['img','img'],因此find将不起作用,因为它只查看子元素,而不查看原始元素。然而,话虽如此,您的原始代码似乎运行良好。我很好奇,是什么让你认为src没有被更新?我对jQuery还是相当陌生,所以我可能遗漏了一些明显的东西,但这里有一个我看到的例子。我明白问题所在。源是文本形式的原始标记。哎呀,太快按enter键了。让我很快为你做一个提琴。因为听起来它可能会有所帮助,所以我尝试做的是下载网页的源代码,对其进行一些更新,然后在iframe中显示它。所以我基本上是在更新iframe之前对HTML进行一些更改。我可以用字符串函数来完成这一切,但jQuery会更简单、更健壮。我正试图做的就是在另一个网站上下载网页的源代码,并在我的网站上的iframe中显示它。为了使它看起来正确,我需要使所有的相对路径img,脚本,样式等绝对指向原始站点。这些更新需要在头部、身体等部位进行。因此我希望能够将其他网站网页的源代码作为字符串,对其进行操作,然后将其放入我网站的iframe中。因为这听起来可能会有所帮助,所以我试着下载网页的源代码,对其进行一些更新,然后在iframe中显示它。所以我基本上是在更新iframe之前对HTML进行一些更改。我可以用字符串函数来完成这一切,但jQuery会更简单、更健壮。我正试图做的就是在另一个网站上下载网页的源代码,并在我的网站上的iframe中显示它。为了使它看起来正确,我需要使所有的相对路径img,脚本,样式等绝对指向原始站点。这些更新需要发生在头部、身体等部位。因此我希望能够将其他网站网页的源代码作为字符串,对其进行操作,然后将其放入我网站的iframe中。