2016-11-06 4 views
9

Я использую location.href, чтобы получить полный URL-адрес в адресной строке браузера.
Чтобы предоставить более подробную информацию, важно отметить, что наш сервис имеет файл js, который будет включен в наши сайты клиентов. Таким образом, этот JS-файл будет генерировать полный URL-адрес заявителя.location.href return strange URL

Я думал, что этот URL-адрес является каким-то предыдущим URL-адресом, перенаправленным на реальный домен, но как я должен предотвратить это действие?

Линия JS кода, который будет генерировать ссылку на атрибут Src 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=' 

Примеры заявителя 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

. ..

иногда странный URL-адрес, созданный location.href, и я не знаю, в чем причина. Например:

Main URL является то, что, как показано ниже: http://saten.ir/tag/%D8%A8%DB%8C%D9%88%DA%AF%D8%B1%D8%A7%D9%81%DB%8C-%D8%A7%D9%85%DB%8C%D8%B1%D8%B9%D8%A8%D8%A7%D8%B3-%D9%81%D8%AE%D8%B1%D8%A2%D9%88%D8%B1/

Но URL, возвращаемый location.href, как показано ниже:
http://www.google.com/search?site=&source=hp&ei=mpkeWIvHKYWbsgGtxaSQBg&q=%D8%A7%D9%85%D9%8A%D8%B1%D8%B9%D8%A8%D8%A7%D8%B3+%D9%81%D8%AE%D8%B1%D8%A7%D9%88%D8%B1&oq=%D8%A7%D9%85%D9%8A%D8%B1%D8%B9%D8%A8%D8%A7%D8%B3+%D9%81%D8%AE%D8%B1%D8%A7%D9%88%D8%B1&gs_l=mobile-gws-hp.3...4752.15339.0.16567.0.0.0.0.0.0.0.0..0.0....0...1c.1.64.mobile-gws-hp..0.0.0.UFWL1tf4KDM#scso=uid_WB6ZrwAGHJ0KLAXLjA8j8w_10:2120,uid_WB6aQQAGpZkKLNwFPgmnbA_10:2120

+0

Я не могу повторить вопрос в Chrome - window.location.href всегда должен возвращать текущие страницы URL-единственный экземпляр, который я могу думать что это может быть не так, если бы он был изменен с использованием API истории HTML5. Есть ли определенный браузер или процесс, который вы использовали для создания этой проблемы? – Brian

+0

@Brian Спасибо за ответ, я добавлю дополнительный вариант в свой журнал, чтобы увидеть клиентского агента клиента, и я сообщу вам как можно скорее –

+0

@Brian Некоторые примеры клиента UA добавлены к вопросу –

ответ

2

попробовать сделать это

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

в основном является то же, что и location.href, но он должен работать

+0

@Hossein Shahsahebi у вас есть время, чтобы проверить это? – Emiliano

0

На самом деле я не смог воспроизвести ошибку, во всех тестах, которые я сделал, ваш код получил правильное местоположение.href.

Единственная проблема, с которой я могу думать, может заключаться в том, что вы создаете свою ссылку, когда строите свой класс.

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(); 

Делая это, как это означает, что url фактически заселена, когда .js файл загружен.

Что вы получаете, это определенно реферер, как если бы в старых версиях браузера Android вы действительно загружали сценарий до изменения location.href, или есть какая-то предварительная выборка (например, загрузка браузера с следующей страницы прежде чем перейти на следующую страницу).

Получение location.href после загрузки dom должно быть лучше. Вы можете попробовать, чтобы проверить, в каком состоянии вы находитесь, прежде чем получать 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(); 
} 
+0

Спасибо за ваш ответ, но проблема в инициализации 'url_show' на' readystatechange' слишком поздняя, ​​чтобы использовать переменную. –

+0

, но я изменил код, чтобы обрабатывать эту переменную как можно дольше –

+1

@HosseinShahsahebi. Я собирался спросить, можете ли вы заставить его работать, если вы ждали, что readystate изменится с неинициализированного на загрузку или загрузку. Еще лучше, вы могли бы проверить свою функцию init для вашего текущего состояния, чтобы увидеть, следует ли сразу создавать или ждать. – Kesty