1

我尝试删除 div 上的链接,它可以使用unwrap()在 jsfiddle 上查看

现在,我想实现一个用户脚本来删除网站上的链接(jsfiddle 上的示例),但它不起作用。

我正在使用 Tampermonkey。这是我的用户脚本:

// ==UserScript==
// @name           Remove Link
// @include        http://jsfiddle.net/dv3Fm/2/embedded/result/
// ==/UserScript==

function addJQuery(callback) {
  var script = document.createElement("script");
  script.setAttribute("src", "http://code.jquery.com/jquery-1.9.1.js");
  script.addEventListener('load', function() {
    var script = document.createElement("script");
    script.textContent = "(" + callback.toString() + ")();";
    document.body.appendChild(script);
  }, false);
  document.body.appendChild(script);
}

// the guts of this userscript
function main() {
 $('.spoiler a > .smallfont').unwrap();
}

// load jQuery and execute the main function
addJQuery(main);

这是HTML:

<div class="spoiler">
    <!--I want remove link only -->
    <a href="http://www.domain.com" target="_blank">
        <div class="smallfont" id="bbcode_div"/>        
        </div>
    </a>  

</div>

<!--I want result such as : -->
 <div class="spoiler">
        <div class="smallfont" id="bbcode_div"/>        
        </div> 
</div>

我的用户脚本做错了什么?如何在用户脚本中使用 unwrap jQuery 删除链接?

4

1 回答 1

0

该脚本有两个问题:

  1. 它包括错误的页面。
  2. 它正在注入与页面自己的 jQuery 冲突的 jQuery。

(1)jsFiddle在iframe中加载payload页面。对于小提琴:

http://jsfiddle.net/dv3Fm/2/

内容 iframe 是(当前方案):

http://fiddle.jshell.net/dv3Fm/2/show/light/

因此,您的脚本必须包含要更改的内容的 iframe。


(2) 该目标页面已经有 jQuery,因此使用addJQuery()这样的方法会破坏页面的 jQuery 或脚本的 jQuery,具体取决于时间。

作为一般规则,永远不要使用脚本注入(创建<script>标签),如果可以的话!
幸运的是,Tampermonkey 和 Greasemonkey 以指令的形式提供了一个更优越@require选项

有了它(和@grant指令),您的脚本可以避免与页面脚本的所有冲突(如果页面的 JS 完全被阻止,甚至可以在 Greasemonkey 中运行)。

鉴于所有这些,您的脚本将变为:

// ==UserScript==
// @name     Remove Link
// @include  http://fiddle.jshell.net/dv3Fm/2/show/light/
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @grant    GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

$('.spoiler a > .smallfont').unwrap();


如果您希望您的脚本也能够在不支持该指令的浏览器中工作,而不会失去支持该指令的浏览器的优势,请使用此答案@require中显示的第二种技术。

但我建议坚持使用 Tampermonkey 和 Greasemonkey(它们几乎完全兼容代码)。

于 2013-05-19T22:26:46.427 回答