Вам нужно было подключить eventListener раньше, проблема была в том, что вы подключили прослушиватели событий мыши после нажатия кнопки, чтобы они не работали в первый раз.
Рабочий код:
var pressme = document.getElementById('pressme');
var button1=document.getElementById('myBtn');
var button2=document.getElementById('myBtn1');
var showme = document.getElementById('showme');
button1.addEventListener('click', display1);
function display1(){ //displaying red background
pressme.style.display = 'none';
showme.style.display = 'block';
button1.style.display= 'none';
button2.style.display= 'block';
}
button2.addEventListener( 'mousedown', event => {
timeout = setTimeout(() => {
pressme.style.display = 'block';
showme.style.display = 'none';
button2.style.display= 'none';
button1.style.display= 'block';
}, 3000 );
});
button2.addEventListener( 'mouseup', event => {
if ( timeout ) clearTimeout( timeout );
});
<!DOCTYPE html>
<html>
<head>
<title>Realtime communication with WebRTC</title>
<link rel="stylesheet" href="css/main.css" />
</head>
<body>
<table id="pressme" style="width:100%" bgcolor="red" height =500px>
<button id="myBtn">Try it red</button>
</table>
<table id="showme" style="width:100%;display:none;" bgcolor="green"height=500px>
<button id="myBtn1" style=display:none; >Try it green </button>
</table>
</body>
</html>
этот быстрый:
Вы можете подумать, что так и должно быть, но на самом деле это вовсе не так!
Какие допустимые символы в названии и значении куки-файла?
Согласно древней Netscape cookie_spec вся строка NAME=VALUE
представляет собой:
последовательность символов, исключающую полуколонну, запятую и пробел белого цвета.
Так что -
должна работать, и в моих браузерах это, кажется, нормально; где у вас с этим проблемы?
Подразумевается, что:
=
правомерно включать, но потенциально двусмысленно. Браузеры всегда делят имя и значение на первый символ =
в строке, поэтому на практике можно поместить символ =
в VALUE, но не в NAME. О чем не упоминается, так как Netscape ужасно умел писать спецификации, но, похоже, последовательно поддерживается браузерами:
либо ИМЯ, либо ЦЕНА могут быть пустыми строками
, если в строке вообще нет символа =
, браузеры рассматривают его как куки с именем пустой строки, т.е. Set-Cookie: foo
- это то же самое, что и Set-Cookie: =foo
.
, когда браузеры выводят куки с пустым именем, они опускают знак равенства. Таким образом, Set-Cookie: =бар
получает значение Cookie: bar
.
запятые и пробелы в именах и значениях, похоже, действительно работают, хотя пробелы вокруг знака равенства обрезаются
управляющие символы (\x00
до \x1F
плюс \x7F
) не допускаются
То, о чем не упоминается и о чем браузеры совершенно непоследовательны, это не-ASCII (Юникод) символы:
поэтому на практике вы вообще не можете использовать в cookie-файлах не-ASCII-символы. Если вы хотите использовать Unicode, управляющие коды или другие произвольные последовательности байтов, cookie_spec требует, чтобы вы использовали специальную схему кодирования по вашему собственному выбору и предложить URL-адреса кодирования (как производится JavaScript cododeURIComponent
) в качестве разумного выбора.
С точки зрения фактических стандартов, было несколько попыток кодификации поведения печенья, но ни одна из них до сих пор фактически не отражают реальный мир.
RFC 2109 была попытка кодификации и исправить оригинальные Netscape печенья_spec. В этом стандарте запрещены многие другие специальные символы, так как он использует RFC 2616 маркеры (a -
там разрешено -), и только значение может быть указано в строке кавычек с другими символами. Ни один браузер никогда не реализовывал ограничения, специальную обработку цитируемых строк и экранирование, или новые возможности в этой спецификации
RFC 2965 были еще одним шагом вперед, приведя в порядок 2109 и добавив дополнительные возможности по схеме "куки-версии 2". Никто никогда не реализовывал ничего из этого. Эта спецификация имеет те же ограничения по символике и кавычкам, что и предыдущая версия, и это просто куча чепухи.
RFC 6265 - это HTML5-эра попытки прояснить исторический беспорядок. Он все еще не совсем соответствует реальности, но гораздо лучше, чем предыдущие попытки - это, по крайней мере, правильное подмножество того, что поддерживают браузеры, не вводя синтаксиса, который должен работать, но не работает (как в предыдущей цитируемой строке).
В 6265 имя куки все еще указано в виде RFC 2616 токена
, что означает, что вы можете выбрать из алфавитов плюс:
!#$%&'*+-.^_`|~
В значении куки формально запрещаются (отфильтрованные браузерами) управляющие символы и (непоследовательно-внеиспользованные) не-ASCII символы. Он сохраняет запрет cookie_spec на пробел, запятую и точку с запятой, плюс для совместимости с любыми плохими идиотами, которые на самом деле реализовали более ранние RFC, он также запрещает обратный слеш и кавычки, кроме кавычек, обертывающих все значение целиком (но в этом случае кавычки все равно считаются частью значения, а не схемой кодирования). Итак, остались алфавиты плюс:
!#$%&'()*+-./:<=>?@[]^_`{|}~
В реальном мире мы все еще используем оригинальный и западный Netscape cookie_spec, так что код, который потребляет cookie, должен быть готов встретиться практически с чем угодно, но для кода, который производит cookie, рекомендуется придерживаться подмножества в RFC 6265.
.Еще одно соображение. Недавно я реализовал схему, в которой некоторые конфиденциальные данные, публикуемые в сценарии PHP, должны были преобразовываться и возвращаться в виде зашифрованного файла cookie, в котором использовались все значения base64, которые я считал гарантированно «безопасными». Поэтому я должным образом зашифровал элементы данных с помощью RC4, запустив вывод через base64_encode и благополучно вернул cookie на сайт. Тестирование шло хорошо, пока строка в кодировке base64 не содержала символ «+». Строка была записана в cookie страницы без проблем. С помощью диагностики браузера я также мог убедитесь, что файлы cookie были записаны без изменений. Затем, когда на следующей странице был вызван мой PHP и получен файл cookie через массив $ _COOKIE, я заикался, обнаружив, что в строке теперь отсутствует знак «+». Каждое вхождение этого символа заменялось на Пространство ASCII.
Учитывая, сколько похожих неразрешенных жалоб я прочитал, описывая этот сценарий с тех пор, часто размещая многочисленные ссылки на использование base64 для «безопасного» хранения произвольных данных в файлах cookie, я подумал, что укажите на эту проблему и предложите мое по общему признанию хитрое решение.
После того, как вы сделали любое шифрование, которое хотите сделать с частью данных, а затем использовали base64_encode, чтобы сделать его «безопасным для cookie», запустите вывод через эту строку ...
// from browser to PHP. substitute troublesome chars with
// other cookie safe chars, or vis-versa.
function fix64($inp) {
$out =$inp;
for($i = 0; $i < strlen($inp); $i++) {
$c = $inp[$i];
switch ($c) {
case '+': $c = '*'; break; // definitly won't transfer!
case '*': $c = '+'; break;
case '=': $c = ':'; break; // = symbol seems like a bad idea
case ':': $c = '='; break;
default: continue;
}
$out[$i] = $c;
}
return $out;
}
Здесь я просто подставляю "+" (и я тоже решил "=") другими символами "cookie", прежде чем возвращать закодированное значение на страницу , для использования в качестве куки. Обратите внимание, что длина обрабатываемой строки не изменяется. Когда тот же (или другая страница на сайте) снова запустит мой PHP-скрипт, я смогу восстановить этот cookie без пропущенных символов. Мне просто нужно помнить, чтобы передать cookie обратно через тот же вызов fix64 (), который я создал, и оттуда я могу декодировать его с помощью обычной base64_decode (), за которой следует любая другая расшифровка в вашей схеме.
Могут быть некоторые настройки, которые я могу сделать в PHP, которые позволяют передавать строки base64, используемые в cookie, обратно в PHP без повреждения. В то же время это работает. «+» Может быть «допустимым» значением cookie, но если у вас есть желание передать такую строку обратно в PHP (в моем случае через массив $ _COOKIE), я предлагаю повторную обработку для удаления оскорблять персонажей и восстанавливать их после восстановления. На выбор предлагается множество других «безопасных» символов.
Существует 2 версии спецификаций куки-файлов
.
1. Куки-файлы версии 0, также известные как Netscape,
.
2. Версия 1, также известная как RFC 2965 cookies
.
В версии 0 часть имени и значения куки-файлов представляют собой последовательности символов, исключая точку с запятой, знак равенства и пробел, если не используется с двойными кавычками
.
версия 1 намного сложнее, вы можете проверить ее здесь
В этой версии спецификации для наименования части значения почти одинаковы, за исключением того, что имя не может начинаться со знака $
Я думаю, что в основном это специфично для браузера. Чтобы быть на всякий случай, base64 кодирует JSON-объект и хранит в нем все. Таким образом, вы просто должны декодировать его и разобрать JSON. Все символы, используемые в base64, должны хорошо играть в большинстве, если не во всех браузерах
.