これは一般的な問題であり、.innerHTML
またはを使用する回答に注意してください.html()
。これらは、ページの HTML (タグの一部を無効な文字列に置き換える) や、ページの機能に必要な孤立したイベント ハンドラーを破壊します。
堅牢なソリューションでは、DOM 手法を使用してテキスト ノードのみを変更します。
次の完全なスクリプトは、標準的なwrapTextWithElement()
関数を使用しています。この jsFiddle
でコードの動作を確認できます。
// ==UserScript==
// @name Wrapping/Coloring letters in an HTML page
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant GM_addStyle
// ==/UserScript==
//-- Use CSS, *not* inline styles to color/style things
GM_addStyle ( " \
span.coloredLetter { \
background: yellow; \
} \
" );
var letI_Wrapper = new wrapTextWithElement ('i', '<span class="coloredLetter">');
letI_Wrapper.wrap (document.body); // Here we wrap everything.
function wrapTextWithElement (targText, elemToWrapWith, bCaseSensitive) {
var self = this;
var bCaseSensitive = bCaseSensitive || false;
self.targRegEx = new RegExp ("(" + targText + ")", bCaseSensitive ? "" : "i");
self.elemToWrapWith = elemToWrapWith;
self.wrap = function (node) {
$(node).contents ().each ( function () {
if (this.nodeType === Node.ELEMENT_NODE) {
self.wrap (this);
}
else if (this.nodeType === Node.TEXT_NODE) {
var ndText = this.nodeValue;
if (self.targRegEx.test (ndText) ) {
var replaceNodes = $.map (
ndText.split (self.targRegEx),
function (phrase) {
if (self.targRegEx.test (phrase) ) {
/* The $(HTML, props) form does not work if the HTML
has attributes
var wrapped = $(self.elemToWrapWith, {text: phrase} );
*/
var wrapped = $(self.elemToWrapWith).text (phrase);
return wrapped.get ();
}
else {
if (phrase == "")
return null;
else
return document.createTextNode (phrase)
}
}
);
$(this).replaceWith (replaceNodes);
}
}
} );
};
}