#javascript #jquery #mobile
#javascript #jquery #Мобильный
Вопрос:
Я пытаюсь использовать скрипт Kangax отсюда: http://kangax.github.com/cft для обнаружения тех браузеров, которые «правильно» реализуют позицию: исправлено, как это делают настольные браузеры, по сравнению с мобильными браузерами, чтобы я мог использовать jQuery для подделки в мобильных браузерах.
Код из Kangax работает нормально. Однако, когда я включаю его на свою страницу, этого не происходит. Я думаю, что это должно быть какой-то очевидной ошибкой. Любая помощь была бы действительно оценена!
////Detect whether position:fixed works (mobile browsers). Use JS to position #navwrap if not.
//Kangax's script - begins at "function" on the next line.
function detected() {
var container = document.body;
if (document.createElement amp;amp;
container amp;amp; container.appendChild amp;amp; container.removeChild) {
var el = document.createElement("div");
if (!el.getBoundingClientRect) {
return null;
}
el.innerHTML = "x";
el.style.cssText = "position:fixed;top:100px;";
container.appendChild(el);
var originalHeight = container.style.height, originalScrollTop = container.scrollTop;
container.style.height = "3000px";
container.scrollTop = 500;
var elementTop = el.getBoundingClientRect().top;
container.style.height = originalHeight;
var isSupported = elementTop === 100;
container.removeChild(el);
container.scrollTop = originalScrollTop;
return isSupported;
}
return null;
};
if (detected()) {
alert ('non-mobile');
}
else {
alert ('mobile');
}
В случае, если это поможет, исходный код (максимально урезанный):
<body>
<h2>Position Fixed Test</h2>
<script>
(function(__global){
// make sure `window` resolves to a global object
var window = this;
var features = { };
features.IS_POSITION_FIXED_SUPPORTED = (features.__IS_POSITION_FIXED_SUPPORTED = function () {
var container = document.body;
if (document.createElement amp;amp;
container amp;amp; container.appendChild amp;amp; container.removeChild) {
var el = document.createElement("div");
if (!el.getBoundingClientRect) {
return null;
}
el.innerHTML = "x";
el.style.cssText = "position:fixed;top:100px;";
container.appendChild(el);
var originalHeight = container.style.height, originalScrollTop = container.scrollTop;
container.style.height = "3000px";
container.scrollTop = 500;
var elementTop = el.getBoundingClientRect().top;
container.style.height = originalHeight;
var isSupported = elementTop === 100;
container.removeChild(el);
container.scrollTop = originalScrollTop;
return isSupported;
}
return null;
})();
__global.__features = features;
})(this);
(function(){
function detect() {
for (var i=0; i<1; i ) {
var testResult = __features['IS_POSITION_FIXED_SUPPORTED'];
alert ( testResult );
i ;
}
};
detect();
})();
</script>
</body>
Комментарии:
1. Оригинальный пример на kangax.github.com/cft успешно различает настольные и мобильные браузеры, но мой этого не делает. Я предполагаю, что я неправильно тестирую значение null против ISSU supported??
2. что вы видите и когда
3. Я всегда получаю предупреждение «не поддерживается». Я добавил исходный код выше. Этот код может определять, является ли браузер мобильным или нет. Мой не может. Приветствия.
Ответ №1:
Я предполагаю, что вы всегда получаете non-mobile
. Вы проверяете, что detected
существует, не выполняя функцию. Измените конец вашего JavaScript на
if (detected()) {
alert ('non-mobile');
}
else {
alert ('mobile');
}
Есть ли причина, по которой вы создаете функцию как анонимную функцию, назначенную переменной, а не как именованную функцию, например
function detected(){
// Function content.
}
Комментарии:
1. Спасибо за ответ. Я включил это, но без изменений : (Я также исправил именованную функцию против var — просто noob-ness.
2. Какой результат вы получаете? Код, который вы предоставили, отлично работает для меня http://jsfiddle.net/seRr3 / . Какое предупреждение вы получаете?
3. @phil — нет ничего плохого в объявлении функции как переменной, просто вы можете вызывать функцию только тогда, когда она находится в пределах области видимости.
4. Вы абсолютно правы в том, что он запускается и выдает предупреждение, но не то, которое я ожидаю.. Независимо от того, тестирую ли я на мобильном устройстве или на настольном компьютере, я получаю «not-mobile». Однако, когда я запускаю исходный скрипт на kangax.github.com/cft это успешно различает их — см. stickmanphotography.co.uk/box/ipad.png и stickmanphotography.co.uk/box/desktop.png для вывода оригинала.
Ответ №2:
Отсортировано. Спасибо за информацию.
Оказывается, моя версия кода работает нормально, но ее нужно поместить в тело страницы. Если это находится в Head, даже в вызове DOM Ready этого не происходит.
Просто нужно выяснить, почему сейчас! Но, по крайней мере, код работает.