Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Ajax javascript innerHTML

Ostatnio zmodyfikowano 2020-07-30 19:51
Autor Wiadomość
Kinzoku99
Temat założony przez niniejszego użytkownika
Ajax javascript innerHTML
» 2020-07-30 18:17:13
Mam taką funkcję ajaxopodobną w javascripcie. Niestety metoda innerHTML ignoruje skrypty javascripta w przemieszanych plikach (np url = "costam.php") przez co zawartość nie działa poprawnie. Da się ją jakoś zmodyfikować żeby sobie radziła z tym? Może być dodatkowe magiczne JQuery czy nawet jakiś kod PHP typu POST GET, byleby działało ;)


function loadDoc(url) {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
        if(this.readyState == 4 && this.status == 200) {
            document.getElementById("page").innerHTML =
            this.responseText;
       }
    };
    xhttp.open("GET", url, true);
    xhttp.send();
}
P-177391
killjoy
» 2020-07-30 18:42:45
Funkcja wygląda na poprawną - odpaliłem na minimalnym serwerze http pythona i działa. Jesteś pewien, że odwołujesz się do poprawnego URI (jeżeli wpiszesz tak jak podajesz w poście, będziesz się odwoływał relatywnie do obecnej lokacji np. http://127.0.0.1/asd -> http://127.0.0.1/asd/costam.php.). Jaki status zwraca XMLHttpRequest w callbacku? A może ładujesz jakąś zewnętrzną stronę i blokuje to CORS? Spójrz na konsolę JS w przeglądarce, mogą tam być przydatne informacje.
P-177392
Kinzoku99
Temat założony przez niniejszego użytkownika
» 2020-07-30 19:18:41
Ogólnie to cała zawartość się pokazuje z HTML i CSS taka jak powinna. Problem w tym, że np mam skrypt video.js:

var v = document.getElementsByTagName('video')[0];
     
v.addEventListener('timeupdate', function()
{
var p = document.getElementsByTagName('progress')[0];
p.value = 100*this.currentTime/this.duration;
});

To jest plik galeria.php

<video width="480" height="270" autoplay=false>
<source src="galeriafilm.mp4" type="video/mp4">
Twoja przegladarka nie wspiera elementu video.
</video>

<nav>
<button id="start" onclick="v.play()">Play</button>
<button id="stop" onclick="v.currentTime=0;v.pause()">Stop</button>
<button id="pause" onclick="v.pause()">Pause</button>
<progress value="0" max="100" step="0.1"></progress>
</nav>

<script src="video.js"></script>

I wrzucam to funkcją, którą wysłałem w temacie do diva "page" w pliku index.php.

Okazuje się, że wszystko działa oprócz skryptu video.js jakby był ignorowany...
P-177393
DejaVu
» 2020-07-30 19:28:51
Wciśnij CTRL+SHIFT+I w przeglądarce, odśwież stronę i zobacz czy masz błędy (jeżeli tak to jakie).
P-177394
Kinzoku99
Temat założony przez niniejszego użytkownika
» 2020-07-30 19:35:46
Niestety muszę wrzucić grafikę bo tego nie rozumiem :'(
https://zapodaj.net​/922266f93b889.png.html

Jest niby coś przy tworzeniu tego obiektu
P-177395
killjoy
» 2020-07-30 19:38:35
Ładując znacznik <script> przez innerHtml nie uruchomisz skryptu, nie z poziomu czystego JS: https://developer.mozilla.org​/en-US/docs/Web/API/Element​/innerHTML, sekcja Security considerations:

HTML5 specifies that a <script> tag inserted with innerHTML should not execute.
Musiałbyś ręcznie odpalić eval() na skrypcie.

Da się to podobno zrobić w jQuery. Tu jest kilka rozwiązań (nie tylko w jQuery):
https://stackoverflow.com​/questions/2592092​/executing-script-elements-inserted-with-innerhtml

#edit: Chociaż jak widzę takie używanie eval(), to aż mnie ciary przechodzą.
P-177396
Kinzoku99
Temat założony przez niniejszego użytkownika
» 2020-07-30 19:51:11

var setInnerHtml = function(elm, html) {
  elm.innerHTML = html;
  var scripts = elm.getElementsByTagName("script");
  var scriptsClone = [];
  for (var i = 0; i < scripts.length; i++) {
    scriptsClone.push(scripts[i]);
  }
  for (var i = 0; i < scriptsClone.length; i++) {
    var currentScript = scriptsClone[i];
    var s = document.createElement("script");
    for (var j = 0; j < currentScript.attributes.length; j++) {
      var a = currentScript.attributes[j];
      s.setAttribute(a.name, a.value);
    }
    s.appendChild(document.createTextNode(currentScript.innerHTML));
    currentScript.parentNode.replaceChild(s, currentScript);
  }
}

Ta funkcja robi co potrzeba jak się ją da zamiast elm.innerHTML = html.
Zamykam temat ;)
P-177397
« 1 »
  Strona 1 z 1