jquery 脚本在加载时有效"onload"但不能"no wrap - in <head>" 我该如何解决这个问题?



我为这个项目准备了一个jsfiddle。当fiddle被设置为"onLoad"时,它会删除元素。但是,当我将下拉菜单切换到"no wrap - in"时,它不起作用。我需要它的工作"没有包裹",因为我在维基百科上使用它,这就是他们如何加载他们的脚本。我的代码是:

$('span.mw-usertoollinks a:last').remove();
$('span.mw-usertoollinks').each(function() {
    this.innerHTML = this.innerHTML.replace(" | )", ")");
});

假定从

中删除块链接和前面的|:
<span class="mw-usertoollinks">
    (
    <a href="/UT:T13" class="mw-redirect" title="UT:T13">Talk</a>
     | 
    <a href="/S:Contributions/T13" title="S:Contributions/T13">contributions</a>
     | 
    <a href="/S:Block/T13" title="S:Block/T13">block</a>
    )
</span>

注意:我将User_talk:缩写为UT:和Special:缩写为S:,以使其更适合代码框。

onload之外不工作,因为您试图选择的DOM元素在代码运行时不存在。幸运的是,您可以像这样在jQuery中包装代码:

$(function() {
    // your code here
});

并且在 DOM加载完成后,它只会运行

Here's a fiddle

注意$(function(){...});$(document).ready(function(){...});的简写。您所做的是附加只在文档中运行一次的代码。ready事件被触发(即在DOM完全加载之后)。

从技术上讲,这是另一个问题,但这应该适用于您:

$(function() {
    $('span.mw-usertoollinks').each(function () {
        var $elem = $(this);
        $elem.children('a:last').replaceWith("-");
        $elem.html($elem.html().replace(" | -", ""));
    });
 });

注意,当您使用$.each时,即使使用jQuery选择器,您也是在DOM节点集合上迭代,而不是jQuery对象。所以this需要像这样转换为一个jQuery对象:$(this),以便在其上使用jQuery函数。我缓存结果的jQuery对象作为$elem,以避免不得不不断重新创建它。

我们使用children选择子节点,使用选择器a:last只选择最后一个a链接。然后我们使用.html()来操作$elem的内容并删除尾随字符。

最新更新