如何在 JavaScript 中比较“x!= a OR b”?

Posted

技术标签:

【中文标题】如何在 JavaScript 中比较“x!= a OR b”?【英文标题】:How to compare like "x != a OR b" in JavaScript? 【发布时间】:2012-09-09 05:26:49 【问题描述】:

想知道如何在 js 脚本中再添加三个 !== 或语句。 jsfriend00 提供了以下脚本作为一个壮观的答案,但问题是我犯了一个错误,没有提到还有三个文本区域下落不明。我在剩余的或 !== 条件下坚持使用 javascript。在以下脚本中,如何对以下每个 var obj 说 !==?

//查看管理员和客户之间私人网络流的文件:

 <?php if(!defined('BASEPATH')) exit('No direct script access allowed'); ?>

 <html>
 <title>Chat</title>
 <head>

 <?php echo smiley_js(); ?>

 </head>
 <body>

 <?php echo form_open('controller/function');?>
 Reload chat<?php echo form_submit('reload','reload chat');?>
 <?php echo form_close();?>


 <?php if(isset($user_query)): foreach($user_query->result() as $row):?>

 <p>Created at: <?php echo $row->created_at; ?> </p> 

 <p>Updated at: <?php echo $row->updated_at; ?> </p> 

 <p><label for="update"> <?php echo $username_sess.'&nbsp;said'?>:<span class="optional"></span></label>  

  <textarea name="update" id="update" rows="7" cols="30"><?php echo $row->clt_rep_stream ?></textarea>


  <?php echo form_open('controller/function');?>

  <?php echo form_hidden('user_id',$row->user_id) ?>

  <p><label for="adm_update">reply to client:<span class="optional"></span></label>                                
  <textarea name="adm_update" id="adm_update" rows="7" cols="30"> </textarea>
  <?php echo form_error('adm_update'); ?>
   </p>
   <?php echo form_submit('submit','reply');?>

   <?php echo form_close();?>


   <?php echo form_open('controller/function'); ?>

   <?php echo form_hidden('user_id',$row->user_id) ?>

   <p>Replied at: <?php echo $row->adm_created_at; ?> </p> 

   <p>Updated at: <?php echo $row->adm_updated_at; ?> </p> 

   <p><label for="reupdate"> <?php echo $username_adm_sess.'&nbsp;replied:'?><span class="optional"></span></label>  

   <textarea name="reupdate" id="reupdate" rows="7" cols="30"><?php echo $row->adm_rep_stream ?> </textarea>
   <p>                             
   <?php echo form_submit( 'submit', 'update reply'); ?>
   </p>

  <?php echo form_close(); ?>

  <?php endforeach; ?>

  <?php endif; ?>

   <script>
   function autoRefresh(refreshPeriod) 
   var obj = document.getElementById("create"); 
   var obj_two = document.getElementById("update"); 
   var obj_three = document.getElementById("delete"); 
   var obj_four = document.getElementById("reload"); 

   function refreshIfSafe() 
   if (document.activeElement !== obj)  
    window.location.reload();
   else 
    setTimeout(refreshIfSafe, refreshPeriod);
   
 
    setTimeout(refreshIfSafe, refreshPeriod);
 

   autoRefresh(2 * 1000);

   </script>

   </body>
   </html>

我尝试了以下方法,但没有成功:

    if(document.activeElement !==(obj || obj_two))

我在 Brad 的帖子之后尝试了以下操作,但该帖子部分有效,但任何更新或回复在前两个之后并且以下 js 被渲染为无效,这真的很令人困惑:

    if(document.activeElement !== obj && document.activeElement !== obj_two)

【问题讨论】:

obj || obj_two 如果是真值,则计算为 obj,否则计算为 obj_two,因此条件 x !== (obj||obj_two) 可以被认为是 x !== obj_OR_obj_two_but_you_dont_know_which 【参考方案1】:

每个条件都是独立的。就这样对待它。

