2017-02-17 3 views
1

Ich werde versuchen, dies so gut wie möglich zu erklären. Ich entschuldige mich, wenn das keinen Sinn ergibt.object.prototype breaking javascript

"Object.prototype" scheint mein Javascript zu brechen und ich weiß nicht, wie man das behebt. Ich benutze eine YouTube-API und habe ein Skript erstellt, das 10 Videos (xml-Dateien) durchläuft und sich selbst wiederholt.

Wenn Sie an meinem Code finden Sie auf dem unteren Rand des Javascript werden Sie feststellen, ich habe "Object.prototype.getKey = function (value) {..."

Dieser Code ist zu brechen andere Teile von Javascript auf meiner Seite. Wenn ich das entferne ... dann bricht mein YouTube-Player ab, um nicht zum nächsten Video zu gelangen. Also kann ich das nicht tun.

Hier ist der Fehler:

Uncaught TypeError: X[g].exec is not a function 
    at fb.tokenize (jquery-latest.min.js:2) 
    at Function.fb [as find] (jquery-latest.min.js:2) 
    at m.fn.init.find (jquery-latest.min.js:2) 
    at HTMLDivElement.<anonymous> (photoAds-slider.js:37) 
    at Function.each (jquery-latest.min.js:2) 
    at m.fn.init.each (jquery-latest.min.js:2) 
    at m.fn.init.d.fn.flexslider (photoAds-slider.js:37) 
    at HTMLDocument.<anonymous> (screen.php:44) 
    at j (jquery-latest.min.js:2) 
    at Object.fireWith [as resolveWith] (jquery-latest.min.js:2) 

Wie dem auch sei, um dieses?

PHP

// ======================================== 
// Load the xml files for youtube player (YouTube IDs) 
// ======================================== 

$xml1=simplexml_load_file("youtube/1.xml"); 
$youtube1 = $xml1->video; 

$xml2=simplexml_load_file("youtube/2.xml"); 
$youtube2 = $xml2->video; 

$xml3=simplexml_load_file("youtube/3.xml"); 
$youtube3 = $xml3->video; 

$xml4=simplexml_load_file("youtube/4.xml"); 
$youtube4 = $xml4->video; 

$xml5=simplexml_load_file("youtube/5.xml"); 
$youtube5 = $xml5->video; 

$xml6=simplexml_load_file("youtube/6.xml"); 
$youtube6 = $xml6->video; 

$xml7=simplexml_load_file("youtube/7.xml"); 
$youtube7 = $xml7->video; 

$xml8=simplexml_load_file("youtube/8.xml"); 
$youtube8 = $xml8->video; 

$xml9=simplexml_load_file("youtube/9.xml"); 
$youtube9 = $xml9->video; 

$xml10=simplexml_load_file("youtube/10.xml"); 
$youtube10 = $xml10->video; 


$volume = '100'; 
$quality = '720'; 

$videos = array("$youtube1", "$youtube2", "$youtube3", "$youtube4", "$youtube5", "$youtube6", "$youtube7", "$youtube8", "$youtube9", "$youtube10",); 

// print_r(array_values($videos)); 


javscript

playlistids = <?php echo json_encode($videos); ?>; 

    var playing = playlistids[0]; 
    var ytplayer; 

    function onYouTubeIframeAPIReady() { 
    ytplayer = new YT.Player('ytapiplayer', { 
     width: '100%', 
     height: '100%', 
     videoId: playing, 
     events: { 
      'onStateChange': onytplayerStateChange, 
      'onReady': onPlayerReady 
     }, 
      playerVars: { 
      'controls': 0, 
      // 'cc_load_policy': 1, 
      'rel' : 0, 
      'showinfo' : 0, 
      } 
    }); 
} 


function onPlayerReady(event) { 
    event.target.setPlaybackQuality(<?php echo $quality; ?>) 
    event.target.setVolume(<?php echo $volume; ?>) 
    // alert('Start playing entry #0 (preloaded).') 
    event.target.playVideo() 

    // Fade out music player 
    audio_fade_out(); 

} 

function play(ytid) { 
    if (ytplayer) { 
     playing = ytid 
     // alert('On to entry #'+ nextentrykey +', playing set to: ' + playing) 
     ytplayer.loadVideoById(ytid, 0, <?php echo $quality; ?>); 
    } 
} 


function onytplayerStateChange(event) { 
    //alert('NEW STATE: ' + event.data) 
    if (event.data == 0) { 
     setTimeout(youtubeTimer, 4200); 

     // Fade in music player 
     audio_fade_in(); 

     // alert('Since the new player state is '+ event.data +', the video has ended. Getting next key after playing ' + playing + '.'); 
     nextentrykey = parseInt(playlistids.getKey(playing))+1 
     if (nextentrykey >= playlistids.length) { 
       nextentrykey = 0 
     } 
     document.getElementById("ytapiplayer").style.visibility = "hidden"; 
    } 
} 


function youtubeTimer() { 
     play(playlistids[nextentrykey]); 
     document.getElementById("ytapiplayer").style.visibility = "visible"; 

     // Fade out music player 
     audio_fade_out(); 
} 


Object.prototype.getKey = function(value){ 
    for(var key in this){ 
    if(this[key] == value){ 
     return key; 
    } 
    } 
    return -1; 
}; 




} else { 
    // alert('YouTube is OFF') 
    document.getElementById("ytapiplayer").style.visibility = "hidden"; 
} 
+1

Wie wäre es, wenn Sie 'getKey' zu einer normalen Funktion machen und' getKey (playlistids, playing) 'stattdessen aufrufen? Das Einbauen von integrierten Prototypen ist eine schlechte Übung. Warum haben Sie den Prototyp überhaupt verlängert? –

+2

Was bedeutet 'scheint, mein Javascript zu brechen 'bedeutet? Bringt der Browser eine Ausnahme? Erhalten Sie einen Fehler, wenn Sie 'nextentrykey = parseInt (playlistids.getKey (playing)) + 1' benutzen? Was ist das Problem? – Nope

+0

Es tut uns leid, dass Sie den Fehler nicht erhalten haben. Hier ist der Fehler, den es auf mich zurückwirft. https://www.pastiebin.com/58a7276751a6a –

Antwort

1

Prototypen Einbau-Erweiterung ist eine schlechte Praxis. Es kann Skripte unterbrechen, die das nicht erwarten, wie z. B. jQuery.

Es gibt keinen Grund für Sie, dies zu tun. Erstellen Sie eine normale Funktion statt:

function getKey(obj, value) { 
    // ... 
} 

und verwenden getKey(playlistids, playing) statt playlistids.getKey(playing).

+0

Gotcha Mann! Vielen Dank! Ich werde das untersuchen. –

+0

Das hat wie ein Zauber funktioniert. Perfekt. –