Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.03.2015, 21:30
Профессор
Отправить личное сообщение для alexan0308 Посмотреть профиль Найти все сообщения от alexan0308
 
Регистрация: 11.04.2011
Сообщений: 207

Превратить span в текстовое поле кликом и обратно
Здрасте уважаемые форумчане!
Появилась задача - текстовый спан при клике ( получении фокуса ) должен превращаться в текстовый инпут. Изначально там инпута ну никак нету. При потери фокуса он должен превращаться обратно в текст.

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

var el = document.getElementById( "term1" );  
	el.addEventListener('click', function() { 

	var inputs = el.getElementsByTagName('input');
	if ( inputs.length > 0 ) return; // уже есть инпут, выходим

		var newInput = document.createElement('input');
		newInput.type = 'text'; 
		newInput.value = el.innerHTML;
		newInput.maxLength = 1;
		newInput.setAttribute('size',1); // HTML attribute
		newInput.style.width = '12px';   // CSS property

		el.innerHTML = "";
		el.appendChild( newInput );
		newInput.focus();
		newInput.select();
		
		// новоявленному инпуту добавляем событие, когда он потеряет фокус и пропадет
		newInput.addEventListener('blur', function() { 
	                
			// ищем инпут и удаляем его, забрав его значение
			var inputs = el.getElementsByTagName('input');
			var value = inputs[0].value;
			el.removeChild( inputs[0] );
			el.innerHTML = value;

		}, false );	
		
	
	}, false );

Последний раз редактировалось alexan0308, 08.03.2015 в 23:26.
Ответить с цитированием
  #2 (permalink)  
Старый 08.03.2015, 21:52
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

alexan0308,
редактирование таблицы

Редактирование данных в таблице и отправка на сервер
Ответить с цитированием
  #3 (permalink)  
Старый 08.03.2015, 23:25
Профессор
Отправить личное сообщение для alexan0308 Посмотреть профиль Найти все сообщения от alexan0308
 
Регистрация: 11.04.2011
Сообщений: 207

Рони, спасибо. Посмотрел, навело на мысли. Подправил код, вроде все работает. Но наверно еще можно шлифовать, не?
Ответить с цитированием
  #4 (permalink)  
Старый 08.03.2015, 23:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

alexan0308,
строка 23 зачем искать дважды (первый раз строка 4) если это this.
<span id="term1">1</span>
<script>
  var el = document.getElementById("term1"),
  inputs = el.getElementsByTagName("input"),
  newInput;
el.addEventListener("click", function() {
    if (inputs.length > 0) return;
    if (!newInput) {
        newInput = document.createElement("input");
        newInput.type = "text";
        newInput.maxLength = 1;
        newInput.setAttribute("size", 1);
        newInput.style.width = "12px";
        newInput.addEventListener("blur", function() {
            el.removeChild(this);
            el.innerHTML = this.value ;
        }, false)
    }
    newInput.value = el.innerHTML;
    el.innerHTML = "";
    el.appendChild(newInput);
    newInput.focus();
    newInput.select()
}, false);
</script>

Последний раз редактировалось рони, 08.03.2015 в 23:55.
Ответить с цитированием
  #5 (permalink)  
Старый 09.03.2015, 09:31
Профессор
Отправить личное сообщение для alexan0308 Посмотреть профиль Найти все сообщения от alexan0308
 
Регистрация: 11.04.2011
Сообщений: 207

Ага здорово!

Плюсануть карму, к сожалению, пока не могу (уже плюсовал последний раз).
Ответить с цитированием
  #6 (permalink)  
Старый 09.03.2015, 12:43
Профессор
Отправить личное сообщение для alexan0308 Посмотреть профиль Найти все сообщения от alexan0308
 
Регистрация: 11.04.2011
Сообщений: 207

Несколько полей
А как быть с несколькими полями?

