加载“onload”而不是“没有换行”时工作的jquery脚本如何解决这个问题?

时间:2013-03-21 18:21:57

标签: jquery mediawiki

我有一个jsfiddle这个项目。当小提琴设置为“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:to S:使其更适合代码框。其他一切都是原创的。

1 个答案:

答案 0 :(得分:2)

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

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

在加载DOM之后,它只会运行

这是fiddle

请注意,$(function(){...});$(document).ready(function(){...});的简写。你正在做的是附加代码只有在document.ready事件被触发后才会运行(即在DOM完全加载之后)。

<强>更新

从技术上讲,这是另一个问题,但this应该对您有用:

$(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的内容并删除尾随字符。