Как определить, был ли пользователь увеличен или удален в JavaScript [дубликат]

Вы можете использовать словари для этого. Словари - это хранилища ключей и ценностей.

>>> dct = {'x': 1, 'y': 2, 'z': 3}
>>> dct
{'y': 2, 'x': 1, 'z': 3}
>>> dct["y"]
2

Вы можете использовать имена переменных ключей для достижения эффекта переменных переменных без риска для безопасности.

>>> x = "spam"
>>> z = {x: "eggs"}
>>> z["spam"]
'eggs'

В тех случаях, когда вы думаете сделать что-то вроде

var1 = 'foo'
var2 = 'bar'
var3 = 'baz'
...

список может быть более подходящим, чем dict. Список представляет упорядоченную последовательность объектов с целыми индексами:

l = ['foo', 'bar', 'baz']
print(l[1])           # prints bar, because indices start at 0
l.append('potatoes')  # l is now ['foo', 'bar', 'baz', 'potatoes']

Для упорядоченных последовательностей списки удобнее, чем dict с целыми ключами, потому что списки поддерживают итерацию в порядке индекса, slicing , append и другие операции, которые потребуют неудобного управления ключами с помощью dict.

139
задан user123093 15 June 2009 в 13:46
поделиться

12 ответов

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

Я нашел два способа определения уровня масштабирования. Один из способов обнаружения изменений уровня масштабирования зависит от того, что процентные значения не увеличены. Процентное значение относительно ширины окна просмотра и, таким образом, не зависит от масштабирования страницы. Если вы вставляете два элемента: один с положением в процентах и ​​один с одинаковой позицией в пикселях, они будут раздвигаться, когда страница будет увеличена. Найдите соотношение между положениями обоих элементов, и у вас есть уровень масштабирования. См. Тестовый пример. http://web.archive.org/web/20080723161031/http://novemberborn.net/javascript/page-zoom-ff3

Вы также можете сделайте это, используя инструменты вышеупомянутого сообщения. Проблема в том, что вы более или менее принимаете обоснованные предположения относительно того, увеличилась ли страница. Это будет работать лучше в некоторых браузерах, чем в других.

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

70
ответ дан hichris123 22 August 2018 в 18:55
поделиться
  • 1
    Можно проверить параметры размера внутри обработчика onload для тела. Любопытно, что при отладке IE8 против 9 кажется, что обработчик onresize для тела передается документом в IE8, а IE9 передает это окно, как и Chrome. – Walter K 8 August 2012 в 22:57
  • 2
    Если вы разместите два элемента в одинаковых положениях и загрузите страницу при увеличении, не будет ли смещение между этими двумя элементами? Разве это не означает, что страница уже была увеличена или нет? – vijayant 27 June 2017 в 15:06
  • 3
    также document.body.offsetWidth – Samy Bencherif 5 July 2017 в 22:23
  • 4
    Использование такого метода также срабатывает, когда пользователь изменяет размер окна, поэтому почему бы просто не использовать прослушиватель событий изменения размера? В этом случае это также жизнеспособное решение. – newplayer65 19 August 2017 в 04:22

Я хотел бы предложить усовершенствование предыдущего решения с отслеживанием изменений в ширину окна. Вместо сохранения собственного массива прослушивателей событий вы можете использовать существующую систему событий javascript и запускать собственное событие при изменении ширины и привязывать к нему обработчики событий.

$(window).bind('myZoomEvent', function() { ... });

function pollZoomFireEvent() 
{ 

    if ( ... width changed ... ) {
        $(window).trigger('myZoomEvent');
    }
}

Дроссель / debounce может помочь снизить скорость вызовов вашего обработчика.

2
ответ дан Alexey 22 August 2018 в 18:55
поделиться
  • 1
    Throttle / debounce полезен только в том случае, если опрос инициируется некоторыми другими событиями (например, движение мыши или клавиатура). – fuzzyTew 15 October 2011 в 01:49

