2012-05-10 20 views
15

Ich bin ziemlich sicher, meine Syntax das falsch, weil das Skript nur funktioniert, wenn die Zeichenfolge "Video" übereinstimmt, wenn die Zeichenfolge das "Wort" Audio hat "wird ignoriert. Auch da die href-Tags haben ein Wert von "#" die Umleitung für "../../../index.html" nicht funktioniert.Mehrere Zeichenkette passt mit indexOf()

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> 
+1

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

+0

Verwenden Sie eine absolute URL für diesen Teil: window.location = '../../../index.html ' – bygrace

+0

es muss eine relative URL sein, weil es lokal ausgeführt wird und es keine Möglichkeit gibt zu wissen, was der Benutzer Laufwerksbuchstaben sein wird. – Blainer

Antwort

61

Es ist viel kürzer, um dies zu einem regulären Ausdruck zu machen.

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

Nebenbei bemerkt, bitte nicht tun, was Sie versuchen zu tun. Wenn Benutzer aufgefordert werden, Safari herunterzuladen, wenn sie Internet Explorer 8 verwenden, führt dies sowohl für das Internet als auch für diesen Benutzer zu einem schlechten Dienst.

Wie für die Domain an einem anderen Ort umleiten, sollten Sie .preventDefault() den Browser verwenden, um zu verhindern folgenden Link:

$("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 */ 
    } 
}); 

Auch hier bitte nicht tatsächlich dies tun. Niemand möchte sein dieser Typ, und wenn Sie den Benutzern sagen, einen anderen Browser herunterladen, sind Sie dieser Kerl.

+2

/(video | audio)/.test (srcTag) sieht besser für mich aus. –

+0

das funktioniert perfekt. Ich habe mein OP aktualisiert. – Blainer

+0

isnt str.indexOf ('string') schneller als Regex? – qodeninja

3

ich denke, was Sie Notwendigkeit ist 2 separate indexOf wie unten,

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

Ja, Sie würde so etwas brauchen dies tun:

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

+1 indexOf ist schneller als regEx – qodeninja

+1

@qodeninja: nur mit einem einzigen string, aber gegen mehrere 'indexOf()' Suchen, wie oben, wird 'test()' (Regex) [effizienter] (https://jsperf.com/zotero/1) – Wolf

4

Ich glaube, Sie wahrscheinlich den OR Operator (||) außerhalb indexOf wollen wie so:

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

'Video' || 'Audio' ist ein logisches ODER. Eine nicht leere Zeichenfolge ist implizit ein echter Wert in JavaScript, und daher wird das kurzgeschlossene ODER nicht ausgewertet, und dies wird auf 'Video' reduziert. Aus diesem Grund sehen Sie die Ergebnisse, die Sie machen.

Andere haben Sie in die richtige Richtung hingewiesen, um zu lösen.

+0

Vielen Dank für die Erklärung, wo sein Fehler ist und ** warum ** es den Fehler verursacht –

0

Dies wird auch funktionieren:

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

es wird immer größer als oder gleich -1 oder? –

-1

Das ist für mich gearbeitet:

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

Dies ist wörtlich immer wahr, egal was https://jsfiddle.net/6rnaoa0u/ – Liam

+0

Sie sollten wahrscheinlich lesen, was ein [bitweiser Operator ist] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referenz/Operatoren/Bitwise_Operatoren) – Liam

0

Seine ziemlich schneller mit regex und je besser mit XRegExp.

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

Ausführungszeit ist 0.10595703125ms