Beginners vraagje

  • Onderwerp starter Onderwerp starter luc99
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.
Kan je ergens een voorbeeld hiervan aangeven. Het blijft nog duister voor mij.
 
Met welke reden voer je de json_decode uit?
Lijkt me toch overbodig?
 
Laatst bewerkt:
Kan je https gebruiken?
Het script hieronder heb ik ergens vandaan, waarschijnlijk werkt het niet maar het proberen waard.
Code:
<script type="text/javascript">
var url = "http://192.168.1.61:8090/now_playing";
var invocation = new XMLHttpRequest();
var invocationHistoryText;

function callOtherDomain(){
    if (invocation) {
        invocation.open('GET', url, true);
        invocation.withCredentials = "true";
        invocation.onreadystatechange = handler;
        invocation.send(); 
    } else {
        invocationHistoryText = "Sorry.  No Invocation Took Place, or Errors Took Place";
        // invocationHistoryText is error
        var textNode = document.createTextNode(invocationHistoryText);
        var textDiv = document.getElementById("textDiv");
        textDiv.appendChild(textNode);
    }
}

function handler(evtXHR) {
    if (invocation.readyState == 4) {
            if (invocation.status == 200) {
                var response = invocation.responseText;
                // response is gevraagde tekst
                invocationHistoryText = document.createTextNode(response);
                var textDiv = document.getElementById("textDiv");
                textDiv.appendChild(invocationHistoryText);
            } else {
                // error
                alert("Invocation Errors Occured" + invocation.readyState);
            }
    } else {
        dump("currently the application is at " + invocation.readyState);
    }
}
</script>

<button type="button" onclick="callOtherDomain()">Test</button>
<div id="textDiv"></div>
 
Het probleem lijken mij inderdaad de CORS headers.
PHP heeft daar geen moeite mee, dus moet je het daarom via een omweg via het PHP-script uitlezen. Dus via cURL (aanrader) uitlezen. En dan je script.php inladen in je AJAX-functie.
 
Het probleem lijken mij inderdaad de CORS headers.
PHP heeft daar geen moeite mee
@luc99 de oplossing van php4u is de beste maar dat gaat alleen als je php kan gebruiken.
Als het echt vanuit een html pagina met Javascript gedaan moet worden dan is het lastig.
 
Browsers blokkeren standaard AJAX-requests vanaf een andere host. Tenzij er een specifieke CORS-header wordt meegeven.
 
Ik zoek en zoek, maar het blijft voor mij onduidelijk.
Kan je een voorbeeld geven van hoe dit dient te gebeuren.
 
Ik zoek en zoek, maar het blijft voor mij onduidelijk.
Kan je een voorbeeld geven van hoe dit dient te gebeuren.

Je bent er al bijna, maar je moet alleen even zorgen dat je die extra json_encode en bijbehorende uit je script sloopt.
Die is zinloos tegenover een XML-bestand.

En enkel je result even te echo'en. Als je het script aanroept moet je uiteindelijk je XML-file weer zien.
 
Laatst bewerkt:
Ok, dan nog even proberen.

Code:
<?php

$feedURL = "http://192.168.1.61:8090/now_playing";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $feedURL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
$json = curl_exec($ch);

?>

Als ik dit script start krijg ik een Internal Server Error 500
 
Dan moet je in de error_log kijken. Het ligt aan de opzet van de webserver waar deze staat. In mijn ogen moet het gewoon werken.

Ik zou $json in ieder geval hernoemen naar iets logisch zoals $result. Een appel noem je immers ook geen peer ;).
En dan even netjes echo'en, want je wilt het juist laten zien.
 
Laatst bewerkt:
Ik heb nog één en ander opgezocht ivm de error_logs. Hierbij zag ik dat de error meldingen ingeschakeld konden worden zodat deze zichtbaar zijn voor de gebruiker onmiddellijk tijdens het uitvoeren van het script. Hierdoor kwam te voorschijn dat er een probleem was met $ch = curl_init();
Door hierover info te zoeken zag ik dat er bij de Php instellingen van mijn Synology Nas moet aangevinkt worden om cUrl te kunnen gebruiken.
Zodra dit gebeurd was, ging het een versnelling hoger.

En ja hoor, het resultaat van de XML werd netjes getoond op het scherm.
Hartelijk dank voor uw suggesties.
 
Fijn dat het opgelost is lijkt te zijn :-)
 
Mag ik nog even op dit draadje terug komen. Intussen ben ik al wel wat verder geraakt met mijn toepassing, maar zoek ik weer een tijdje om deze php code op te starten vanuit een javascript gedeelte.
Momenteel ls het zo dat indien er op het scherm op een afbeelding met id = power gedrukt wordt dat er een javascript functie opgestart wordt om de versterker uit/aan te zetten. Nu zou ik tegelijkertijd ook graag de php functie laten mee opstarten. Momenteel ben ik met de alert ('hello'); aan het debuggen gegaan om ipv de functie te starten een melding te geven zodat ik weet op welke plaats de oproep naar de php code moet komen.

Alleen zie ik tijdens het uitvoeren en het drukken op de power afbeelding nergens de alert melding verschijnen.

Kunnen jullie nog eens kijken wat hier mis loopt.
Ik heb de code beperkt tot de punten die belangrijk zijn voor uitvoering van de power functie.

Code:
const powerButton = document.getElementById('power');

