好吧,这是一个微笑的问题,我被困住了。我试图创建一个HTML文本框,在提交时,文本被抛入一个函数并检查是否有任何链接。如果有链接,它将被包装在锚标记中并制作成可点击链接。
所以我得到了那个部分,但我创建了一个编辑功能。因此,当在评论上按下编辑按钮时,会显示带有创建的评论的弹出窗口。注释的值(取自XML文件)放在此编辑文本区域的值中。但是链接的价值仍然有锚标签,所以它看起来非常混乱。
我正在尝试创建一个运行此注释的函数,并删除所有锚标记,并且只有锚标记中的剩余文本。
简单的例子,当用户使用www.stackoverflow.com等链接发布评论时,它将保存在我的XML文档中,如下所示:
<a href="www.stackoverflow.com">www.stackoverflow.com</a>
如果用户在开头使用http://发布链接,它也适用。
我现在正试图将链接恢复为以前的正常文本。
以下是我的两个功能。第一个,convertLink
完美无缺。 convertLinkEdit
试图恢复这个过程,但我没有运气。
function convertLink(text) {
var words = text.split(' ');
var newText = '';
for (var i = 0; i < words.length; i++) {
var word = words[i];
if (word.indexOf('http://') === 0) {
word = '<a href=" ' + word + ' ">' + word + '</a>';
} else if (word.indexOf('www.') === 0) {
word = '<a href=" http://' + word + '" >' + word + '</a>';
}
newText += word + ' ';
}
return newText;
}
function convertLinkEdit(text) {
var words = text.split(' ');
var newText = '';
for (var i = 0; i < words.length; i++) {
var word = words[i];
if (word.indexOf('href=') === 0) {
//if index of finds "href=", it means a link is coming up
//Therefore, since everything is split at blank spaces,
//after the next blank space will be the current text that needs saving
}
newText += word + ' ';
}
return newText;
}
在我的非工作函数内部是关于我认为应该如何完成的评论,尽管我不确定如何实现。
答案 0 :(得分:2)
实际上,DOM非常聪明,可以为您解析链接到文本,因此您只需使用this (link to jsFiddle):
function convertLinkEdit(text) {
// simply create an empty <p> element
var dummy = document.createElement('p');
// change it's HTML contents to the comment one
dummy.innerHTML = text;
// return the TEXT value of our <p>
return dummy.textContent || dummy.innerText; // we first look up textContent* (newer browsers) and fall back to innerText (older browsers) if needed
}
* 有关textContent的信息,请查看此处:https://developer.mozilla.org/en-US/docs/DOM/Node.textContent
我不知道上面的浏览器兼容性,所以,here is (link to jsFiddle) RobG的变体应用于你的功能:
function convertLinkEdit(text) {
var dummy = document.createElement('p');
dummy.innerHTML = text;
var links = dummy.getElementsByTagName('a');
for (var i = 0, l = links.length; i < l; i++)
{
var link = links[i];
var node = document.createTextNode(link.textContent || link.innerText);
link.parentNode.replaceChild(node, link);
}
return dummy.textContent || dummy.innerText;
}
仅供参考:您应始终使用DOM及其用于解析/操作HTML的API。强烈建议不要使用正则表达式进行HTML解析 是的,它可能在某些情况下有效,但你无法控制它,因为它无法正确区分属性,元素和DOM附带的所有其他混乱。
http://jsfiddle.net/2b8uz/5/这是更新版本。
问题是,正如plaxl已经指出的那样,getElementsByTagName
和任何其他getElement..
家庭成员将返回一个Live对象的NodeList。一旦NodeList中的元素发生变化,它就会自动更新。
我添加了一个小片段borrowed from here,它会在进入转换循环之前将NodeList转换为简单数组。
虽然,如果该函数的第一个版本适合您,使用该函数,它应该比循环2次快得多。
答案 1 :(得分:1)
这应该有效,但是可能有更有效的方法。 我测试了性能,它似乎比公认的解决方案更快,但我想它可能不那么可靠。这是测试http://jsperf.com/replace-links
function convertLinkEdit(text) {
var rx = /<a [^>]*?href="([^"]+)"[^>]*>[^<]*<\/a>/g;
convertLinkEdit = function (text) {
return text.replace(rx, '$1');
};
return convertLinkEdit(text);
}
答案 2 :(得分:0)
考虑查找链接,然后将link元素替换为其内容的文本节点。以下内容将替换页面中的每个链接及其内容:
windowonload = function() {
var links = document.links;
var link, node;
var i = links.length;
while (i--) {
link = links[i];
node = document.createTextNode(link.textContent || link.innerText);
link.parentNode.replaceChild(node, link);
}
};
答案 3 :(得分:0)
您可以使用正则表达式查找href
。由于您的字词为href="someurl">
var res = word.match(/^href="(.+)">/;
if (res && res.length == 2)
{
//res[1] will be your url, do whatever you want with it
}
假设您的链接是按照我之前提到的那样创建的,并且您的href属性包含"
而不是'
引用。