针对特定元素的扩展
我们知道jQuery对象的有些方法只能作用在特定DOM元素上,比如 submit() 方法只能针对 form 。如果我们编写的扩展只能针对某些类型的DOM元素,应该怎么写?
还记得jQuery的选择器支持 filter() 方法来过滤吗?我们可以借助这个方法来实现针对特定元素的扩展。
举个例子,现在我们要给所有指向外链的超链接加上跳转提示,怎么做?
先写出用户调用的代码:
$('#main a').external();
然后按照上面的方法编写一个 external 扩展:
$.fn.external = function () {
// return返回的each()返回结果,支持链式调用:
return this.filter('a').each(function () {
// 注意: each()内部的回调函数的this绑定为DOM本身!
var a = $(this);
var url = a.attr('href');
if (url && (url.indexOf('http://')===0 || url.indexOf('https://')===0)) {
a.attr('href', '#0')
.removeAttr('target')
.append(' <i class="uk-icon-external-link"></i>')
.click(function () {
if(confirm('你确定要前往' + url + '?')) {
window.open(url);
}
});
}
});
}
对如下的HTML结构:
<!— HTML结构 —>
<div id="test-external">
<p>如何学习<a href="http://jquery.com">jQuery</a>?</p>
<p>首先,你要学习<a href="wiki001434446689867b27157e896e74d51a89c25cc8b43bdb3000">JavaScript</a>,并了解基本的<a href="https://developer.mozilla.org/en-US/docs/Web/HTML">HTML</a>。</p>
</div>
实测外链效果:
'use strict';
$('#test-external a').external();