我正在编程一个社交媒体引擎,我想使用jQuery自动将所有http和https链接包装到<a>
元素中。
这是经过大量Google搜索之后我得到的:
$('*').each(function test() {
var str = $(this);
if(str.match("^http")) {
str.wrap("<a></a>");
}
});
但是当我运行代码时,在日志中出现以下错误。
TypeError: str.match is not a function [Learn More]
执行此操作的最佳方法是什么?
答案 0 :(得分:1)
正如其他人提到的那样,JavaScript的match()
对字符串进行操作,而$(this)
是jQuery对象,而不是字符串。参见What's the difference between '$(this)' and 'this'?
我建议针对元素的text()
内容测试match()
。
如果以“ http”开头,请用<a>
包裹元素,并将其href
设置为文本内容。
$('span,p').each(function() {
var $str = $(this);
var text = $str.text();
if (text.match("^http")) {
var $link = $("<a>", {
'href': text
});
$str.wrap($link);
}
});
span,
p {
display: block;
margin: 0 0 .5em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span>http://google.com</span>
<span>file://host/path</span>
<p>https://stackoverflow.com</p>
<p>Something Else</p>
答案 1 :(得分:0)
诚然,我不是第一次针对我的问题,但是无论如何,我都设法得到了答案。
$('.content').html($('.content').html().replace(/@([^\s]+)/g,'<a href="$1">@$1</a>'));
这会将所有以“ @”开头的代码包装在一个元素中。