且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

将空格替换为& nbsp;

更新时间:2022-10-14 22:00:07

  $('p')。contents ).filter(function(){
return this.nodeType == 3 //文本节点
})每个(function(){
this.data = this.data.replace / / g,'\\\ ');
});

DEMO


Let's assume the following element (look for the trailing and leading spaces):

<p>
    <span class="item">Lorem Ipsum is simply dummy text </span><span class="item">of the printing and typesetting</span><span class="item"> industry.</span>
</p>

I want to replace all spaces with &nbsp;, due to display: inline-block weird behavior shown here: http://jsfiddle.net/SQuUZ/ (dunno about all browsers, but latest Chrome and Firefox both act the same).

Now, since javascript is an option here, so is jQuery, I could:

$('p').text($('p').text().replace(/ /g, '&nbsp;'));

But it escapes the &nbsp; and turns out into a&nbsp;mess&nbsp;of&nbsp;entities.

Obviously, for such purposes we could use $('p').html():

$('p').html($('p').html().replace(/ /g, '&nbsp;'));

But this one is even worse, because, it also adds &nbsp; within the tags themselves:

<p>
    <span&nbsp;class="item">Lorem&nbsp;Ipsum&nbsp;is&nbsp;simply&nbsp;dummy&nbsp;text&nbsp;</span><span&nbsp;class="item">of&nbsp;the&nbsp;printing&nbsp;and&nbsp;typesetting</span><span&nbsp;class="item">&nbsp;industry.</span>
</p>

<!-- TL;DR -->
<span&nbsp;class="item"></span> <!-- is actually invalid... -->

And it breaks everything...

Notes:

  • There won't only be <span> elements with class item inside the container (that may also not always be <p>).
  • Slow regular expressions is an option (the problem is, I cannot come up with one...).

What options do I have here?

Update:

In fact, could anyone explain why there is such a bug with that multi-line / single-line display: inline-block;? (See fiddle link above, and examine...)

Question migrated to display: inline-block; weird spacing behavior

$('p').contents().filter(function(){
    return this.nodeType == 3 // Text node
}).each(function(){
    this.data = this.data.replace(/ /g, '\u00a0');
});

DEMO