2012-05-07 12 views
5

Ben bir arama yapmaya çalışıyorum ve aynı sözcüğün tüm örnekleriyle değiştirin, .contains() kullanarak büyük/küçük harfe duyarlı olmamakla birlikte, çalışmıyor ve öyle görünüyor. hassas.Jquery Ara ve Değiştir w/.contains

<p>some text</p> 
<p>Some Text</p> 
<p>Some TEXT</p> 


jQuery.expr[':'].Contains = function(a, i, m) { 
     return jQuery(a).text().toUpperCase() 
      .indexOf(m[3].toUpperCase()) >= 0; 
     }; 
     jQuery.expr[':'].contains = function(a, i, m) { 
     return jQuery(a).text().toUpperCase() 
      .indexOf(m[3].toUpperCase()) >= 0; 
     }; 


     $('p').filter(":contains('some text')").each(function(){ 
      $(this).text($(this).text().replace("some text", "replace with new text")); 
     }); 

Bunun nedeni sadece burada js keman örneğin bakabilirsiniz aynı dava birinci, metni değiştirir http://jsfiddle.net/ka82V/

cevap

1

olduğu gibi aşağıda gibi deneyin. , eşleşmesi olsa bile, bir değişiklik yapmadı çünkü "bazı metinler" argümanı diğer durum değişkenleriyle uyuşmuyor. Ancak, jQuery'nin :contains seçicisini bu şekilde geçersiz kılmak iyi bir fikir olduğunu düşünmüyorum. İşlev tabanlı bir filtre kullanmak daha az koddur ve jQuery'yi de değiştirmez.

de örnek çalışma bakınız: http://jsfiddle.net/Y6bhS/1/

$('p').filter(function() { 
    return /some text/i.test($(this).text()); 
}).each(function(){ 
    $(this).text($(this).text().replace(/some text/i, "replace with new text")); 
}); 
+0

Bunu beğendim ve size katılıyorum, jQuery'yi geçersiz kılmamalıyız, bu kötü bir fikir olur. Ama bir sorum var, i.test ne için? – Kevin

+0

'.test', JavaScript'teki' RegExp' nesnesinde, argümana karşı düzenli ifadeyi çalıştıran (bu durumda '$ (this) .text()') bir yöntemdir ve eşleşip eşleşmediğine göre true veya false değerini döndürür. . Bu durumda 'RegExp' nesnesi aslında bir değişmezdir (tıpkı bir" dize "bir 'String' nesnesidir):'// text/i'. “I” kısmı büyük/küçük harf duyarsız olduğunu söyler. –

+0

@ChrissPratt Teşekkür ederim, RegExp'i henüz öğrenmedim, sanırım bu yüzden aramayla ilgili bir sorunla karşılaştım ve yerini aldım, fakat çalışıyorum, çok teşekkür ederim – Kevin

2

Aslında 'yerini tutamaz: İşte ne var şimdi bir koddur 'Bu büyük/küçük harfe duyarlı oldu. yerine regex:

text().replace(/some text/i, "replace with new text"));

DEMO Sen içerenhttp://jsfiddle.net/ka82V/1/

+0

+1 sorunun temel nedenini işaret için. –

+0

@KyleMacey +1 Çok teşekkür ederim Kyle! Bunu anlayamadım – Kevin

2

iyi görünüyor. .filter kullanmanın amacı ama nasıl yerine edildi sahip, zincire

için

DEMO sorunu orijinal eşleşen değildi

jQuery.expr[':'].containsCI = function(a, i, m) { 
    return jQuery(a) 
     .text() 
     .toUpperCase() 
     .indexOf(m[3].toUpperCase()) >= 0; 
}; 

$('p').filter(":containsCI('some text')").text(function() { 
    return $(this).text().replace(/some text/i, "replace with new text"); 
}); 
+0

Eğer OP, TÜM metin elemanını değiştirmek istemiyorsa? –

+0

@KyleMacey Aynı değiştirme kodunu dönüşün içine yazabilir. Orijinal yazılarında olduğu gibi güncellendi. –

1
jQuery.expr[':'].Contains = function(a, i, m) { 
    return new RegExp(m[3], 'ig').test(jQuery(a).text()); // case insensitive replace 
}; 
jQuery.expr[':'].contains = function(a, i, m) { 
    return new RegExp(m[3], 'ig').test(jQuery(a).text()); // case insensitive replace 
}; 

$('p').filter(":contains('some text')").each(function() { 
    $(this).text($(this).text().replace(new RegExp($(this).text(), 'i'),"replace with new text")); 
});