2011-03-19 68 views
1

錨標記之後附上文字我有這樣的代碼:的jQuery之前和在不同跨度

<p>Hi. I am your friend. you are my friend.<br> we <a href="both.html">both</a> are friends.</p> 

我的目標是封閉的錨標記之前的文本以及之後的定位標記成單獨的跨度。因此,我想在DOM是這樣的:

<p><span>Hi. I am your friend. you are my friend.<br> we </span><a href="both.html">both</a><span> are friends.</span></p> 

任何人可以幫我,告訴我該怎麼辦呢jQuery的?

回答

3

從這個answer,你應該能夠做到像下面這樣:

$("p").contents().filter(function() { 
    return this.nodeType == Node.TEXT_NODE; 
}).wrap("<span/>"); 
+0

你只是做了它! thnx一百萬次...你只是讓我的一天!你很棒哦!! :)我欠你一個...... – 2011-03-19 16:53:43

+0

唯一的問題(這可能不是問題),你會在跨度外的'
'和三個跨度而不是兩個跨度。 – 2011-03-19 17:11:49

2

的問題是,之前或之後的內容你<a>可能有其他的DOM節點,所以他們不會最終會被簡單地TEXT_NODE s。這是一個更長的實現,但它實現了你的問題所述的結果。 You can view a demo on JSFiddle

$.fn.wrapSides = function() { 
    return this.each(function (index, el) { 
     var $parent = $(el).parent(), 
      contents = $.makeArray($parent.contents()), 
      before, after, i, matched, build = $(); 

     for (i = 0; i < contents.length; i++) { 
      if(contents[i] === el) { 
       before = contents.slice(0, i); 
       after = contents.slice(Math.min(contents.length - 1, i + 1), contents.length); 
       matched = contents.slice(i,i + 1); 
       break; 
      } 
     }; 

     if (before && before.length) { 
      build = build.add($("<span>").append(before)); 
     } 

     build = build.add(matched); 

     if (after && after.length) { 
      build = build.add($("<span>").append(after)); 
     } 

     $parent.html(build); 
    }); 
}; 

你只是把它你要充當分離器的標籤,所以你的情況這將是a

$("p a").wrapSides(); 
+0

非常感謝*非常感謝!正是我所需要的,這需要很長時間才能找到。 – blinry 2012-08-11 18:57:12