jQuery变量赋值后replace操作失效问题求助
问题
我写了一段jQuery代码,想实现点击按钮后清理文本并粘贴到两个不同的textarea里,还要对截取的内容做差异化清理。但把txt变量的值传给txtq和txte后,针对<blockquote>的格式化replace操作没生效,实际输出和预期不符,请问问题出在哪?
代码如下:
$(document).on('ready', function() { $('.quoteMsg').click(function() { var txt = $(this).closest('.replyBox').find('.replyMsg').html().trim(); var txtau = $(this).closest('.replyBox').find('.replyMsgau').text().trim(); txt = txt.replace(/(?:\r\n|\r|\n)/g, ' '); txt = txt.replace(/<p class="c0">/gi, ''); txt = txt.replace(/<\/p>/gi, ''); txt = txt.replace(/&lt;/g, "<"); txt = txt.replace(/&gt;/g, ">"); txt = txt.replace(/&amp;/g, "&"); txt = txt.replace(/&quot;/g, '"'); txt = txt.replace(/&#039;/g, "'"); var txtq = txt; //无法将完整值传递给txtq变量 //txtq = txt; //同样无效 txtq = txt; txtq = txt.replace(/<blockquote>/gi, ''); txtq = txt.replace(/<\/blockquote>/gi, '[hr][i]' + txtau + '[/i]: '); var txte = txt; //无法将完整值传递给txte变量 //txte = txt; //同样无效 txte = txt.replace(/<blockquote>/gi, '[quote]'); txte = txt.replace(/<\/blockquote>/gi, '[/quote]\n'); txte = txt.replace(/<blockquote>/gi, ''); $("textarea[name='tresckomentapisz']").val('[quote]' + txtq + '[/quote]\n' + txtau + ', '); $("textarea[name='editkomtxt']").val(txte); }); });
预期输出:
console.log(txtq + '|' + txte + '|' + txt);//[hr][i]etc[/i] | [quote]\n
实际输出:
console.log(txtq + '|' + txte + '|' + txt);//<blockquote>|<blockquote>|
问题分析与解决
核心问题是每次replace操作都直接基于原始的txt变量,而非前一步处理后的txtq/txte变量,导致之前的替换结果完全被覆盖,相当于只执行了最后一次replace。
具体问题点:
- 处理
txtq时:你将txt赋值给txtq后,后续两次replace都用txt.replace(...),相当于每次都从原始txt重新处理,之前对txtq的修改根本没保留。 - 处理
txte时:同样的逻辑错误,三次replace全基于原始txt,前两次的替换结果完全没被用到,最后只执行了txt.replace(/<blockquote>/gi, ''),自然得不到预期效果。
修正后的代码:
$(document).on('ready', function() { $('.quoteMsg').click(function() { var txt = $(this).closest('.replyBox').find('.replyMsg').html().trim(); var txtau = $(this).closest('.replyBox').find('.replyMsgau').text().trim(); // 统一处理txt的基础格式化 txt = txt.replace(/(?:\r\n|\r|\n)/g, ' '); txt = txt.replace(/<p class="c0">/gi, ''); txt = txt.replace(/<\/p>/gi, ''); txt = txt.replace(/&lt;/g, "<"); txt = txt.replace(/&gt;/g, ">"); txt = txt.replace(/&amp;/g, "&"); txt = txt.replace(/&quot;/g, '"'); txt = txt.replace(/&#039;/g, "'"); // 处理txtq:基于自身逐步修改 var txtq = txt; txtq = txtq.replace(/<blockquote>/gi, ''); txtq = txtq.replace(/<\/blockquote>/gi, '[hr][i]' + txtau + '[/i]: '); // 处理txte:基于自身逐步修改 var txte = txt; txte = txte.replace(/<blockquote>/gi, '[quote]'); txte = txte.replace(/<\/blockquote>/gi, '[/quote]\n'); txte = txte.replace(/<blockquote>/gi, ''); $("textarea[name='tresckomentapisz']").val('[quote]' + txtq + '[/quote]\n' + txtau + ', '); $("textarea[name='editkomtxt']").val(txte); }); });
本质就是把txt.replace(...)改成txtq.replace(...)和txte.replace(...),让每一步替换都基于已经处理过的变量值,而非每次都回到原始txt重新处理。
内容的提问来源于stack exchange,提问作者Maksior
相关产品推荐
相关产品推荐

