Andrise programmeerimisalane WIKI

Suunamisel REFERER väärtuse hoidmine

JavaScript võimaldab kasutaja mõnele muule aadressile suunata läbi window omaduse location. Viimane on siis getter/setter tüüpi omadus, juhul kui omistada sellele tekstiline väärtus (setter), üritab JavaScript brauserit navigeerida aadressile, milleks on saadud tekstiväärtus.

window.location = 'http://www.neti.ee/';

Samas aga getterina töötades sisaldab location endas veel mitmeid omadusi ja meetodeid nagu omadus href (sisuliselt samasugune setter nagu location ise), meetod replace, mis asendab brauseris eesoleva lehe parameetrina saadud aadressiga ILMA brauseri navigeerimisajalukku viidet jätmata jne.

window.location.href = 'http://www.neti.ee'; // sama mis window.location = '...'
window.location.replace('http://www.neti.ee'); // brauseri ajalukku lehevahetusest jälge ei jää!

Kuigi window.location on seega üks igati kasulik moodustis, on sellel ka mõned puudused.

  • Ei ole võimalik märkida sihtkohaks teist akent või freimi, kui see milles skript ise asub
  • Internet Explorer ei edasta lehe aadressi, kus skript asus REFERER aadressina, seega sihtkoht ei saa teada kust lehelt päring tuli

Õnneks on kõik korraldatav, window.location asemel tuleb kasutada lihtsalt mingit muud varianti kasutaja suunamiseks teisele aadressile. Katsetuste järgi sobib selle jaoks kõige paremini <FORM method=GET> kasutamine. Tuleb luua lehele dünaamiliset <form> element, seada selle meetodiks GET ja actioniks URL, soovi korral seada ka TARGET ja kutsuda vastloodud vormil välja sündmus SUBMIT. Brauser suunab peale seda kasutaja õige lehe juurde, säilub ka REFERER väärtus ja (vähemalt praegu) puudub mure PopUp Blockerite pärast, lehte saab vabalt avada ka uude aknasse.

/**
 * go(url [, target]) -> undefined
 * - url {string} veebiaadress mida soovitakse avada
 * - target {string} (valikuline) sihtraam kuhu aadress avada, näiteks "_blank"
 * Funktsioon suunab kasutaja brauseri ringi soovitud aadressile või avab uue akna
 */
function go(url, target){
    // loome vormielemendi
    var goform = document.createElement('form');
    // märgime selle peidetuks
    goform.style.display='none';
    // seame atribuudi METHOD=GET
    goform.setAttribute('method','get');
    // seame atribuudi ACTION=URL
    goform.setAttribute('action',url);
    // kui olemas, seame ka TARGET=TARGET
    if(target){
        goform.setAttribute('target',target);
    }
    // lisame loodud vormielemendi lehele
    document.body.appendChild(goform);
    // ja saadame ära
    goform.submit();
    // ja kustutame ka kohe (näiteks kui link avati uude aknasse)
    goform.parentNode.removeChild(goform);
}