Вопрос по html5, jquery, javascript, html – Несколько совпадений строк с indexOf ()

18

Я уверен, что мой синтаксис неверен, потому что скрипт работает, только если строка соответствует & quot; Видео & quot ;, если строка имеет & quot; слово & quot; Аудио & quot; это игнорируется. Также, поскольку теги href имеют значение & quot; # & quot; перенаправление для & quot; ../../../ index.html & quot; не работает

JS

var ua = navigator.userAgent.toLowerCase();
var isIE8 = /MSIE 8.0/i.test(ua);
if (isIE8) {
    $('a').click(function () {
        var srcTag = $(this).find('img').attr('src');
        if (srcTag.indexOf('Video' || 'Audio') > -1) {
            if (confirm('Download Safari? \n\n http://apple.com/safari/download/')) {
            window.location = 'http://apple.com/safari/download/';
            } else { window.location = '../../../index.html';}
        } else {
            alert('no match');
        }
    });
}

HTML

<a href="#"><img src="Video/000_Movies/assets/005_CCC_Jesus_Story_80x60.jpg" />test1</a> 
<a href="#"><img src="Audio/000_Movies/assets/006_GSP_Gods_Story_80x60.jpg" />test2</a> 
<a href="#"><img src="Media/000_Movies/assets/002_God_Man_80x60.jpg" />test3</a>
Вот ссылка:w3schools.com/jsref/obj_location.asp bygrace
вы можете построить его из объекта window.location.href bygrace
srcTag.indexOf ("Видео") & gt; -1 || srcTag.indexOf («Аудио») & gt; -1 Nick Bork
попробуйте использовать абсолютный URL для этой части: window.location = & apos; ../../../ index.html & apos; bygrace
это должен быть относительный URL, потому что он будет работать локально, и нет никакого способа узнать, какой будет буква диска пользователя. Blainer

Ваш Ответ

8   ответов
-2

Это сработало для меня:

if (srcTag.indexOf('Video' | 'Audio' ) >= -1 ) {
Это буквально всегда возвращает истину, несмотря ни на чтоjsfiddle.net/6rnaoa0u
Вы, вероятно, должны прочитать о том, чтоbitwise operator is
0

Это также будет работать:

if (srcTag.indexOf('Video') >= -1 || srcTag.indexOf('Audio') >=-1 ) {
это всегда будет больше или равно -1, верно?
3

Я думаю, что вам нужно 2 отдельных indexOf, как показано ниже,

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

'Video' || 'Audio' это логическое ИЛИ. Непустая строка неявно является истинным значением в JavaScript, и поэтому короткое замыкание ИЛИ не оценивается, и это сводится к'Video', Вот почему вы видите результаты, которые вы делаете.

Другие указали вам в правильных направлениях, чтобы решить.

Спасибо за фактическое объяснение, где его ошибка иwhy это вызывает ошибку
2

Да, вам нужно что-то вроде этого сделать так:

if (srcTag.indexOf('Video') > -1 || srcTag.indexOf('Audio') > -1) {
@qodeninja: только с одной строкой, но против несколькихindexOf() поиски, такие как выше,test() (регулярное выражение) становитсяmore efficient
+1 indexOf быстрее, чем regEx
0

Это довольно быстро с регулярным выражением и еще лучше сXRegExp.

var sourceString = 'hello world, i am web developer';
if (XRegExp.test(sourceString, /(hello|web)/)) {
  // yes, `hello` or  `web` is found in `sourceString`
}

Время выполнения 0.10595703125мс

5

Я думаю, что вы, вероятно, хотите оператор OR (||) вне indexOf как так:

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

Короче, чтобы превратить это в регулярное выражение.

if ( srcTag.match( /(video|audio)/ ) ) {
  /* Found */
} else {
  /* Not Found */
}

На заметку, пожалуйста, не делайте то, что вы пытаетесь сделать. Попросить пользователей загрузить Safari, когда они используют Internet Explorer 8, оказывает медвежью услугу как Интернету, так и этому пользователю.

Что касается перенаправления домена в другое место, вы должны использовать.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 */
  }
});

Опять же, пожалуйста, неactually сделай это. Никто не хочет бытьthat guyи когда вы говорите пользователям загружать другой браузер, выthat guy.

Разве str.indexOf («строка») не быстрее, чем регулярное выражение?
/ (видео | аудио) /. test (srcTag) выглядят лучше для меня.
это работает отлично. Я обновил свой ОП. Blainer
@JonathanSampson, который отрицал бы полезность .indexOf (), ложные значения должны быть строго проверены на тип в любом случае через & apos; === & apos ;. Вы предлагаете не использовать indexOf ()? В тестовых примерах я видел, как indexOf работает в 12 раз быстрее, чем regEx (jsperf.com/regexp-vs-indexof )
@qodeninja Опасность с.indexOf что он может вернуться0, если ваше совпадение происходит в начале строки.0 является ложным, и как таковой будет рассматриваться как не найдено совпадений. Это, как говорится, вы можете использовать~ чтобы избежать этого:~"foo".indexOf("f"); результаты в-1Это правда.

Похожие вопросы