2015-04-15 14 views
9

Điều này khiến tôi bối rối. Tôi muốn xóa dấu "+" khỏi phần tử label. Đây là HTML:Xóa ký tự khỏi giữa một chuỗi: mà không xóa phần tử bên trong

<label class="option" for="edit-attributes-21-33"> 
<input type="radio" id="edit-attributes-21-33" name="attributes[21]" 
value="33" checked="checked" class="form-radio"> 4 oz, +$15.00</label> 

tôi bắt đầu với điều này

$(".option").each(function(index, value) { 

$(this).text($(this).text().replace("+", "")); 

}) 

này loại bỏ dấu "+" nhưng sẽ loại bỏ các yếu tố đầu vào. Vì vậy, sau đó tôi đã thử:

$(".option").each(function(index, value) { 

var oldString = $(this).html(); 
var newString = oldString.replace("+", ""); 
console.log(oldString, newString); 
$(this).text(newString); 

}) 

Điều này tạo chuỗi ký tự html chính xác, nhưng đó là chuỗi và được chuyển ngược lại DOM theo cách đó. Tôi đã nhìn thấy một bài đăng khác có cùng vấn đề, nhưng không có giải pháp.

+0

liên quan nhưng không hoàn toàn trùng lặp: http://stackoverflow.com/questions/4106809/how-can-i-change-an-elements-text-without-changing-its-child -elements –

+0

Tôi không chắc chắn những gì bạn có ý nghĩa bởi các yếu tố đầu vào là tước ra? Đưa ra một ví dụ về những gì nó là ban đầu, những gì nó sẽ trở thành sau khi mã hiện tại, và những gì bạn muốn nó làm. Ví dụ: Bản gốc: 'Abc + 123 + 456' phải là 'Abc 123 + 456' nhưng mã này trả về' Abc 123 456' – Nitroware

Trả lời

6

Bạn có thể đạt được những gì bạn muốn sử dụng mã của bạn bằng cách sử dụng .html() thay vì .text():

$(".option").each(function(index, value) { 
    var oldString = $(this).html(); 
    var newString = oldString.replace("+", ""); 
    console.log(oldString, newString); 
    $(this).html(newString); 
}); 

Đây là JQuery .html() phương pháp ref: https://api.jquery.com/html/

Đây là Fiddle: https://jsfiddle.net/Darkseal/1c572Luw/

Tôi cũng đã sửa đổi một chút thẻ kết thúc <input> của bạn để làm cho thẻ XHTML tuân thủ.

+2

Điều này trông khá giống với khối mã thứ 2 từ câu hỏi. Bạn đã thay đổi gì? –

+0

Tại sao lại là downvote? Giải pháp này hoạt động hoàn hảo. Nó sử dụng '.html()' thay vì '.text()'. – melancia

+0

Ông đã sử dụng '.text()' thay vì '.html()'. Tôi chỉ cố định mã nhiều hơn viết lại để anh ta có thể hiểu được sự khác biệt và sau đó thu nhỏ nó trong một lớp lót như '$ (". Tùy chọn "). Html ($ (". Option "). Html(). Replace ("+", "")) 'hoặc một cái gì đó tương tự. Tôi thực sự không hiểu downvote, câu trả lời của tôi là chính xác. – Darkseal

4

Điều bạn đang tìm kiếm được gọi là mã văn bản. Tôi đưa cho nhãn của bạn một ID để làm cho nó dễ dàng hơn, nhưng priciple vẫn giữ nguyên cho selectors khác:

var node = document.getElementById("example").childNodes[2]; 
node.nodeValue = node.nodeValue.replace("+", ""); 

With a simple demo.
Bạn nên cố gắng sử dụng JS đơn giản như nhiều như bạn có thể ủng hộ trong jQuery. JS đơn giản thường nhanh hơn jQuery nhiều.

Sau khi nhận xét, if you don't know the exact position of the textnode, check this.

+1

Nếu anh ta không biết chính xác vị trí của textNode thì sao? – jmartins

+1

Đã cập nhật câu trả lời. – Martijn

+1

Giải pháp tuyệt vời chỉ sử dụng 'Vanilla Javascript'. – melancia

0

Câu trả lời trễ, chỉ nhằm mục đích hiển thị một cách tiếp cận khác sử dụng jQuery.

Tại đây, bạn sẽ giữ trạng thái input và sẽ không có nguy cơ thay thế ký tự mà bạn không muốn. Giả sử bạn đã sử dụng + ở một nơi khác, không chỉ trên văn bản label.

$(function() { 
    $('label.option').each(function() { 
     var label = $(this); 
     var input = $('input.form-radio', this); 
     var text = label.text(); 

     // Clean up the label contents. 
     label.empty();   

     // Replace the char occurrences. 
     text = text.replace(/\+/g, ""); 

     // Append both the input and the modified text. 
     label.append(input).append(text);   
    }); 
}); 

Demo

+0

Bạn có thể xóa hoàn toàn' tách'. Dòng tiếp theo thiết lập văn bản thành trống là đủ –

+0

Rất đúng, tôi đã cập nhật câu trả lời. – melancia

Các vấn đề liên quan