2

长话短说,我正在制作一个供个人使用的快速扩展——没什么大不了的。假设我们有大约 50 个 URL 适合我在页面上查找的内容,总共可能有 100 个 URL。我的目标是将所有包含的 URLexample.com/xyx转换为otherexample.com/xyz. 自然,这就是我所拥有的:

$(document).bind('DOMSubtreeModified', processLinks);
$(document).ready(processLinks);
function processLinks(){
  $('a').each(function(){
    this.href = this.href.replace("example.com","otherexample.com");
  });
};

但是,这再次严重影响了性能。在我过去的经验中,我会尝试只抓取包含 的链接,example.com然后进行更改。或者,也许更好的是,仅当它们在屏幕上时才抓取并进行转换。

我的意思是,可以执行以下操作:

$('a.title, a.madeVisible, .md [href*="example.com"]')

但是,由于这是我的第一次尝试,而且我没有比基本功能更进一步,我不知道如何优化它以仅在必要时捕获链接,然后实际实现它。你有什么建议吗?

谢谢!

更新代码:

$('body').on('mouseover', 'a', function(e) {
  e.preventDefault();
  if(this.href.match(/example.com/g)){
      this.href = this.href.replace('example.com', 'newexample.com');
  }
});
4

3 回答 3

2

假设您要修改 100 个链接。每次修改都会触发DOMSubtreeModified,它会启动一个包含 99 个链接的新循环以进行修改。长话短说,你最终得到 100*99*98*97*96*...*1 操作。

编辑:我可能错了,因为您使用的是this.href,这是一个属性,实际上并没有修改 DOM。但是你明白为什么DOMSubtreeModified不推荐使用了。这基本上是一个邀请你自己开枪。

于 2013-10-11T16:40:13.037 回答
1

这样的事情怎么样?

$('a').click(function(){
    if(this.href.match(/example.com/g)){
        this.href = this.href.replace("example.com","otherexample.com");
    }
})

这样你只检查链接,因为它实际上被点击?

这是未经测试的,因此您可能需要调整脚本,但这个概念应该能让您到达您想去的地方。

编辑:

更新您的评论,您可以使用 .hover()。.hover() 将接受两个函数作为参数。一个处理mouseenter,一个处理mouseleave。

因此,假设您的标记如下所示:

<a href="http://example.com/image.png">
    <img src="http://example.come/image.png">
</a>

你可以做基本相同的事情:

$(a).hover(function(){
     if(this.href.match(/example.com/g)){
        $(this).data('original-url', this.href) //store original url on the dom node
        this.href = this.href.replace("example.com","otherexample.com");
        $(this).hoverzoom()
    },
    function(){
        $(this).attr('href', $(this).data('original-url'));
    }
 }
 );

双重编辑:我怀疑您的问题实际上与 hoverzoom 插件本身有关。我为此代码添加了一个潜在的解决方法。

于 2013-10-11T16:39:58.593 回答
1

您总是可以随时更改它们。

$('body').on('click', 'a', function(e) {
  e.preventDefault();
  window.location.href = this.href.replace('example.com', 'otherexample.com');
});
于 2013-10-11T16:41:12.373 回答