【问题标题】:Conditional Operator false value seems to not run条件运算符 false 值似乎没有运行
【发布时间】:2013-08-06 14:59:00
【问题描述】:

HTML:

<a href="/u"><span>Text</span></a>
<a href="/u"><span><strong>Text</strong></span></a>
<a href="/u"><span><strong>Text</strong></span></a>
<a href="/u"><span>Text</span></a>


    var strong = $('span strong'),
        notstrong= $('span'),
        a = $('a[href^="/u"]');

         for(var i=0;i<a.length;i++){
            var checkIt = strong ? strong : notstrong;
            $(a[i]).find(checkIt).before('<span>Hello</span>');
           }

结果应该是:

<a href="/u"><span><span>Hello</span>Text</span></a>
<a href="/u"><span><span>Hello</span><strong>Text</strong></span></a>
<a href="/u"><span><span>Hello</span><strong>Text</strong></span></a>
<a href="/u"><span><span>Hello</span>Text</span></a>

实际结果:

<a href="/u"><span>Text</span></a>
<a href="/u"><span><span>Hello</span><strong>Text</strong></span></a>
<a href="/u"><span><span>Hello</span><strong>Text</strong></span></a>
<a href="/u"><span>Text</span></a>

由于某种原因,条件运算符没有返回我的错误语句。那或者编码是错误的,就像我之前使用了错误的选择器一样。真的吗?我很好奇为什么我的条件运算符不正确。我是条件运算符的新手,所以也许它总是返回 true 或者我不确定。

【问题讨论】:

  • 这不总是被评估为真的吗?您的运营商不区分线路。它只是在任何地方检查是否存在强,但是当你这样做时,它总是在寻找强。
  • notstrong 包含 所有 &lt;span&gt; 元素,包括 那些包含 &lt;strong&gt; 标记的元素。另外,checkIt 将永远是 strong ...这是你想要的吗?
  • 您是否要在所有&lt;a&gt;&lt;span&gt; 元素文本之前添加&lt;span&gt;Hello&lt;/span&gt;,而不考虑&lt;strong&gt;?好像是这样……

标签: javascript jquery for-loop conditional conditional-operator


【解决方案1】:

我不太了解最终结果,但如果您要确定在 html 块的上下文中某些内容是否强大,则必须为其提供更精细的上下文。通过检查 $('span strong') 是否存在,它将始终返回 true。即使您执行 $('span strong').length 也将始终返回 true,因为它正在整个块中移动。

这是一个例子,其中强项是每行而不是整个块的检查。所以在这种情况下,它只有在该线内部有很强的情况下才会返回 true。

for(var i=0;i<a.length;i++){
  var checkIt = $(a[i]).find(strong).length ? strong : notstrong;
  $(a[i]).find(checkIt).before('<span>Hello</span>');
}

http://jsfiddle.net/S8XP4/

【讨论】:

  • 你的例子效果最好。现在我确实只是展示了代码的 sn-p,所以每个人都只是认为我为此而疯狂。它比我展示的要复杂一点:D 感谢您理解 Eric!
【解决方案2】:

如果您的问题没有比您的代码建议的更复杂,您可以这样做:

$('a[href="/u"] > span').prepend('<span>Hello</span>');

【讨论】:

  • 代码比这复杂一点;)
【解决方案3】:

$('span strong') 返回一个 JavaScript 对象。 JavaScript 对象总是等同于true,因为它们不是未定义的。相反,您想要的是所述对象的长度属性。

var checkIt = strong.length ? strong : notstrong;

编辑: 这仍然不会做你想做的事,逻辑错误比这更深。

要实现您提出的目标,您只需这样做:

$('a[href^="/u"] strong').before('<span>Hello</span>');

【讨论】:

  • 这不总是会评估为真吗?如果你对整个 html 块执行 $('span strong') ,它总是会找到 $('span strong') 他没有在该特定行内进行查找。
  • 我可能已经找到解决方案请等待更新
【解决方案4】:

为了让跨度在找到强标记时保持嵌套在其原始跨度内,您必须将方法从之前更改为前置。

$('a[href^="/u"]').each(function(){
    if($(this).find('span strong').length > 0){
        $(this).find('span strong').before('<span>Hello</span>');
        return false;
    }
    $(this).find('span').prepend('<span>Hello</span>')
}); 

如果你不加前缀,你最终会得到 ​​p> 的结果

<a href="/u">
   <span>Hello</span>
   <span>Text</span>
</a>

代替

<a href="/u">
   <span>
      <span>Hello</span>
      "Text"
   </span>
</a>

【讨论】:

  • 谢谢蒂姆,虽然我已经有了答案,但我也从不使用 .each() 函数 ;) 谢谢你
猜你喜欢
  • 2015-09-22
  • 2021-11-27
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多