[Ajax] Usuwanie nowych linii

0

Witam,
Mam pewien mały problem. Zrobiłem rozwijaną listę, każdej opcji nadałem atrybut value="n" i napisałem skrypt w ajaksie, pozwalający na przeniesienie do wybranej z listy strony. Pobiera się odpowiednia wartość value, tylko że problem jest taki, że pobiera się ona z reklamami ;/

        function sendRequest()
        {
        
             var skocz = document.getElementById('skocz').options[document.getElementById('skocz').selectedIndex].value.replace(/[\n\r](?:.|[\n\r])*/, '');
             xHRObject.open("GET", "skocz.php?do=" + skocz, true);
             xHRObject.send(null);
        }

Użyłem metody replace(), więc co jest nie tak?

0

Wewnątrz opcji w tym polu select masz reklamy? o_O Bo stamtąd je usuwasz. Ten kod Cię w żadnym razie nie zabezpieczy, jeśli ten GET do skocz.php wypluwa na końcu reklamy.

Może daj link do żywego projektu...

0

Wygląda to tak:

index.php:

<script type="text/javascript">

        var xHRObject = false;
        
        //browser support code
        
        if (window.XMLHttpRequest)
        {
        
             xHRObject = new XMLHttpRequest();
             
        }
        else if (window.ActiveXObject)
        {
        
             xHRObject = new ActiveXObject("Microsoft.XMLHTTP");
             
        }
        else
        {

             alert('Change your browser. This one does not support ajax.');
        }
        
        //sending function
        
        function sendRequest()
        {
        
             var skocz = document.getElementById('skocz').options[document.getElementById('skocz').selectedIndex].value.replace(/[\n\r](?:.|[\n\r])*/, '');
             xHRObject.open("GET", "skocz.php?do=" + skocz, true);
             xHRObject.send(null);
        }

</script>

           <form id="myForm">
              <select id="skocz" onchange="sendRequest(this.options[this.selectedIndex].value);">
                 <optgroup label="Rekrutacja">
                   <option value="1">Rekrutacja</option>
                 </optgroup>
                 <optgroup label="Modding">
                   <option value="2">Tutoriale</option>
                   <option value="3">Tekstury</option>
                   <option value="4">Skrypty</option>
                   <option value="5">Modele</option>
                   <option value="6">Programy</option>
                 <optgroup label="Hyde Park">
                   <option value="7">Piszcie co chcecie</option>
                   <option value="8">Wasze pomysły</option>
                 </optgroup>
               </select>
             </form>

skocz.php

<?php
     echo $_GET['do'];
?>

Później zamiast echo $_GET['do'] zrobie header('Location: tematy.php?forum='.$_GET['do']), tylko najpierw chciałem zobaczyć jak wygąda ta zmienna. No i wygąda niestety np. tak:

2

<script type="text/javascript" src="http://analytics.hosting24.com/count.php"></script>

<noscript>web hosting</noscript>

0

Nie, nie. Zapewne jest tak, że zmienna $_GET['do'] jest zupełnie OK, tj. nie zawiera żadnych reklam. Po prostu do końca tego, co wygeneruje skocz.php, serwer dokłada te swoje nieszczęsne reklamy. Sprawdź sobie np. zamieniając to echo na takie:

     echo '(PRZED ZMIENNĄ DO)' . $_GET['do'] . '(PO ZMIENNEJ DO)';

Założę się, że będziesz miał coś takiego:

(PRZED ZMIENNĄ DO)2(PO ZMIENNEJ DO)
<!-- www.000webhost.com Analytics Code -->
<script type="text/javascript" src="http://analytics.hosting24.com/count.php"></script>
<noscript><a href="http://www.hosting24.com/"><img src="http://analytics.hosting24.com/count.php" alt="web hosting" /></a></noscript>
<!-- End Of Analytics Code -->

Czyli sama zmienna do idzie na serwer poprawnie. Dopiero na serwerze do wyniku działania skryptu dokładane są reklamy. A w tym małym testowym skrypcie, jaki napisałeś, wygląda to tak jakby sama zmienna DO była zwalona.

