をラップTest
すると、問題のHTMLがjavascriptによって追加されます。その場合、3つの基本的なアプローチがあります。
表示されたターゲット単語をラップするだけです。これは最も堅牢なアプローチです。詳細については、以下を参照してください。
多くの場合、問題のあるjavascript関数を後で書き直すことができます。例えば:
// ==UserScript==
// @name YOUR_SCRIPT_NAME
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// ==/UserScript==
function abcd () {
document.writeln('<div id="abc">');
document.writeln('<div class="Wrapper">');
document.writeln('<b>Test</b>');
...
}
var D = document;
var scriptNode = D.createElement ('script');
scriptNode.type = "text/javascript";
scriptNode.textContent = abcd;
var targ = D.getElementsByTagName('head')[0] || D.body || D.documentElement;
targ.appendChild (scriptNode);
abcd ()
うまくいけば、実行される前に、
の邪悪なバージョンを置き換えます。
ロード後、実行前にそのノードをインターセプトしようとすることができ<script>
ます(スクリプトが実行されたら、ソースを変更しても効果はありません)。
これはFirefoxで可能です。それを行うGreasemonkeyコードについては、この回答を参照してください。ただし、この場合はそのアプローチをお勧めしません。
CDATAは、これらのアプローチのいずれの要因でもありません。
表示されるターゲットテキストを折り返す:
waitForKeyElements()ユーティリティを使用して、対象のノードが表示されたときにそれをキャッチします。ページのJavaScriptを分析したり、何かを壊す可能性のある変更について心配したりする必要はありません。
HTMLを壊したり、イベントリスナーを破棄したりせずに、一般的なDOMアプローチを使用してターゲットテキストをラップします。この場合、それはwrapTextWithElement
オブジェクトです。
jQueryを使用すると、すべてがより簡単で明確になります。
これが完全なスクリプトです。このデモページに対してテストすることもできます。
// ==UserScript==
// @name YOUR_SCRIPT_NAME
// @include http://fiddle.jshell.net/gH4nV/*
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change introduced
in GM 1.0. It restores the sandbox.
*/
waitForKeyElements ("div.Wrapper", emboldenTheWordTest);
function emboldenTheWordTest (jNode) {
var testWrapper = new wrapTextWithElement ('Test', '<b>');
testWrapper.wrap (jNode);
}
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) ) {
var wrapped = $(self.elemToWrapWith, {text: phrase} );
return wrapped.get ();
}
else {
if (phrase == "")
return null;
else
return document.createTextNode (phrase)
}
}
);
$(this).replaceWith (replaceNodes);
}
}
} );
};
}