Javascript 多个字符串与indexOf()匹配

Javascript 多个字符串与indexOf()匹配,javascript,jquery,html,Javascript,Jquery,Html,我很确定我的语法是错误的,因为脚本只在字符串与“Video”匹配的情况下才工作,如果字符串包含“word”Audio,它将被忽略。此外,由于href标记的值为“#”,因此“../../../index.html”的重定向不起作用 js html 我想您需要的是下面两个单独的索引 srcTag.indexOf('Video') != -1 || srcTag.indexOf('Audio') != -1 是的,你需要这样做: if (srcTag.indexOf('Video') > -

我很确定我的语法是错误的,因为脚本只在字符串与“Video”匹配的情况下才工作,如果字符串包含“word”Audio,它将被忽略。此外,由于href标记的值为“#”,因此“../../../index.html”的重定向不起作用

js

html


我想您需要的是下面两个单独的索引

srcTag.indexOf('Video') != -1  || srcTag.indexOf('Audio') != -1

是的,你需要这样做:

if (srcTag.indexOf('Video') > -1 || srcTag.indexOf('Audio') > -1) {

我认为您可能希望OR(| |)运算符位于indexOf之外,如下所示:

if ((srcTag.indexOf('Video') !== -1) || (srcTag.indexOf('Audio') !== -1)) {
  ...
}

将其转换为正则表达式要短得多

if ( srcTag.match( /(video|audio)/ ) ) {
  /* Found */
} else {
  /* Not Found */
}
另一方面,请不要做您试图做的事情。在用户使用Internet Explorer 8时要求用户下载Safari是对Internet以及该用户的一种伤害

至于将域重定向到另一个位置,您应该使用
.preventDefault()
防止浏览器跟随链接:

$("a.videoDownload").on("click", function(e){
  e.preventDefault();
  if ( this.getElementsByTagName("img")[0].src.match( /(video|audo)/ ) ) {
    window.location = confirm( 'Download Safari?' )
      ? "http://apple.com/safari/download" 
      : "../../../index.html" ;
  } else {
    /* No match */
  }
});

同样,请不要这样做。没有人想成为那个家伙,当你告诉用户下载另一个浏览器时,你就是那个家伙。

“Video”| |“Audio”是一个逻辑OR。非空字符串在JavaScript中隐式地是一个真值,因此短路或不求值,这将折叠为仅
“Vide”o'
。这就是为什么您会看到这样做的结果

其他人已经为您指出了正确的解决方向。

这同样适用于:

if (srcTag.indexOf('Video') >= -1 || srcTag.indexOf('Audio') >=-1 ) {
这对我很有用:

if (srcTag.indexOf('Video' | 'Audio' ) >= -1 ) {

使用正则表达式速度更快,使用正则表达式效果更好

var sourceString='helloworld,我是web开发人员';
if(XRegExp.test(sourceString,/(hello | web)/){
//是的,`hello`或`web`在`sourceString'中找到`
}

执行时间为0.10595703125ms

简单递归函数,您可以获得多个匹配项的索引

function getMultipleIndexOf(str, searchQuery, acc = 0, result = []) {
  if (!str || !searchQuery) {
    return { result, acc };
  }
  const foundIndex = str.toLowerCase().indexOf(searchQuery.toLowerCase());
  if (foundIndex < 0) {
    return { result, acc };
  }
  return getMultipleIndexOf(
    str.slice(foundIndex + searchQuery.length),
    searchQuery,
    acc + foundIndex + searchQuery.length,
    [...result, acc + foundIndex]
  );
}

const res = getMultipleIndexOf('long text some how long text!!', 'te');
// { result: [ 5, 24 ], acc: 26 }
函数getMultipleIndexOf(str,searchQuery,acc=0,result=[]){ 如果(!str | |!searchQuery){ 返回{result,acc}; } const foundIndex=str.toLowerCase().indexOf(searchQuery.toLowerCase()); if(foundIndex<0){ 返回{result,acc}; } 返回getMultipleIndexOf( str.slice(foundIndex+searchQuery.length), 搜索查询, acc+foundIndex+searchQuery.length, […结果,acc+foundIndex] ); } const res=getMultipleIndexOf('long text some how long text!!','te'); //{结果:[5,24],acc:26}

只需忽略acc,它需要跟踪以前找到的文本

srcTag.indexOf('Video')>-1 | | srcTag.indexOf('Audio'))>-1尝试为此部分使用绝对url:window.location='../../../../index.html'它需要是相对url,因为它将在本地运行,并且无法知道用户的驱动器号是什么。您可以从window.location.href对象构建它。这里有一个参考:/(视频|音频)/.test(srcTag)在我看来更好。str.indexOf('string')不是比regex快吗?@qodeninja
.indexOf
的危险在于,如果匹配发生在字符串的开头,它可能返回
0
0
是错误的,因此将被视为未找到匹配项。也就是说,您可以使用
来避免:
~”foo“.indexOf(“f”);
会导致
-1
,这是真实的。@JonathanSampson这会否定.indexOf()的有用性,falsy值无论如何都应该通过“==”进行严格的类型检查。您是否建议不使用indexOf()?在基准测试示例中,我看到indexOf的执行速度比regEx快12倍()@qodeninja什么会否定
.indexOf
的有用性?
~
按位运算符?如果是这样,那根本不是真的。如果你的目标是知道子字符串是否存在,
~
足以保护你不受虚假返回值的影响。在条件中没有检查等式,因此
=
是不可逆的evant-我们不是在寻找一个特定的索引,我们在寻找任何索引。除非必要,否则不要进行微优化。感谢您实际解释了他的错误所在以及导致错误的原因error@qodeninja:仅使用单个字符串,但针对多个
indexOf()
搜索,例如上面的
test()
(regex)从字面上看,它总是返回真的,不管你应该读什么,它总是大于或等于-1,对吗?
if (srcTag.indexOf('Video' | 'Audio' ) >= -1 ) {
function getMultipleIndexOf(str, searchQuery, acc = 0, result = []) {
  if (!str || !searchQuery) {
    return { result, acc };
  }
  const foundIndex = str.toLowerCase().indexOf(searchQuery.toLowerCase());
  if (foundIndex < 0) {
    return { result, acc };
  }
  return getMultipleIndexOf(
    str.slice(foundIndex + searchQuery.length),
    searchQuery,
    acc + foundIndex + searchQuery.length,
    [...result, acc + foundIndex]
  );
}

const res = getMultipleIndexOf('long text some how long text!!', 'te');
// { result: [ 5, 24 ], acc: 26 }