Jquery:选择元素 A(如果存在)的惯用方法,否则选择元素 B?

发布于 2024-10-02 21:07:27 字数 708 浏览 3 评论 0原文

我正在使用 JQuery 编写 GreaseMonkey 脚本。
有时我想要修改的站点在 TD 中显示信息,因此:

<center><table><tr><td>
Something interesting here.</td></tr>....</table></center>

而有时它在同一表结构中的 P 标记(或多个)中显示内容,因此:

<center><table><tr><td>
<p>Other text about the same interesting thing.
<p>and maybe some more stuff too.</td></tr>...</table></center>

现在我正在使用两个不同的选择器来选择

,但我想知道是否有一种好方法可以在单个标签中仅选择 P 标签(如果存在),否则选择 TD Jquery 选择器,因为我想要附加的内容在两种情况下都是相同的。

(如果我只是附加到 TD,无论如何,我的添加位置会根据 P 标签的存在/不存在而变化,所以我要保持位置一致性。)

I'm writing a GreaseMonkey script with JQuery.
Sometimes the site I want to modify displays information in a TD, thus:

<center><table><tr><td>
Something interesting here.</td></tr>....</table></center>

whereas sometimes it displays things in a P tag (or several) within the same table structure, thus:

<center><table><tr><td>
<p>Other text about the same interesting thing.
<p>and maybe some more stuff too.</td></tr>...</table></center>

Right now I'm doing two different selectors to select the <p> vs. the <td>, but I'm wondering if there's a nice way to select only the P tag if it's present and the TD otherwise in a single Jquery selector, since what I want to append is identical in both cases.

(If I just append to the TD regardless, the location of my addition changes based on the presence/absence of the P tag, so I'm going for placement consistency.)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

恏ㄋ傷疤忘ㄋ疼 2024-10-09 21:07:27

是的,您可以通过扩展 jQuery 来做到这一点。

将其放在 GM 文件顶部附近:

$.fn.substituteIfPresent = function (tagName)
{
    return this.map (function ()
    {
        var childArray = $(this).children (tagName);

        if (childArray.length)
            return childArray[0];
        else
            return this;
    });
}

然后你可以通过以下方式获取所需的元素:

X = $("center > table > tbody > tr > td").substituteIfPresent ('p');

//-- Note that X is a standard jQuery object, the following works:
X.css ('border', '1px solid green');

此版本的 substituteIfPresent() 仅返回第一个 p 标记(如果存在)。

Yes, You can do this by extending jQuery.

Put this near the top of your GM file:

$.fn.substituteIfPresent = function (tagName)
{
    return this.map (function ()
    {
        var childArray = $(this).children (tagName);

        if (childArray.length)
            return childArray[0];
        else
            return this;
    });
}

Then you can get the desired element with:

X = $("center > table > tbody > tr > td").substituteIfPresent ('p');

//-- Note that X is a standard jQuery object, the following works:
X.css ('border', '1px solid green');

This version of substituteIfPresent() returns only the first p tag, if present.

苦笑流年记忆 2024-10-09 21:07:27

在单个 jQuery 语句中不可能,但你可以这样做:

var $elem = $('p').length > 0 ? $('p') : $('table');

$elem.append(...);

Not possible in single jQuery statement, but you can do something like this:

var $elem = $('p').length > 0 ? $('p') : $('table');

$elem.append(...);
倚栏听风 2024-10-09 21:07:27

我会使用 .map (或 .each) 为此:

$("center > table > tbody > tr > td").map(function() {
    if($(this).find("p").length) {
        $(this).find("p").css("border", "1px solid red");
    } else {
        $(this).css("border", "1px solid green");
    } 
});

演示:http://jsfiddle.net/tBWhH/3/

I would use .map (or .each) for this:

$("center > table > tbody > tr > td").map(function() {
    if($(this).find("p").length) {
        $(this).find("p").css("border", "1px solid red");
    } else {
        $(this).css("border", "1px solid green");
    } 
});

Demo: http://jsfiddle.net/tBWhH/3/

澉约 2024-10-09 21:07:27

仅使用一个选择器操作的一种好方法是:

var $el = (function(){
    var $td = $('td'), // you probably want a more precise selector here
        $p = $td.find('p:last');

    return $p.length ? $p : $td;
})();

这将 $el 设置为最后一个 p 元素(如果存在),否则设置为 td 元素。请注意,如果页面上有多个 td 元素,这会产生意外结果,因此您应该使用比 $('td') 更精确的选择器。

自执行函数的原因是为了避免额外的变量污染你的作用域。

A nice way with only one selector operation is this:

var $el = (function(){
    var $td = $('td'), // you probably want a more precise selector here
        $p = $td.find('p:last');

    return $p.length ? $p : $td;
})();

This sets $el to the last p element if any exist and otherwise to the td element. Note that this will have unexpected results if you have more than one td element on your page, so you should use a more precise selector than $('td').

The reason for the self-executing function is to avoid polluting your scope with extra variables.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文