如果网页的正文区域是唯一可访问的部分,是否有办法使用内联JavaScript或其他内联函数语言删除特定文本短语的所有实例(用HTML编写)?
这在许多情况下都很有用,比如人们使用Tiny.cc/customurl并希望删除声明为“tiny.cc /”的部分
如果允许使用详细信息,我们将使用Tiny.cc修改日历插件以创建自定义URL(tiny.cc/customurl)。该插件默认显示完整的URL,因此我们要删除文本“tiny.cc/”并在代码中保留“customurl”部分:
<div class="ews_cal_grid_custom_item_3">
<div class="ews_cal_grid_select_checkbox_clear" id="wGridTagChk" onclick="__doPostBack('wGridTagChk', 'tiny.cc/Baseball-JV');" > </div>
tiny.cc/Baseball-JV
</div>
我们要删除的部分是第3行的http://tiny.cc/
。
答案 0 :(得分:1)
要做到这一点而不替换所有HTML(破坏所有事件处理程序)并且不进行递归(通常更快),您可以这样做:
function removeText(top, txt) {
var node = top.firstChild, index;
while(node && node != top) {
// if text node, check for our text
if (node.nodeType == 3) {
// without using regular expressions (to avoid escaping regex chars),
// replace all copies of this text in this text node
while ((index = node.nodeValue.indexOf(txt)) != -1) {
node.nodeValue = node.nodeValue.substr(0, index) + node.nodeValue.substr(index + txt.length);
}
}
if (node.firstChild) {
// if it has a child node, traverse down into children
node = node.firstChild;
} else if (node.nextSibling) {
// if it has a sibling, go to the next sibling
node = node.nextSibling;
} else {
// go up the parent chain until we find a parent that has a nextSibling
// so we can keep going
while ((node = node.parentNode) != top) {
if (node.nextSibling) {
node = node.nextSibling;
break;
}
}
}
}
}
此处的演示演示:http://jsfiddle.net/jfriend00/2y9eH/
要在整个文档中执行此操作,您只需调用:
removeText(document.body, "http://tiny.cc/Baseball-JV");
答案 1 :(得分:0)
只要您能以字符串格式提供数据,就可以使用正则表达式为您执行此操作。
您可以解析body标签的整个 innerHTML,如果这是您可以访问的全部内容。这是一种缓慢且有点不好的练习方法,但出于解释的缘故:
document.body.innerHTML = document.body.innerHTML.replace(
/http:\/\/tiny\.cc\//i, // The regular expression to search for
""); // Waht to replace with (nothing).
整个表达式包含在正斜杠中,因此正则表达式中的任何正斜杠都需要使用反斜杠进行转义。
这适用于在regexp中具有特殊含义的其他字符,例如句点。单个句点(.
)表示匹配“任意”字符。要匹配期间,必须对其进行转义(\.
)
编辑:
如果您希望在onclick中保留对URL的引用,则可以在单引号内修改regexp以使其不匹配(作为示例):
/([^']http:\/\/tiny\.cc\/[^'])/i
答案 2 :(得分:0)
如果您不想在HTML中替换该字符串的所有实例,则必须以递归方式迭代节点结构,例如:
function textFilter(element, search, replacement) {
for (var i = 0; i < element.childNodes.length; i++) {
var child = element.childNodes[i];
var nodeType = child.nodeType;
if (nodeType == 1) { // element
textFilter(child, search, replacement);
} else if (nodeType == 3) { // text node
child.nodeValue = child.nodeValue.replace(search, replacement);
}
}
}
然后你抓住相应的元素,并在其上调用此函数:
var el = document.getElementById('target');
textFilter(el, /http:\/\/tiny.cc\//g, ""); // You could use a regex
textFilter(el, "Baseball", "Basketball"); // or just a simple string