2016-11-05 102 views
0

我是新来的greasemonkey,并希望学习使用它来删除JavaScript执行者。像这样的greasemonkey帮助(替换html标签)

<span class="lazyload" style="display:block; width:100%;height:100%;" data-imgSrc="//img4.leboncoin.fr/ad-thumb/whatsoever.jpg" data-imgAlt="nevermind"></span> 

应该读

<img style="width:100%; height:100%;" src="http://img4.leboncoin.fr/ad-thumb/whatsoever.jpg" data-imgAlt="nevermind"> 

原则上,这可以通过一些搜索&内容替换来实现。在sed讲

's|span class="lazyload" style="display:block;|img style="|gi' 
's|data-imgSrc="//|src="http://|gi' 

做这项工作。

正如很多指出的(这里例如RegEx match open tags except XHTML self-contained tags), 这样的替换可能是不好的。但是当应用于特定页面时,它们很快...

谢谢!

回答

1

在处理实时网页时忘掉regexps,因为直接替换HTML会通过addEventListener或.on属性中断附加在js代码中的事件侦听器(点击处理程序等)。

下面是我正在使用的代码的摘录。

delazify(); 

// also delazify new dynamically added content 
new MutationObserver(delazify).observe(document, {subtree: true, childList: true}); 

function delazify() { 
    var lazies = document.getElementsByClassName('lazyload'); 
    for (var i = lazies.length; --i >= 0;) { 
     var el = lazies[i]; 
     var src = el.getAttribute('data-imgSrc'); 
     if (src) { 
      el.src = src; 
      el.removeAttribute('data-imgSrc'); 
      el.classList.remove('lazyload'); 
     } 
    } 
} 

它很简单,唯一值得一提的是,在MutationObserver回调,而不是通过变异记录和添加的节点,它可以在很多节点的情况下是缓慢的循环,我直接用类名重复,因为getElementsByClassName是非常快。