Ускоритель IE8 останавливает таймер JavaScript

У нас есть приложение asp, в котором люди могут проходить тесты. На тестовой странице есть элемент управления asp, показывающий оставшееся время. Когда вы щелкаете правой кнопкой мыши по этому элементу управления, javascript, предоставляющий время, прерывается. Чтобы решить эту проблему, мы отключили щелчок правой кнопкой мыши. Но теперь я заметил, что если вы выделите текст и нажмете синюю кнопку ускорителя IE8, javascript также прервется. Отключение щелчка левой кнопкой мыши, конечно, не вариант.

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

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

Заранее спасибо.

Изменить

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

Изменить 2

Я попытался использовать метод с onSelectStart, но не повезло. Это мой тестовый html:

<html xmlns="http://www.w3.org/1999/xhtml" >
<SCRIPT LANGUAGE="JavaScript">
    function showObj() {
        //alert('?');
        return false;
    }
</SCRIPT>
<head>
    <title>Untitled Page</title>
</head>

<body onSelectStart="showObj()">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
        Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 
        Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. 
        Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
    </p>
</body>


person Terry    schedule 30.03.2011    source источник
comment
1- все равно можно сделать, точно так же. 2. Тогда, возможно, поможет компромисс. используйте оба времени, и если они близки (для некоторого значения закрытия), либо используйте одно из них, либо усредните их вместе. Если они далеко, вы знаете, что что-то не так, и использовать серверную часть.   -  person Brian M.    schedule 01.04.2011


Ответы (4)


Решение — отключить возможность выделения текста. Не похоже, что копирование + вставка будет необходимо в среде, в которой вы работаете.

В большинстве браузеров это делается с помощью CSS: user-select: none; (с префиксами браузера, если применимо).

Однако этот CSS недоступен в IE (хотя я не уверен насчет IE9, поэтому в любом случае его стоит включить), и, поскольку вы конкретно спрашиваете об IE, вам нужно альтернативное решение. К счастью, IE предоставляет один из них:

<div unselectable="on">...</div>

К сожалению, этот атрибут не наследуется, поэтому вам нужно указать его для каждого элемента, содержащего текст. (или вы можете написать функцию Javascript или JQuery, которая применяет ее к каждому элементу после загрузки страницы)

Наконец, и, возможно, лучший вариант: есть также метод onselectstart, который можно привязать к элементу. Что-то вроде этого отключит выделение текста: onselectstart = function(){ return false; }. Более того, это должно быть унаследовано дочерними тегами, поэтому вы можете просто поместить его в свой тег <body> и покончить с этим.

person Spudley    schedule 07.04.2011
comment
‹div unselectable=on›...‹/div› также передает атрибут дочерним элементам? - person Terry; 07.04.2011
comment
@djerry: Нет. Как я уже сказал, я считаю, что это не наследуется. - person Spudley; 07.04.2011
comment
@djerry: вместо этого я бы предложил использовать onselectstart. - person Spudley; 07.04.2011
comment
ладно, плохо, просмотрел, попробую между проектами - person Terry; 07.04.2011
comment
в конце концов это помогло, спасибо, что поставили меня на путь window.onload = function () { document.onselectstart = function () { return false; } // IE document.onmousedown = function () { return false; } // Mozilla } - person Terry; 08.04.2011

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

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

person Jamie Treworgy    schedule 30.03.2011
comment
тесты проводятся в контролируемой среде, поэтому нельзя использовать внешние скрипты или открывать какие-либо другие окна, поэтому только эта проблема делает возможным мошенничество - person Terry; 30.03.2011
comment
Можете ли вы быть уверены, что в любой среде конечные пользователи не смогут выполнять такие действия, как доступ к отладке сценариев в браузере? Если клиенты управляли конфигурацией браузера (например, это всегда IE, всегда одна версия, без плагинов, без просмотра веб-страниц и т. д.), тогда я согласен, но в этом случае ваши клиенты должны иметь возможность нажать изменение конфигурации, чтобы отключить ускоритель. Если нет, то пользователь всегда может что-то сделать. Я понимаю, что эта проблема не требует специальных знаний и поэтому гораздо более вероятна, но все же, почему бы просто не проверить время на сервере, а не на клиенте? - person Jamie Treworgy; 30.03.2011
comment
Этот проект просто нуждается в обслуживании и незначительных обновлениях. Мы не работаем над очисткой кода, так как этот проект существует уже несколько лет, и мы создаем новый проект с новыми технологиями, который заменит наш текущий проект. так что пока мы просто решаем вопросы. Кроме того, я могу гарантировать, что на тестовых компьютерах нельзя делать ничего, кроме самого теста, на что компьютеры настроены. - person Terry; 30.03.2011
comment
А как насчет того, чтобы поместить его в окно без каких-либо элементов управления? например, запустить тест из javascript с помощью window.open(url, title, 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbar=no,resizable=no'); - person Jamie Treworgy; 30.03.2011

Посмотрите этот пост:

Отключение ускорителей IE8 для всего сайта

@EricLaw говорит, что нет, вы не можете отключить их для сайта.

@mbenny говорит, что вы можете помечать контент как contentEditable или unselectable

person Chris Haas    schedule 30.03.2011

Как и при проверке, никогда не доверяйте данным, поступающим от клиента. На самом деле вам следует записывать на стороне сервера время начала теста, а затем время отправки теста. Часы на стороне пользователя должны быть только изюминкой, но не полагаться на них, так как нет способа гарантировать их точность (по полдюжине причин, указанных выше).

Почти безошибочный способ — это пользователь на стороне сервера, который никоим образом не известен, не взаимодействует и не может быть изменен конечным пользователем.

person Brian M.    schedule 31.03.2011
comment
см. мое редактирование в вопросе как ответ на ваши и другие замечания сервера-клиента - person Terry; 01.04.2011