Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Прозрачный полифил атрибута placeholder (https://javascript.ru/forum/project/52888-prozrachnyjj-polifil-atributa-placeholder.html)

danik.js 16.01.2015 13:47

Все что я хочу - подключить некий magicPlaceholder.js и забыть об этом.
Далее работать как обычно - из js обращаться к input.value, менять input.placeholder (в принципе), в том числе и через атрибуты. Причем с динамически созданными инпутами все также должно работать.
В IE9 по крайней мере это все реализуемо. Уже почти сделал.
В IE8 возможно тоже, но будут некоторые ограничения.

caetus 16.01.2015 16:28

<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<meta charset="utf-8"> 
<style>
#canvas {
	border: solid black 1px;
	display: block;
}

</style>
<body>
<input type="text" placeholder="dasda">
<input type="text" placeholder="dasda" >
<input type="text" placeholder="dasda" >


<script>
[JS]
function addevent(obj, e, h) {if (obj.addEventListener) { obj.addEventListener(e, h, false);} else if (obj.attachEvent) { obj.attachEvent('on'+e, h);} else { obj['on'+e]=function() { h();};}} function delevent(obj, e, h) { if (obj.removeEventListener) { obj.removeEventListener(e, h, false);} else if (obj.detachEvent) { obj.detachEvent('on'+e, h);} else {obj['on'+e]=null;}}



var fn = function(){

var inp = document.querySelectorAll('input[type="text"');


for(var i = 0; i < inp.length; i++) {
	inp[i].setAttribute('data-pl', inp[i].getAttribute('placeholder'));
	inp[i].value = inp[i].getAttribute('placeholder');
}
  var o = {
    focus: function (e) {
      e = e.target || e.srcElement;
      if(!e.type == 'text') return;
      if(e.value == e.getAttribute('data-pl')) {
        e.value = '';
        e.style.color = 'black'
      }
      addevent(e, 'blur', o.blur);
    },
    
    blur: function (e) {
      e = e.target || e.srcElement;
      if(e.value === '' || e.value == ' ') {
        e.value = e.getAttribute('data-pl');
        e.style.color = 'silver';
      }
      delevent(e, 'blur', o.blur);
     },
     createPlaceholder: function (place) {
     var input = document.createElement('input');
           input.type = 'text';
           if('placeholder' in document.createElement('input') input.placeholder = place;
           else input.setAttribute('data-bl', plc);

           return input;
	 },
	 event: function () {
          if('placeholder' in document.createElement('input')) return;
	 	addevent(document.body, 'click', o.focus);
		addevent(document.body, 'blur', o.blur);
	 }
  }
o.event();
return o;
};

var fn1 = fn()
console.log(fn1)


[/JS]
</script>

</html>


через createPlaceholder можно создавать смело input.

caetus 16.01.2015 16:34

у меня работает ie8+

danik.js 16.01.2015 19:39

caetus, ты не правильно понял.

В общем, вроде бы работает: http://learn.javascript.ru/play/rc5dBb

Работает в IE8-9 и в последнем Firefox'е (отключил проверку для теста), надеюсь в старых версиях тоже получится.
Пока не решил проблему с автозаполнением браузера по F5.

danik.js 24.01.2015 11:49

Короче, все удалось с таким старьем как Firefox 3.6 и Opera 10.6.
В webkit-based браузерах облом - в них фэйковые дескрипторы нативных свойств DOM-элементов.

Автозаполнение тоже победил. Чуть поправлю код и залью на гитхаб. Правда опоздал я на пару годков с этой темой))


Часовой пояс GMT +3, время: 10:58.