Serwery nie mają w zwyczaju dopisywać coś do żądań. Do odpowiedzi niestety tak (ale to te lipne/darmowe).

0

Dzięki. Zmieniłem trochę kod bo zorientowałem się, że umieszczając w skrypcie PHP funkcje header() i tak nigdzie mnie nie przeniesie tym sposobem co ja zrobiłem :P

Teraz ajaksowy kod wygląda tak:

    function sendRequest()
    {
    
         var skocz = document.getElementById('skocz').options[document.getElementById('skocz').selectedIndex].value.replace(/[\n\r](?:.|[\n\r])*/, '');
         xHRObject.open("POST", "skocz.php", true);
         xHRObject.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
         xHRObject.onreadystatechange = getData;
         xHRObject.send("do=" + skocz.value);
    }
    
    function getData()
    {
         if(xHRObject.readyState == 4)
         {
              setTimeout("window.location.href="tematy.php?forum=" + xHRObject.responseText.replace(/[\n\r](?:.|[\n\r])*/, ''), 1000);
         }
    }

Powiedz mi, jak powinna wyglądać ta funkcja setTimeout()? Jak na razie firebug pokazuje, że sendRequest() jest neizdefiniowana. Mam nadzieje, że ten sposób zadziała ;)

0

Sam pomysł z tym gdzie umieścić to czyszczenie z metodą replace masz jak najbardziej dobry. Ino coś chyba namieszałeś z tymi cudzysłowami w setTimeout i przez to kod "się nie kompiluje" (pamiętaj, że w JavaScripcie możesz zamykać stringi zarówno w cudzysłowach, jak i apostrofach).

Ale ponownie, lepiej to zrobić po prostu inaczej ;-). Bez cudzysłowów, omijając tego typu problemy.

Jako pierwszy parametr setTimeout nie powinno się podawać stringa z kodem do wykonania. Jest to możliwe, ale to tak, jakbyś zrobił eval. A jak wiadomo, eval is evil. Zamiast tego funkcji setTimeout przekazuje się w pierwszym argumencie inną funkcję.

Czyli piszesz sobie gdzieś funkcję redirect:

function redirect() {
  var cleanResponseText = xHRObject.responseText.replace(/[\n\r](?:.|[\n\r])*/, '');
  window.location.href="tematy.php?forum=" + cleanResponseText;
}

A w funkcji getData przekazujesz ją do setTimeout:

function getData()
{
     if(xHRObject.readyState == 4)
     {
          setTimeout(redirect, 1000);
     }
}

Co ciekawe, ponieważ funkcji redirect używasz tylko wewnątrz getData, możesz -- w ramach hermetyzacji -- umieścić ją wewnątrz funkcji getData:

function getData()
{
     function redirect() {
          var cleanResponseText = xHRObject.responseText.replace(/[\n\r](?:.|[\n\r])*/, '');
          window.location.href="tematy.php?forum=" + cleanResponseText;
     }

     if(xHRObject.readyState == 4)
     {
          setTimeout(redirect, 1000);
     }
}

To po prostu funkcja zagnieżdżona -- redirect jest widoczna tylko wewnątrz getData.

Co być może jeszcze ciekawsze, ponieważ funkcji zagnieżdżonej używasz tylko raz, nie musisz jej nawet nadawać nazwy (redirect), bo chcesz ją po prostu raz utworzyć i przekazać do setTimeout, nic więcej. Możesz więc użyć funkcji anonimowej, o tak:

function getData()
{
     if(xHRObject.readyState == 4)
     {
          setTimeout(function() {
               var cleanResponseText = xHRObject.responseText.replace(/[\n\r](?:.|[\n\r])*/, '');
               window.location.href="tematy.php?forum=" + cleanResponseText;
          }, 1000);
     }
}
0

Dzięki za pomoc i wytłumaczenie, teraz wszystko działa ;) Jesteś wielki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1