好的,所以,有几件事。假设这theElements
是一个 HTML 元素数组,则each
是不必要的。但情况似乎并非如此,因为您说正在显示(如果是 HTML 元素数组,element22
您编写的代码只会element0
一遍又一遍地创建)。theElements
所以显然theElements
是一个数组数组,或者一个 jQuery 对象数组。鉴于它的名字,这很奇怪,但让我们通过吧。
正如其他人所提到的,您每次迭代都会覆盖文本,这很糟糕。构建一个字符串稍微好一点,但是你仍然在做重复的字符串连接,这很慢。如果我们必须这样做,我们应该附加到一个数组,然后在最后将它连接在一起(这样更快,因为附加到一个字符串每次都会从头开始创建整个字符串)。
var css = [];
for (var i = 0; i < theElements.length; i++) {
$(theElements[i]).not('.responsive-wrap').each(function(i) {
var theWidth = $(this).width();
$(this).addClass('element' + i);
css.push('.element' + i + ' {max-width: ' + theWidth + 'px;}');
});
}
$("#dynamicStylesheet").text(css.join('\n'));
现在,这行得通,并且会做你想做的事。但这几乎绝对不是做你想做的任何事情的正确方法。在客户端动态构建 CSS 并不好,除非您正在编写类似 CSS 编辑器的东西。有很多更简单的方法可以解决导致您走上这条道路的任何问题。
如果创建客户端样式表绝对重要,那么也有更好的方法来做到这一点。创建一个适用于所有元素的 CSS 规则theElements
(哇,看看那句话)。如果它们是随机选择的,这是不可能的,但如果你通过一些逻辑查询找到它们,你可以在 CSS 中使用相同的查询。
就[i]
事情而言——我不知道该告诉你什么。由于 JavaScript 对数组进行字符串化的奇怪方式,它们是等价的,如果i
对你不起作用,那么就有很大的问题。如果我是你,我会使用i.toString()
,但i
应该可以正常工作。
编辑
如果theElements
是标签名称数组,则可以简化为:
var tagNames = theElements; // clear variable names are important!
var css = [];
$(tagNames.join(',')).not('.responsive-wrap').each(function(i) {
var $this = $(this);
$this.addClass('element' + i.toString());
css.push('.element' + i.toString() + '{ max-width: ' + $this.width() + 'px; }');
});
$("#dynamicStylesheet").text(css.join('\n'));