Почему метод .html() не работает так как .innerHTML()?
Здравствуйте!
Есть такой скрипт:
var num = $('.p'),
btn = $('.btn');
btn.on({
'click': sum
});
function sum() {
for (var i = 0; i < num.length; i++) {
num[i].innerHTML = num[i].innerHTML + ' ' + (i + 1);
}
}
Он должен ставить в конце каждого параграфа его, соответствующий, номер. НО! Проковырялся с jQuery минут 20 в итоге его метод .html() так и не вывел нумерацию в браузере (хотя через console.log(num) нумерация присваивается). В отличии от его аналога в нативном js - .innerHTML() - этим всё выводится (console.log(num) выводит всё то же, что и с html). Буду очень благодарен если мне объяснит знающий человек в чём тут дело, так как во всех источниках указано, что эти методы являются аналогами друг друга. |
Цитата:
|
<div class="p">Первый</div>
<div class="p">Второй</div>
<div class="p">Третий</div>
<div class="p">Четвертый</div>
<button class="btn">Sum</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
var num = $('.p'),
btn = $('.btn');
btn.on({
'click': sum
});
function sum() {
for (var i = 0; i < num.length; i++) {
$(num[i]).html( $(num[i]).html() + ' ' + (i + 1));
}
}
</script>
|
Цитата:
|
<div class="p">Первый</div>
<div class="p">Второй</div>
<div class="p">Третий</div>
<div class="p">Четвертый</div>
<button class="btn">Sum</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
var $num = $('.p'),
btn = $('.btn');
btn.on({
'click': sum
});
function sum() {
$num.append(function(i){return ' ' + ++i});
}
</script>
|
Цитата:
У меня не работает... Цитата:
function sum() {
var arr = [];
for (var i = 0; i < num.length; i++) {
arr[i] = +num[i].innerHTML;
inp.val(arr.sort(srt));
}
}
Функция сортирует номера в параграфах и выводит в инпут, по возрастанию. Но когда ставлю вместо innerHTML html то выводит NaN. :cray: |
Цитата:
innerHTML - это свойство элемента DOM .html() - это метод объекта jQuery Смотрите внимательно пример в пост 3 |
Цитата:
num.each(function(n, e) {
e.innerHTML += ' ' + ++n
})
|
Цитата:
https://x-twig.ru/blog/239/ Цитата:
|
Цитата:
Вот полноценный скрипт:
var num = $('.p'),
btn = $('.btn'),
inp = $('input');
btn.on({
'click': sum
});
function sum() {
var arr = [];
for (var i = 0; i < num.length; i++) {
arr[i] = +num[i].innerHTML;
inp.val(arr.sort(srt));
}
}
function srt(a, b) {
if (a > b) {
return -1;
}
if (a < b) {
return -1;
}
if (a == b) {
return 0;
}
}
Всё работает, я же говорил. Просто думал писать всё на jQuery, но теперь выходит, что так нельзя и innerHTML не заменится тут... |
Цитата:
Метод .html() применяется к объекту jQuery, полученному по конкретному элементу DOM num - объект jQuery со всеми элементами ".p" num[i] - конкретный элемент DOM $(num[i]) - объект jQuery конкретного элемента DOM |
Цитата:
У вас часть кода работает с JQ объектами, а часть с DOM (вот и назвал гибридом). Если на чистом JQ используя его методы, то
num.each(function(n, e) {
$(e).html($(e).html() += ' ' + ++n)
})
где .each() метод выполняющий тоже самое что for(...), n - это индекс текущего элемента, e - текуший элемент как DOM. А если доступен DOM имеющий innerHTML, то зачем же $(e).html($(e).html() += ' ' + ++n), если проще выполнить e.innerHTML += ' ' + ++n. Здесь $(e), это лишняя трата энергии. ;) |
Цитата:
Разве что древнюю какую версию jq используешь... |
Цитата:
if (a > b) { return -1; } if (a < b) { return -1; } if (a == b) { return 0; } } |
Цитата:
|
Цитата:
Цитата:
function sum() {
$(num).append(function(i){return ' ' + ++i});
}
В целом - так конечно короче и проще. Благодарю за подсказку. |
Цитата:
|
Цитата:
У Aetae объявление переменных
var $num = $('.p'),
В вашем варианте при
var num = $('.p'),
достаточно
function sum() {
num.append(function(i){return ' ' + ++i});
}
|
Еще вариант - для разнообразия
<div class="p">Первый</div>
<div class="p">Второй</div>
<div class="p">Третий</div>
<div class="p">Четвертый</div>
<button class="btn">Sum</button>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
var num = $('.p'),
btn = $('.btn');
btn.on({
'click': sum
});
function sum() {
num.html(function(i){return $(this).html() + ' ' + ++i});
}
</script>
Вместо $(this).html() можно использовать this.innerHTML |
Цитата:
Цитата:
Цитата:
|
Цитата:
Но если к примеру в цикле, используя jq метод, или в обработчике событий, когда в методе доступен DOM элемент как this, который имеет свойство value, получать этот элемент как jq объект ради получения его значения - $(this).val(), это и глупо, и не оправдано, ибо это получить проще как this.value. |
Цитата:
|
Цитата:
|
Цитата:
Допустим есть поле ввода и нужно что-то сделать на странице при вводе некоторого значения в него. При этом все эти операции не касаются самого поля.
$('input').on('input', function() {
if(this.value=='x') {
//что-то делаем используя методы JQ
}
})
Здесь ради проверки условия поступать как if($(this).val()=='x') просто расточительство не имеющее ни пользы ни практичности. А если при этом значении поле должно переливаться цветами аки хамелеон и мы будем "хамелеонить" на JQ, то нам потребуется поле как jq объект, вот тут все оправдано:
$('input').on('input', function() {
$this = $(this); //input как объект jq
if($this.val()=='x') { //все ОК
//хамелеоним с $this
} else {
//иначе $this сидит и не отсвечивает
}
})
|
Цитата:
Цитата:
|
drakulawz,
Метод html вызывает функцию столько раз, сколько элементов находится в обьекте num. Внутренний параметр i работает в качестве счетчика элементов. Слова в html не имеют никакого значения - если бы там были Яблоко , Слон и т.п., то элементы пронумеровались бы точно так же |
Цитата:
Первое: Даны N абзацев и кнопка. По нажатию на кнопку запишите в конец каждого абзаца его порядковый номер. Второе: Даны N абзацев с числами. По нажатию на кнопку выведите эти числа в инпут через запятую в порядке возрастания. Выходит, что этот метод не подходит к второму заданию? Он ведь считает сами параграфы, а не то что в них? |
drakulawz,
цикл each и для первого и для второго |
drakulawz,
любой цикл html или each или text можно использовать |
Второе задание без явного цикла
<div class="p">5</div>
<div class="p">3</div>
<div class="p">1</div>
<div class="p">4</div>
<button class="btn">Sum</button>
<input type="text">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
var num = $('.p'),
btn = $('.btn'),
inp = $('input');
btn.on({
'click': sum
});
function sum() {
var arr = [];
num.html(function(){ arr.push(+this.innerHTML)});
inp.val(arr.sort(srt));
}
function srt(a, b) {
if (a > b) {
return 1;
}
if (a < b) {
return -1;
}
if (a == b) {
return 0;
}
}
</script>
|
Цитата:
Мне понравился вариант Aetae, хоть сначала я его и не понял.:p Вот, попробовал применить на ещё одном задании:
var a = $('a');
/*первый вариант функции вывода ссылок;*/
// function sum() {
// for (var i = 0; i < a.length; i++) {
// $(a[i]).html($(a[i]).html() + '(' + a[i].href + ')');
// }
// }
// sum();
/*второй вариант функции вывода ссылок;*/
function sum() {
$a = a;
$a.append(function (i) {
return '(' + a[i].href + ')'
})
}
sum();
Скинул два варианта, первый явно бредовый какой-то вышел, с append по-красивее выходит.:) Как сказал laimas, нефиг совать jq всюду и делать "гибриды"... Если уж делать на jq то правильно. Благодарю всех участвующих за терпение и (особенно) примеры функций:write: . Только проблема в том, что из ваших ответов я задаюсь всё большим количеством вопросов:help: . Надеюсь, что в дальнейшем смогу получить на них ответы;). Так то, я уже два месяца как мучаю этот javascript, толком так и не продвинулся. Всякие мелочи делаю, даже калькулятор нормальный сварганить немогу.:cray: |
:)
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(function() {
var $num = $(".p"),
btn = $(".btn"),
inp = $("input");
btn.on({
"click": sort
});
function sort() {
var val = $.map($num, function(el) {
return +el.textContent
}).sort(function(a, b) {
return a - b
});
inp.val(val)
}
});
</script>
</head>
<body>
<input type="text">
<div class="p">10</div>
<div class="p">0</div>
<div class="p">5</div>
<div class="p">-1</div>
<button class="btn">Sort</button>
<script>
</script>
</body>
</html>
|
drakulawz,
А это что за танцы с бубнами?
var a = $('a');
$a = a;
$a.append(function (i) {
Зачем лишний мусор в программе? чтобы потом сложнее было разобраться? |
Цитата:
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
body {
counter-reset: num;
}
.num:after {
counter-increment: num;
content: ' 'counter(num);
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(function() {
var $num = $(".p"),
btn = $(".btn");
btn.on({
"click": num
});
function num() {
$num.addClass('num')
}
});
</script>
</head>
<body>
<div class="p">Первый</div>
<div class="p">Второй</div>
<div class="p">Третий</div>
<div class="p">Четвертый</div>
<button class="btn">num</button>
<script>
</script>
</body>
</html>
|
Цитата:
|
рони, так нечестно! Обман зрения! Ничего не дописывается!
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
body {
counter-reset: num;
}
.num:after {
counter-increment: num;
content: ' 'counter(num);
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(function() {
var $num = $(".p"),
btn = $(".btn"),
tst = $(".test"),
inp = $("input");
tst.hide();
btn.on({
"click": num
});
tst.on({
"click": test
});
function num() {
$num.addClass('num');
tst.show();
}
function test() {
var arr = [];
$num.each(function() { arr.push(this.innerHTML); });
inp.val(arr);
}
});
</script>
</head>
<body>
<div class="p">Первый</div>
<div class="p">Второй</div>
<div class="p">Третий</div>
<div class="p">Четвертый</div>
<button class="btn">num</button>
<button class="test">test</button>
<input type="text">
<script>
</script>
</body>
</html>
|
Цитата:
var num = $('.p')
Цитата:
Перебор выполняет num.html() this - это конкретный элемент DOM из набора элементов объекта num, получаемый при переборе. |
Цитата:
function sort() {
var val = $.map($num, function(el) {
return +el.textContent
}).sort(function(a, b) {
return a - b
});
inp.val(val)
}
рони, с методом map мне ещё предстоит знакомство. Он создаёт новый масив в котором записаны функции по отношению к элементам массива num. В данном случаи оно создаёт массив цифр, так как в num у нас записаны цифры. Так? А такая запись не правильная была бы +el.text?
function num() {
$num.addClass('num')
}
Интересно:write: |
Цитата:
|
drakulawz,
$a = a;ничего не переобъявляет. Это две переменные одинакового типа и одинакового содержания. $ здесь ничего не значит. Просто программисты для удобства - чтобы лучше видеть в тексте программы переменные с объектами jq и применять к ним соответствующие методы - зачастую используют $ в имени переменных. |
| Часовой пояс GMT +3, время: 01:15. |