location.href return URL estranho

9

Estou usando location.href para obter o URL completo na barra de endereço do navegador.
Para fornecer mais detalhes, é importante observar que nosso serviço tem um arquivo js que será incluído nos sites de nossos clientes. Portanto, este arquivo JS irá gerar o URL completo do candidato.

Eu pensei que esta URL é de alguma forma anterior URL redirecionada para o domínio real, mas como eu deveria evitar essa ação?

A linha do código JS que gerará um link para o atributo src do iframe é:

'http://sd.domain.ir/index.php?r=' + Math.floor(Math.random() * (100000000 - 0 + 1)) + 0 + '&ref=' + ((window.btoa) ? btoa(location.href) : 'ie') + '&responsive=' + ((document.querySelector('meta[name="viewport"][content*="width=device-width"]')) ? 'yes' : 'no') + '&params='

Exemplos de candidatos a UA: Mozilla\/5.0 (Linux; U; Android 4.3; en-us; HUAWEI G620-L72 Build\/HuaweiG620-L72) AppleWebKit\/534.24 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.24 T5\/2.0 bdbrowser\/6.1.0.4

Mozilla\/5.0 (Linux; U; Android 4.4.3; en-ae; HTC_One Build\/KTU84L) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30

Mozilla\/5.0 (Linux; U; Android 4.3; en-us; GT-I9300 Build\/JSS15J) AppleWebKit\/534.30 (KHTML, like Gecko) Version\/4.0 Mobile Safari\/534.30

...

às vezes estranho URL gerado por location.href e não sei qual é o motivo. Por exemplo:

O URL principal é algo como abaixo: link

Mas o URL retornado por location.href é o seguinte: link

    
por Hossein Shahsahebi 06.11.2016 в 09:03
fonte

2 respostas

2

tente fazer isso

var myurl = location.origin + decodeURIComponent(location.pathname);

basicamente é o mesmo que fazer location.href mas deve funcionar

    
por Emiliano 14.11.2016 / 23:05
fonte
0

Na verdade, eu não consegui reproduzir o bug, em todos os poucos testes que fiz, seu código obteve a localização correta.href.

O único problema que posso pensar nisso é que você está criando o seu link quando estiver criando sua turma.

var my_obj = {
     /*...*/
     url: "http://sd.domain.ir/index.php?r=" + Math.floor(Math.random() * (1e8 + 1)) + "0&ref=" + (window.btoa ? btoa(location.href) : "ie") + "&responsive=" + (document.querySelector('meta[name="viewport"][content*="width=device-width"]') ? "yes" : "no") + "&params=",
     /*...*/
}
my_obj.init();

Fazê-lo assim significa que url é realmente preenchido quando o arquivo .js é carregado.

O que você consegue é definitivamente um referenciador, como se em versões antigas do navegador Android você realmente carregasse o script antes de mudanças location.href, ou houvesse algum tipo de pré-busca (como o carregamento do navegador da próxima página antes indo para a próxima página).

Obter location.href após o dom ter sido carregado deve ser melhor. Você pode tentar verificar em que estado você está antes de obter o href:

var my_obj = {
     init: function(){
            my_obj.url =  "http://sd.domain.ir/index.php?r=" +Math.floor(Math.random() * (1e8 + 1)) + "0&ref=" + (window.btoa ? btoa(location.href) : "ie") + "&responsive=" + (document.querySelector('meta[name="viewport"][content*="width=device-width"]') ? "yes" : "no") + "&params=";
     }
     /*...*/,
     url: ""
}

if(document.readyState == "uninitialized" || document.readyState == "loading "  || document.readyState == "loaded"){
    document.onreadystatechange = function(){
        if (document.readyState == "interactive") {
            my_obj.init();
         }
    } 
}else{
   my_obj.init();
}
    
por Kesty 15.11.2016 / 12:16
fonte