Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Замена без innerHTML (https://javascript.ru/forum/misc/52298-zamena-bez-innerhtml.html)

tippula 12.12.2014 13:48

Замена без innerHTML
 
Можно ли заменить на странице <h2>Zagolovok-1</h2>
не перерисовывая весь элемент в котором находиться h2 ?

document.getElementById('div_id').innerHTML = document.getElementById('div_id'').innerHTML.repla ce('<h2>Zagolovok-1</h2>', '<h2>Zagolovok-2</h2>');

krutoy 12.12.2014 13:50

<html>
<head>
</head>
<body>

<h2>foo</h2>
<h3>foo</h3>


<script>
document.querySelector("h2").innerHTML="baz"
document.getElementsByTagName("h3")[0].innerHTML="baz"

</script>
</body>
</html>

tippula 12.12.2014 14:02

Простите, забыл пояснить. Заменить именно конкретный элемент, он может быть любым, id у него нет, но знаем точно какой тег и что внутри.
типа так чтобы работало
document.volshebhaya_hren("<h2>Zagolovok-1</h2>").innerHTML="<h2>Zagolovok-new</h2>"

krutoy 12.12.2014 14:03

Цитата:

Сообщение от tippula
он может быть любым, id у него нет,

А где ты увидел в моем коде id?

krutoy 12.12.2014 14:07

Цитата:

Сообщение от tippula
document.volshebhaya_hren("<h2>Zagolovok-1</h2>").innerHTML="<h2>Zagolovok-new</h2>"

Так и работает. Только innerHTML="Zagolovok-new

tippula 12.12.2014 14:14

Может я что то не понимаю, Нужно проверять не только какой тег но и что там внутри, т.к .может быть несколько одинаковых тегов, а поменять надо только в одном

krutoy 12.12.2014 14:34

<html>
<head>
</head>
<body>

<h1>foo</h1>
<h1>bar</h1>

<script>
;[].forEach.call(document.querySelectorAll("h1"), function(el){if(el.innerHTML==="bar") el.innerHTML="baz"})
</script>
</body>
</html>

если производительность критична, можно так
<html>
<head>
</head>
<body>

<h1>foo</h1>
<h1>bar</h1>

<script>
;[].forEach.call(document.querySelectorAll("h1"), function(el){
  try{
     if(el.innerHTML==="bar") throw el
  }catch(e){e.innerHTML="baz"}})
</script>
</body>
</html>

или тупо циклом
<html>
<head>
</head>
<body>

<h1>foo</h1>
<h1>bar</h1>

<script>
els=document.querySelectorAll("h1")
for(var i=0; i<els.length; i++){
      if(els[i].innerHTML==="bar") {els[i].innerHTML="baz" ; break}

}
</script>
</body>
</html>

Aetae 12.12.2014 15:17

krutoy,
>если производительность критична, можно так
>try catch
Ты совсем больной? Исключения замедляют код на порядки.

krutoy 12.12.2014 15:47

Aetae,
Ога
arr=[]
i=1000000
while(i--){arr.push(i)}
i=1000000

withTry=function(name){
console.time(name)
try{
arr.forEach(function(el) {if(el===1||el===(i-1)) throw el})
}catch(e){console.log(e)}
console.timeEnd(name)
}

withOutTry=function(name){
console.time(name)
arr.forEach(function(el) {if(el===1||el===(i-1)) console.log(el)})
console.timeEnd(name)
}


withTry("with")
withOutTry("without")
// ::: 999999
// ::: with: 2ms
// ::: 999999
// ::: 1
// ::: without: 117ms

И про память не забудь. Говностек никто не отменял.

ruslan_mart 12.12.2014 16:47

document.querySelector('#div_id h2').innerHTML = '...';

Erolast 12.12.2014 17:24

Переходите уже на новые стандарты :)
ES7:
let number = +(prompt("Введите число."));
alert([1, 2, 3].includes(number));

Полифилл:
if (![].includes) {
  Array.prototype.includes = function(searchElement/*, fromIndex*/) {
    if (this === undefined || this === null) {
      throw new TypeError('Cannot convert this value to object');
    }
    var O = Object(this);
    var len = parseInt(O.length) || 0;
    if (len === 0) {
      return false;
    }
    var n = parseInt(arguments[1]) || 0;
    var k;
    if (n >= 0) {
      k = n;
    } else {
      k = len + n;
      if (k < 0) k = 0;
    }
    while (k < len) {
      var currentElement = O[k];
      if (searchElement === currentElement ||
         (searchElement !== searchElement && currentElement !== currentElement)) {
        return true;
      }
      k++;
    }
    return false;
  }
}

---
Крутой, чем твой вариант лучше "~[1, 2, 3].indexOf(number)"?

bes 12.12.2014 20:36

Цитата:

Сообщение от tippula
Можно ли заменить на странице <h2>Zagolovok-1</h2>
не перерисовывая весь элемент в котором находиться h2 ?

судя по тому, что никто до сих пор не предложил, возможно не понял вопроса
<h1>Zagolovok-1</h1>
<button>click</button>
<script>
document.querySelector("button").addEventListener("click", function () {
	var h1 = document.querySelector("h1");
	if ( h1 ) {
		h1.outerHTML = "<h2>Zagolovok-2</h2>";
	}
	alert(document.querySelector("h2").innerHTML);
});
</script>


PS: Erolast, забыл кнопку run

Erolast 13.12.2014 11:13

А includes пока только в FF Nightly реализован. Вот вместе с полифиллом рабочий пример:
if (![].includes) {
  Array.prototype.includes = function(searchElement/*, fromIndex*/) {
    if (this === undefined || this === null) {
      throw new TypeError('Cannot convert this value to object');
    }
    var O = Object(this);
    var len = parseInt(O.length) || 0;
    if (len === 0) {
      return false;
    }
    var n = parseInt(arguments[1]) || 0;
    var k;
    if (n >= 0) {
      k = n;
    } else {
      k = len + n;
      if (k < 0) k = 0;
    }
    while (k < len) {
      var currentElement = O[k];
      if (searchElement === currentElement ||
         (searchElement !== searchElement && currentElement !== currentElement)) {
        return true;
      }
      k++;
    }
    return false;
  }
}

alert([1, 2, 3, 4, 5, 6, 7, 8, 9, 10].includes(+(prompt("Введите число от 1 до 10."))));


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