На iOS 10 можно добавить прослушиватель событий к событию touchmove и обнаружить, если страница будет увеличена текущим событием.

var prevZoomFactorX;
var prevZoomFactorY;
element.addEventListener("touchmove", (ev) => {
  let zoomFactorX = document.documentElement.clientWidth / window.innerWidth;
  let zoomFactorY = document.documentElement.clientHeight / window.innerHeight;
  let pageHasZoom = !(zoomFactorX === 1 && zoomFactorY === 1);

  if(pageHasZoom) {
    // page is zoomed
    
    if(zoomFactorX !== prevZoomFactorX || zoomFactorY !== prevZoomFactorY) {
      // page is zoomed with this event
    }
  }
  prevZoomFactorX = zoomFactorX;
  prevZoomFactorY = zoomFactorY;
});

1
ответ дан alwe 22 August 2018 в 18:55
поделиться

Вы также можете получить события изменения размера текста и коэффициент масштабирования, введя div, содержащий по крайней мере неразрывное пространство (возможно, скрытое) и регулярно проверяя его высоту. Если высота изменяется, размер текста изменился (и вы знаете, сколько - это также срабатывает, кстати, если окно будет увеличено в полностраничном режиме, и вы все равно получите правильный коэффициент масштабирования с одинаковой высотой / высота соотношение).

1
ответ дан Argo 22 August 2018 в 18:55
поделиться

Хорошая новость, все люди! Новые браузеры вызывают событие изменения размера окна при изменении масштаба.

5
ответ дан Ben 22 August 2018 в 18:55
поделиться
  • 1
    Chrome и Firefox для Android не будут запускать событие изменения размера при масштабировании. – lowtechsun 25 January 2017 в 19:43
  • 2
    Это не хорошая новость, если вы не хотите, чтобы масштабирование вызывало событие изменения размера. – Reahreic 1 February 2017 в 23:26
  • 3
    Лучшая новость будет фактическим событием масштабирования, отличным от события изменения размера. – Vincent 15 February 2017 в 04:41
  • 4
    И то, и другое. Ред. – Ben 15 September 2017 в 21:02

Это работает для меня:

        var deviceXDPI = screen.deviceXDPI;
        setInterval(function(){
            if(screen.deviceXDPI != deviceXDPI){
                deviceXDPI = screen.deviceXDPI;
                ... there was a resize ...
            }
        }, 500);

Это необходимо только для IE8. Все другие браузеры, естественно, генерируют событие изменения размера.

6
ответ дан Bill Keese 22 August 2018 в 18:55
поделиться
  • 1
    Используя jQuery, IE8 правильно генерирует событие изменения размера. – designermonkey 21 July 2012 в 17:02

Существует отличный плагин, построенный из yonran, который может выполнять обнаружение. Вот его ранее ответил вопрос на StackOverflow. Он работает для большинства браузеров. Приложение так же просто:

window.onresize = function onresize() {
  var r = DetectZoom.ratios();
  zoomLevel.innerHTML =
    "Zoom level: " + r.zoom +
    (r.zoom !== r.devicePxPerCssPx
        ? "; device to CSS pixel ratio: " + r.devicePxPerCssPx
        : "");
}

Демо

3
ответ дан Community 22 August 2018 в 18:55
поделиться
  • 1
    Функция обнаружения-увеличения, похоже, переместилась на github.com/tombigel/detect-zoom – Ferruccio 20 August 2014 в 15:44
  • 2
    Не работает в Firefox для Android 4.4.2. Также в FF для мобильных устройств нажмите кнопку Always enable zoom в опции «Доступность». Демонстрация не будет реагировать на изменение. – lowtechsun 25 January 2017 в 02:10
0
ответ дан dandeto 22 August 2018 в 18:55
поделиться