<span class="dynamic">1</span> 
<span class="dynamic">2</span> 
<span class="dynamic">3</span> 
<span class="dynamic">4</span> 
<span class="dynamic">5</span> 
<script>
var elems = document.getElementsByClassName("dynamic");
for (var i=0; i<elems.length; i++) {
    var el = elems[i];
    var inputs = el.getElementsByTagName("input"), newInput;
    el.addEventListener("click", function() {
        if (inputs.length > 0) return;
        if (!newInput) {
            newInput = document.createElement("input");
            newInput.type = "text";
            newInput.maxLength = 1;
            newInput.setAttribute("size", 1);
            newInput.style.width = "12px";
            newInput.addEventListener("blur", function() {
                el.removeChild(this);
                el.innerHTML = this.value ;
            }, false)
        }
        newInput.value = el.innerHTML;
        el.innerHTML = "";
        el.appendChild(newInput);
        newInput.focus();
        newInput.select()
		}, false);
	};
</script>

Последний раз редактировалось alexan0308, 09.03.2015 в 12:53.
Ответить с цитированием
  #7 (permalink)  
Старый 09.03.2015, 12:56
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

alexan0308,
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body><span class="dynamic">1</span>
<span class="dynamic">2</span>
<span class="dynamic">3</span>
<span class="dynamic">4</span>
<span class="dynamic">5</span>
<script>
var elems = document.getElementsByClassName("dynamic"), newInput;
for (var i=0; i<elems.length; i++) {
    var el = elems[i];
    el.addEventListener("click", function() {
      var  inputs = this.getElementsByTagName("input");
        if (inputs.length > 0) return;
        if (!newInput) {
            newInput = document.createElement("input");
            newInput.type = "text";
            newInput.maxLength = 1;
            newInput.setAttribute("size", 1);
            newInput.style.width = "12px";
            newInput.addEventListener("blur", function() {
            newInput.parentNode.innerHTML = newInput.value ;
            }, false)
        }
        newInput.value = this.innerHTML;
        this.innerHTML = "";
        this.appendChild(newInput);
        newInput.focus();
        newInput.select()
		}.bind(el), false);
	};
</script>



</body>

</html>
Ответить с цитированием
  #8 (permalink)  
Старый 09.03.2015, 12:59
Профессор
Отправить личное сообщение для alexan0308 Посмотреть профиль Найти все сообщения от alexan0308
 
Регистрация: 11.04.2011
Сообщений: 207

Даа, трудно старому паскалисту биндить... сенкс ))
Ответить с цитированием
  #9 (permalink)  
Старый 11.03.2015, 08:50
Профессор
Отправить личное сообщение для alexan0308 Посмотреть профиль Найти все сообщения от alexan0308
 
Регистрация: 11.04.2011
Сообщений: 207

Еще вопрос ( простите за дотошность, но наверно важно ) : Не происходит ли утечки памяти при
newInput.parentNode.innerHTML = newInput.value;
Ведь просто исчезает спан newInput вместе со своим событием "blur" ?
Ответить с цитированием
  #10 (permalink)  
Старый 11.03.2015, 09:53
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Сообщение от alexan0308 Посмотреть сообщение
Еще вопрос ( простите за дотошность, но наверно важно ) : Не происходит ли утечки памяти при
newInput.parentNode.innerHTML = newInput.value;
Ведь просто исчезает спан newInput вместе со своим событием "blur" ?
куда это он исчезает если его можно вставить в любой момент и можно создать вне click один раз. строка 22 срабатывает всего 1 раз.пока есть ссылка на элемент он не исчезнет

Последний раз редактировалось рони, 11.03.2015 в 09:56.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вывести значение кнопки в текстовое поле matt_xs Общие вопросы Javascript 10 16.04.2016 14:50
значение checkbox в текстовое поле Alfer Events/DOM/Window 0 20.09.2013 16:03
Активировать текстовое поле если стоит галочка (запара с именами) Гробовщик Events/DOM/Window 9 14.06.2013 10:39
При наведение на форму,она выводится в текстовое поле! unkind Элементы интерфейса 9 07.11.2012 16:52
Как передать данные из jqGrid в текстовое поле? Rooner jQuery 2 27.09.2012 19:31