(document.activeElement !== obj) && (document.activeElement !== obj_two) && ...

如果您的元素没有像它们一样被显式调用,您也可以在循环中执行此操作,但我不知道这将如何适合您的代码,因为我不知道您的实际代码是什么样的.

【讨论】:

您提供的答案有效。我试图检查它,但收到一条错误消息,除了在 9 分钟内我不能。 我喜欢循环的想法,但完全不知道该怎么做。我发布的脚本位于我的视图文件的末尾。我在codeigniter工作; MVC。 嘿,布拉德,我犯了一个错误,除非我执行以下操作,否则我无法使您发布的代码正常工作:(document.activeElement !== obj && document.activeElement !== obj_two)【参考方案2】:

未经测试,但应该可以工作:

<script>
  function autoRefresh(refreshPeriod) 
    var elementArray = [
      document.getElementById("create"),
      document.getElementById("update"),
      document.getElementById("delete"),
      document.getElementById("reload")
    ];

    function refreshIfSafe() 
      if (elementArray.indexOf(document.activeElement) !== -1) 
        window.location.reload();
       else 
        setTimeout(refreshIfSafe, refreshPeriod);
      
    
    setTimeout(refreshIfSafe, refreshPeriod);
  

  autoRefresh(2 * 1000);
</script>

或者

<script>
  function autoRefresh(refreshPeriod) 
    var elementArray = ["create", "update", "delete", "reload"];    

    function refreshIfSafe() 
      if (document.activeElement && elementArray.indexOf(document.activeElement.id) !== -1) 
        window.location.reload();
       else 
        setTimeout(refreshIfSafe, refreshPeriod);
      
    
    setTimeout(refreshIfSafe, refreshPeriod);
  

  autoRefresh(2 * 1000);
</script>

【讨论】:

试过都没有用。但是,我尝试了 Brad 的解决方案,该解决方案在我这样做时有效:(document.activeElement !== obj && document.activeElement !== obj_two)。另一个问题虽然这不仅适用于我的 foreach 循环中的前两个。将发布更多代码以显示示例。【参考方案3】:

你可以试试 ...不,不要!

if(!(document.activeElement in [obj,obj_two]))
    // ...

顺便说一句,在比较对象时,实际上是在比较它们在内存中的引用地址……所以 '!=' 就足够了。

【讨论】:

不。不要说“参考”。这不是真的。 ===== 在 JavaScript 中定义良好没有谈论“引用”,实际上!= 与对象身份(或“引用”相等)正交。 (JavaScript 中唯一的引用是 l-values,类似于赋值运算符左侧的属性名称。) 不那么冗长,功能强大但被遗忘了^^ 不,也不是“内存中的地址”。这也不能正常工作,inkeysnot values 一起工作 :( "a" in ["a","b"] 为假,而 "a" in "a":1,"b":1 为真。对于数组 @ 987654332@ 可以在这里工作。它使用== 进行比较,但工作得很好,因为== 是为 DOM 元素定义的(也就是说,它们是“按对象身份”进行比较的)。 请参阅***.com/questions/3649321/… 和developer.mozilla.org/en-US/docs/DOM/Node.isSameNode,了解如何通过 DOM 节点检查获得“值相等”。 (===== 总是 具有两个 DOM 元素的“对象身份”,如果一侧不是 DOM 元素,使用 === 只是禁止类型强制) -1 in operator 测试对象是否具有具有特定名称的属性,它不测试值。该表达式几乎肯定会返回 false,并测试为 true。而关于address in memory的部分是垃圾,!=使用Abstract Equality Comparison Algorithm,与内存地址无关。

以上是关于如何在 JavaScript 中比较“x!= a OR b”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中比较UTC时间

如何在javascript中比较两个字符串日期?

如何在 Javascript 中比较字符串和布尔值?

标记的模板文字如何在JavaScript中工作?

如何在javascript中将当前日期时间与另一个日期时间进行比较

如何在 JavaScript 中判断一个对象是否为空?