2011-03-31 94 views
3

我需要jQuery来更改所有页面中的数字。例如,我想改变1比1,所以我试着这样说:JQuery更改所有元素文本

$("*").each(function(){ 
    $(this).html( $(this).html().replace(1,"۱") ); 
}) 

但这种情况将会改变CSS规则和属性也。是否有任何技巧来逃避CSS和属性?

+0

为什么'each'?这应该做到:'$('*')。text(function(i,text){return text.replace(1,“1”);});' – 2011-03-31 01:09:12

+0

@Felix'text()'重写破坏子元素:http://jsfiddle.net/GaHvH/ – 2011-03-31 01:33:36

+0

@SimeVidas:对......昨天晚了;) – 2011-03-31 08:13:22

回答

9

这不是一份工作,jQuery的自然融入。而不是让jQuery获取所有元素的扁平列表,递归遍历DOM树,搜索文本节点以执行替换。

function recursiveReplace(node) { 
    if (node.nodeType == 3) { // text node 
     node.nodeValue = node.nodeValue.replace("1", "۱"); 
    } else if (node.nodeType == 1) { // element 
     $(node).contents().each(function() { 
      recursiveReplace(this); 
     }); 
    } 
} 

recursiveReplace(document.body); 

看到它在行动here

+0

如果你执行'else if ...',你可以省略'return'语句... – 2011-03-31 01:42:56

+0

@Šime谢谢。习惯于在递归函数中包含一个“if-return”块。 – 2011-03-31 01:45:27

+0

糟糕的是,ES5的'forEach'在NodeLists上不起作用。否则,我们可以完成'node.childNodes.forEach(...)'并从等式中完全删除jQuery。 – 2011-03-31 01:55:24

1

没有看到您的代码的实际例子很难提供一个很好的答案,但我会尽我所能。

这是我会做的。我想包你所有的页码与一个特定的ID,这样的标签...

<span class="pageNumber">1</span> 
... 
<span class="pageNumber">n</span> 

然后这里是jQuery的...

你可以在递增值循环来计算页面,或其他任何你想要的!

希望帮助,
spryno724

+0

绝对是最好的方法,如果你控制HTML的生成(只需在这些跨度上使用class而不是id)。 – 2011-03-31 01:45:01

+0

出于好奇,为什么要使用类而不是ID? – 2011-03-31 01:55:39

+0

,因为ID必须是唯一的;) – 2011-03-31 02:46:37

2

试试这个:

$("body *").each(function() { 
    if (this.childElementCount > 0) { return; } 
    $(this).text(function(i, v) { return v.replace('1','۱'); }); 
}); 

更新:没有工作...