【问题标题】:Using jQuery to grab the link text (if it has it) or the id of an image (if it's an image link)使用 jQuery 获取链接文本(如果有)或图像的 id(如果是图像链接)
【发布时间】:2012-08-29 22:34:56
【问题描述】:

我想使用 jQuery 来确定链接是文本链接还是图像链接。如果是文本链接,我想抓取文本。如果是图片链接,我想获取图片的 id。我尝试将 .text() 用于文本链接,但这也为我的图像链接返回 true。

function get_link_content(object) {

            if($(object).text()) {
                var link_content = $(object).text();
            }
// even if it's an image link, this ^^ always returns true
            else if($(object).find('img')) {
                if($(object).find('img').attr('id')) {
                    var link_content = $(object).find('img').attr('id');
                }
                else {
                    var link_content = 'unidentified';
                }
            }

            return link_content;
        }

通过文本链接,我的意思是:

<a href="#">This is a text link</a>

通过图片链接,我的意思是:

 <a href="#"><img id="the-id" src="#"></a>

除了 .text() 之外,我还应该使用其他方法吗?

【问题讨论】:

  • 你可以交换你的逻辑;检查图像,如果没有,则抓取文本

标签: jquery text find


【解决方案1】:
if( $('img', $(object)).length ){
//object has a img as child
}
else{
//object doesnt have
}

var myText = $('img', $(object)).length ? $('img', $(object)).attr('id') 
             : $(object).text();

或作为函数

function get_link_content(object) {
    return $('img', $(object)).length ? $('img', $(object)).attr('id') 
                 : $(object).text();
}

return ( $('img', $(object)) && $('img', $(object)).attr('id') ) || $(object).text();

从@undefined 的建议中将所有长度更改为 has(),然后在阅读 'has()' 的文档后恢复为长度:P

【讨论】:

  • 最后一个确保没有人能轻易理解你的代码:)
【解决方案2】:

以下是您的代码经过清理和略微优化的版本:

function get_link_content(object) {
  var $object = $(object), // Cache the element for faster execution
      $img = $object.find('img'),
      link_content,
      id;

  if (!$img.length) { // Does the object element not have an image?
    link_content = $object.text();
  } else {
    id = $img.attr('id'); // Get the image ID (if it exist)

    if (id.length) { // Was there an ID?
      link_content = id;
    } else {
      link_content = 'unidentified';
    }
  }

  return link_content;
}

编辑:这是一个进一步优化的版本(传递了一个 jQuery 元素)。

function get_link_content($object) {
  var $img = $object.find('img'),
      link_content;

  if (!$img.length) { // Does the object element not have an image?
    link_content = $object.text();
  } else {
    link_content = $img.attr('id'); // Get the image ID (if it exist)

    if (!link_content.length) { // Was there no ID?
      link_content = 'unidentified';
    }
  }

  return link_content;
}

如您所见,我删除了id,因为无论如何它都要存储在link_content 中(如果id 存在并且有值)。这意味着它在遇到具有id 的图像时会稍微快一些,因为它不必将id 值分配给变量id,然后将id 分配给link_element。如果有值,请执行步骤。它也比第一个版本短一些,这增加了一点可读性。

【讨论】:

  • 这里还有另一个问题——如果我已经缓存了对象并使用了存储在函数调用中的变量怎么办?函数内还需要缓存对象吗?
  • 如果你传递的对象是一个jQuery对象,那么它会更快。只需将函数部分更改为:function get_link_content($object) 并删除 $object = $(object), // Cache the element for faster execution。我将变量命名为$object 而不是object 的原因是为了表明它是一个jQuery 元素。
  • 明白了。感谢您的提示:)
  • 没问题。我们还可以优化一件事。我将在您接受作为答案的版本下面再制作一个经过编辑的版本。敬请关注。 :)
【解决方案3】:
function get_link_content(e) {
        if($(e).find('img').length != 0) {
            if($(e).find('img').attr('id')) {
                var link_content = $(e).find('img').attr('id');
            } else {
                var link_content = 'unidentified';
            }
        } else {
            var link_content = $(object).text();
        }
        return link_content;
    }

$(object).find('img') - 这将始终返回 jQuery 对象,并且 object 始终为 true。要检查 jQuery 是否找到了某些元素,您应该使用 length 属性。

顺便说一句:$(e).find('img').attr('id') - 多次这样做并不是最好的方法。最好一次性获取值,然后放入某个临时变量中。

【讨论】:

  • “一次获取值”是指将对象存储在变量中吗?
  • 是的。像这样的东西:var tmpId = $(e).find('img').attr('id'); if(tmpId) { var link_content = tmpId;。原因是 DOM 操作没有那么快。好吧,也许在你的情况下差异不是那么大,但无论如何......
  • 如果我缓存img对象,以后去检索id属性有帮助吗?
  • 如果你问是否会有一些速度差异 - 是的,它会比你的初始代码更快(但差异对于几个元素几乎是不可见的) - jquery 对象保持引用到选定的对象,不会再做任何搜索。
【解决方案4】:
function get_link_content(object) {
    var link_content = 'unidentified';
    var $img = $(object).find('img');
    if(!$img.length){
      //no image found
      //get the text
      var $txt = $(object).text();
      if($txt.length){
          link_content = $txt;
      }
    }else{
      //there's an image
      link_content = $img.attr('id');
    }
    return link_content;
}

【讨论】:

    【解决方案5】:

    你可以使用jQuery对象的length属性:

    var $obj = $(object);
    if(!$obj.children().length) {
        var link_content = $obj.text();
    } else {
        var link_content = $('img', $obj).attr('id');
        // ...
    }
    

    注意可以缓存$(object)而不是多次制作jQuery对象。

    【讨论】:

    • 感谢优化提示。将对象存储在变量中的最佳方法是什么?
    猜你喜欢
    • 2012-05-05
    • 1970-01-01
    • 2014-02-04
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多