Я использую этот фрагмент JavaScript, чтобы реагировать на «события» Zoom. Он проверяет ширину окна. (Как несколько предложено на этой странице (к которому привязал Иэн Эллиот): http://novemberborn.net/javascript/page-zoom-ff3 [архив] )

Протестировано с Chrome, Firefox 3.6 и Opera, а не с IE.

С уважением, Magnus

var zoomListeners = [];

(function(){
  // Poll the pixel width of the window; invoke zoom listeners
  // if the width has been changed.
  var lastWidth = 0;
  function pollZoomFireEvent() {
    var widthNow = jQuery(window).width();
    if (lastWidth == widthNow) return;
    lastWidth = widthNow;
    // Length changed, user must have zoomed, invoke listeners.
    for (i = zoomListeners.length - 1; i >= 0; --i) {
      zoomListeners[i]();
    }
  }
  setInterval(pollZoomFireEvent, 100);
})();
10
ответ дан Derek 朕會功夫 22 August 2018 в 18:55
поделиться
  • 1
    как насчет ложных срабатываний при изменении размеров окна? – gcb 10 December 2010 в 20:30
  • 2
    – KajMagnus 14 April 2011 в 03:25
  • 3
    Но вы можете отфильтровать эти случаи, когда вы также реализуете обработчик onresize. Итак, основы для решения здесь я бы сказал. – Stijn de Witt 9 November 2012 в 14:54
  • 4
    @StijndeWitt После прочтения этого я начинаю понимать предлагаемый путь, теперь я работаю над решением с фильтрацией событий изменения размера, особенно на мобильных устройствах. Кто угодно? – lowtechsun 25 January 2017 в 01:45
  • 5
    Ложные срабатывания - проблема, да. Разве это не устранит 99,99% всех ложных срабатываний, проверяя, поддерживалось ли соотношение сторон? Попросите сценарий запомнить последнее соотношение и вычислить новое соотношение & amp; проверьте, совпадают ли они. Объедините это с разной шириной, и у вас должна быть хорошая база – Biepbot Von Stirling 30 December 2017 в 13:35

Я отвечаю на 3-летнюю ссылку, но я думаю, что это более приемлемый ответ:

Создать файл .css as,

@media screen and (max-width: 1000px) 
{
       // things you want to trigger when the screen is zoomed
}

EG: -

@media screen and (max-width: 1000px) 
{
    .classname
    {
          font-size:10px;
    }
}

Приведенный выше код делает размер шрифта «10px» при увеличении экрана примерно до 125%. Вы можете проверить различные уровни масштабирования, изменив значение «1000px».

-3
ответ дан Saumil Soni 22 August 2018 в 18:55
поделиться
  • 1
    Какова связь между коэффициентом max-width и коэффициентом масштабирования? – seebiscuit 11 January 2016 в 23:56
  • 2
    Этот код будет выполнен на каждом экране размером 1000 пикселей и не имеет ничего общего с масштабированием – Artur Stary 17 February 2016 в 10:52
  • 3
    @ArturStary нет способа определить, увеличен ли браузер, но есть много обходных решений, и один из них - то, что я упомянул в своем ответе. Более того, я сказал, что вы можете изменить значение 1000px, чтобы проверить разные размеры экрана, что даст эффект разного уровня масштабирования – Saumil Soni 17 February 2016 в 21:58
0
ответ дан SchoolforDesign 22 August 2018 в 18:55
поделиться

у меня была эта проблема и наконец. У меня есть решение. это просто и работает для меня. ("Mozilla / 5.0 (X11; Linux x86_64; Gecko / 20100101 Firefox / 50.0).

px ratio = отношение физического пикселя к css px. При любом одном увеличении пиксели окна просмотра уменьшаются и должны соответствовать экран должен увеличиваться, но при изменении размера окна размер экрана уменьшается, а также и пиксели. Таким образом, соотношение будет поддерживаться.

[g2] zoom: инициировать событие windows.resize -> и изменять px_ratio resizing: вызвать событие windows.resize -> не изменяется px_ratio [/g2]
function chkboxToggle() {
  if ($('input#chkbox').attr('checked'))
    // do something
  else
    // do something else
}
0
ответ дан abilogos 5 November 2018 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: