HTML5 data-* attributes and jQuery.data() in examples

HTML5 data-* attributes and jQuery.data() в примерах:
1) загруженная страница содержит

<input id="test" type="text" data-data1="qwer" data-data2-test="asdf" value="test">


2) на Vanilla JS
document.getElementById("test").dataset.data1
"qwer"
document.getElementById("test").dataset.data2-test
NaN
document.getElementById("test").dataset.data2Test
"asdf"

-- для IE 10- dataset не доступен

>> document.getElementById("test").dataset.data1 
"Не удалось получить свойство "data1" ссылки, значение которой не определено или является NULL" 
>> document.getElementById("test").getAttribute("data-data1") 
"qwer" 
>> document.getElementById("test").getAttribute("data-data2-test") 
"asdf" 
используем jQuery для чтения, все универсально, и главное, в IE тоже работает как надо
$('#test').data('data1')
"qwer"
$('#test').data('data2-test')
"asdf"
$('#test').data('data2Test')
"asdf"
а сейчас попробуем сохранить данные используя jQuery.data(), и более того сохраним объект содержащий функцию
видим результат, с помощью jQuery можем легко воспользоваться сохраненным объектом
но эти данные не появляются в dataset, они сохраняются в кэше jQuery, при первой же попытке получить значение data элемента, jQuery создаст свойство в DOM структуре этого элемента «jQuery + $.now()» и присвоит ему уникальный идентификатор (или ранее), который и будет использоваться как ключ для доступа к кэшу, а так же, скопирует атрибуты data в свой кэш.
$('#test').data('data3', {tt: 10, fn1: function(n){ return this.tt * n + n } })

$('#test').data('data3').fn1(5)
55
document.getElementById("test").dataset.data3
undefined
jQuery1113024019371896630481: 63

jQuery.cache[63]
Object {data: Object, parsedAttrs: true}
jQuery.cache[63].data
Object {data2Test: "asdf", data1: "qwer", data3: Object}
$('#test').data()
Object {data2Test: "asdf", data1: "qwer"}
$.cache[63].data
Object {data2Test: "asdf", data1: "qwer"}
$('#test').attr('data-data1', 'qazwsx')
[<input id=​"test" type=​"text" data-data1=​"qazwsx" data-data2-test=​"asdf" value=​"test">​]
$('#test').data()
Object {data2Test: "asdf", data1: "qwer"}
$('#test')[0].dataset
DOMStringMap {data1: "qazwsx", data2Test: "asdf"}
$('#test').attr('data-data3', 'qazwsx')
[<input id=​"test" type=​"text" data-data1=​"qazwsx" data-data2-test=​"asdf" value=​"test" data-data3=​"qazwsx">​]
$('#test')[0].dataset
DOMStringMap {data1: "qazwsx", data2Test: "asdf", data3: "qazwsx"}
$('#test').data()
Object {data2Test: "asdf", data1: "qwer"}
$('#test').data('data1', 123)
[<input id=​"test" type=​"text" data-data1=​"qazwsx" data-data2-test=​"asdf" value=​"test" data-data3=​"qazwsx">​]
$('#test').data()
Object {data2Test: "asdf", data1: 123}
$('#test')[0].dataset
DOMStringMap {data1: "qazwsx", data2Test: "asdf", data3: "qazwsx"}
$('#test')[0].dataset.data1 = 777
777
$('#test')[0].dataset
DOMStringMap {data1: "777", data2Test: "asdf", data3: "qazwsx"}
$('#test').data()
Object {data2Test: "asdf", data1: 123}
Итоги:
  1. data атрибуты загружаются в свойство attributes элемента
  2. если браузер поддерживает DOMStringMap, то в свойство dataset дублируются все атрибуты data? имена приводятся в верблюжью нотацию, если в имени присутствуют «-«
  3. jQuery сохраняет копию data атрибутов и более их не обновляет, ни в одну из сторон, jQuery использует javascript для хранения данных, а не DOM, вот тут то плагины jQuery и хранят свои экземпляры

Change the color of address bar in mobile Chrome for Android browser

Зададим цвет адресной строки для Chrome под Android на примере WordPress.
В файл схемы …./header.php в тег добавим <meta name="theme-color" content="#ff66ee"> и увидим такой результат Screenshot_2016-08-30-20-44-13_com.android.chrome

IE10,IE11 bug — You must choose an item from the list

Баг в ИЕ10, ИЕ11 получаем сообщение «Необходимо выбрать элемент из списка» если для элемента select установлено свойство required и изначально пустой select будет заполнен с помощью javascript И кликнули в пустой селект ИЛИ сперва попытались отправить пустой список. Усложнение уровня если select будет заполнен единственным option, выбрать его вообще никак не получится. Безымянный93 Решение в коде, «передерним» селект, в ДОМ структуре то селект обозначен как с выбранным элементом.
Или использовать селект с элементом плайсхолдером.

function hack1() {
	var cur = $('#select1').prop('selectedIndex');
	$('#select1').prop('selectedIndex', -1);
	$('#select1').prop('selectedIndex', cur);
}
Тут можно протестировать

Условные комментарии начиная с IE 10 больше не работают

<!-- [if IE 6]><style type="text/css">
   .transparent { background: #0078c9; }
</style><![endif]-->
https://msdn.microsoft.com/en-us/library/hh801214(v=vs.85).aspx «Отделить» 10-ый от 11-го с помощью js или на бекенде аналогично распарсить User-Agent
var uA = navigator.userAgent;
if(uA.indexOf('Trident') != -1 && uA.indexOf('rv:11') != -1){
    document.body.className = document.body.className+' ie ie11';
} else if(uA.indexOf('Trident') != -1 && uA.indexOf('MSIE 10.0') != -1){
    document.body.className = document.body.className+' ie ie10';
} else if(uA.indexOf('MSIE ') != -1) {
    document.body.className = document.body.className+' ie ieo';
}

Вставка изображения в форму из буфера

Возникла необходимость, вернее, усталость от неудобства. В багтрекер постоянно нужно вставлять скриншоты, и вот как раз сохранение в файл перед прикреплением в форму и достало. Кроссбраузерностью и поддержкой старых версий не заморачивался, в компании повсеместно ИЕ, обновления приходят и устанавливаются постоянно. Сам я предпочитаю Хром. В итоге так и получилось, ИЕ > 9, Хром, ну и Опера, так как она сейчас на ВебКите, Лисицу чинить не стал.
Безымянный51 Безымянный52
В форму добавляю:
<input type="hidden" id="screenshot" name="screenshot" value="">
<div style="margin-top: 20px; position: relative;"> <img id="isimg" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgYAAAAAMAASsJTYQAAAAASUVORK5CYII="></img> <div id="isforimg" contenteditable="true"> </div> </div>
Стили:
<style>
#isimg {
margin-left: 100px;
padding: 5px;
width: 320px;
height: 220px;
border: none;
background: url(../images/screenshot-grey.png) no-repeat center center;
}
#isforimg {
position: absolute;
padding: 5px;
width: 70px;
height: 70px;
overflow: hidden;
border: 2px solid #eee;
top: -10px;
left: 370px;
text-align: center;
vertical-align: middle;
line-height: 60px;
background: url(../images/klipper.png) no-repeat center center;
}
</style>

На сервере:
if (!empty($_POST['screenshot']) && ($content_pos = strpos($_POST['screenshot'], ';base64,')) && $content_pos!==false) {
try { $filename = md5($issue->getIssueId().'screenshot'.microtime(1)); $file_path = $folderPath.DIRECTORY_SEPARATOR.$filename; $fcontent = base64_decode(substr($_POST['screenshot'], $content_pos + 8)); if (false !== file_put_contents($file_path, $fcontent)) {

И js (без jQuery):

if(document.attachEvent) {
document.attachEvent('paste', onPasteTriggered); // ie < 11
}
else if(document.addEventListener) {
document.addEventListener('paste', onPasteTriggered, false); // google chrome or ie >= 11
}

function onPasteTriggered(e) {

if (e.srcElement.id != 'isforimg')
return;

if (e.clipboardData || e.view.clipboardData) { //google chrome or ie > 9
var copiedData = e.clipboardData ? e.clipboardData.items[0] : e.view.clipboardData.files[0]; //Get the clipboard data

/*if the clipboard data is of type image, read the data*/
if(copiedData && copiedData.type && copiedData.type.indexOf('image') == 0) {

var imageFile = e.clipboardData ? copiedData.getAsFile() : copiedData;

/*HTML5 FileReader API to read the image file*/
var reader = new FileReader();

reader.onload = function (evt) {
var result = evt.target.result; //base64 encoded image
document.getElementById('screenshot').value = result;
document.getElementById('isimg').src = result;
};
reader.readAsDataURL(imageFile);

document.getElementById('isforimg').setAttribute('contenteditable', 'false'); // for IE - for not insert img

setTimeout(function(){document.getElementById('isforimg').setAttribute('contenteditable', 'true');}, 200); //
}
}

setTimeout(function(){ document.getElementById('isforimg').innerHTML = ''; }, 100); //erase what inserted
}