let apis = {
    boseSoundTouch: {
    //get user selected recomendation weather
        api:"http://192.168.1.61",
        port:":8090",
        getUrl: (endpoint) => {
            return apis.boseSoundTouch.api + apis.boseSoundTouch.port + "/" + endpoint
        },
        getVolumeUrlBody: (endpoint, value) => {
            return "<" + endpoint + ">" + value + "</"+endpoint+">"
        },
        getSourceUrlBody:(source, sourceAccount) => {
        	return "<ContentItem source=" + source + " sourceAccount=" + sourceAccount + "></ContentItem>"
        },
        getBluetoothUrlBody:(source) => {
            return "<ContentItem source=" + source + "></ContentItem>"
        },
        getKeyUrlBody:(state, sender, key) => {
        	return "<key state=" + state + " sender=" + sender + ">" + key + "</key>"
        }
    } 
};

const apiCall = (endpoint, bodyOfRequest) => {
	console.log("Endpoint : " + endpoint + "\n" + "Body of Request : " + bodyOfRequest)
	fetch(apis.boseSoundTouch.getUrl(endpoint), {method: 'post', body: bodyOfRequest})
        .then(response => response.text())
        .then(str => (new window.DOMParser()).parseFromString(str, "text/xml"))
        .then(data => console.log(data))
}

const power = () => {
	console.log('power');
	var state = "press"
	var sender = "Gabbo"
        var key = "POWER"
	var bodyOfRequest = apis.boseSoundTouch.getKeyUrlBody(state,sender,key)
	apiCall('key', bodyOfRequest)
};

powerButton.addEventListener('click', function() {
  power;
  alert ('hello');
});
 
Laatst bewerkt:
Je kan niet zomaar PHP mengen met javascript. PHP wordt eerst uitgevoerd door de webserver, en javascript door de browser. Op het moment dat de browser jouw code wil uitvoeren is dus ook al meteen de text/html output van het PHP-script binnengekomen.

De enige oplossing om een PHP-bestand via JavaScript aan te roepen is via een AJAX-request.
 
Laatst bewerkt:
Allerlei dingen al geprobeerd vandaag maar ik krijg het niet voor elkaar.
De bedoeling is dat er stukjes code uitgevoerd worden door het drukken op de powerButton.
Enerzijds dient het stukje code genaamd power uitgevoerd te worden welk in het javascript staat vanwaar uit deze aangeroepen wordt en als tweede dient er een PHP script genaamd now_playing.php uitgevoerd worden.

Hiervoor heb ik het gedeelte van ajax toegevoegd.

Code:
const power = () => {
 	console.log('power');
	var state = "press"
	var sender = "Gabbo"
        var key = "POWER"
	var bodyOfRequest = apis.boseSoundTouch.getKeyUrlBody(state,sender,key)
	apiCall('key', bodyOfRequest)
};

Code:
powerButton.addEventListener('click', function() { 
	power,
	
	$.ajax({
    type: "GET",
    url: "/php/now_playing.php",
    data: {
        
    },
    success: function (data) {
        alert(data);

    }
  });
});
 
- Wordt de jQuery-library wel ingeladen?
- Kijk eens in je browser of de AJAX-request wel plaatsvindt, en of je wat teruggkrijgt.
 
De Ajax library werd inderdaad niet ingeladen en bij de verwijzing van de Url was er een deeltje van het path dat ontbrak.
Intussen is dit ook gelukt.

Nu is het nog de bedoeling dat de pagina opnieuw laad zodra de functie is uitgevoerd. Ik heb hiervoor bij success de opdracht location.reload() vermeld.
De ene keer dat ik op de knop druk om de javascript opdracht uit te voeren gaat alles zoals bedoeld, maar de andere keer weer niet.

Code:
 $.ajax({
    type: "GET",
    url: "/bose/php/now_playing.php",
    data: {
        
    },
    success: function (data) {
       location.reload();
    }
    
  });

Ik heb de indruk dat de reload gebeurt voordat de PHP functie volledig beeindigd is.
Kan ik dit voorkomen ?
 
Als ik een alert zet voor de reload, gebeurt wel alles zoals het moet. Alleen heb ik de alert hier niet nodig, maar dit geeft wellicht voldoende tijd om de PHP code volledig uit te voeren voordat de reload gebeurt.
 
Een reload lijkt mij niet de bedoeling bij een AJAX-request. Daarmee haal je de magie onderuit waar het voor bedoeld is.
de data die je krijgt kan je prima weer in je HTML verwerken, en zo realtime zonder refreshes iets aanpassen.

Verder snap ik dat laatste niet helemaal. Dat laden van het script is al in no-time gebeurd. Dus waar wacht je dan op?
 
De reden van het wachten heeft te maken met mijn versterker. Als ik op de power button druk schakelt de versterker zich afwisselend in en uit.
Bij de eerste opstart van het programma wordt er een php script gestart (now_playing.php) om te controleren of de versterker aan staat of uit.
Als de versterker aan het spelen is en er wordt op de power button gedrukt, schakelt de versterker zich uit en wordt het script (now_playing.php ) ook uitgevoerd.

De reactie snelheid van de versterker in dit geval is onmiddellijk waardoor het script now_playing het gewenste resultaat geeft. Indien het omgekeerd is en de versterker ingeschakeld wordt, heeft de versterker enkele seconden nodig om te starten. Hierdoor gebeurt het vaak dat het het script now_playing al uitgevoerd is terwijl de versterker nog niet zover is.

Ik probeer het nu op een andere manier op te lossen maar hiervoor moet ik een variabele die bepaald is in het php script in javascript kunnen ontvangen om hier verder mee te werken.
Ik probeer dit nu met een test in de vorm van
Code:
alert('<?php echo $resultaat ?');
maar hierdoor verschijnt <?php echo $resultaat ?> in de message box, wat ook weer niet de bedoeling is.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan