Javascript внутри атрибута html

У меня здесь довольно простой запрос. У меня есть страница просмотра с элементом div и формой. Вот как они выглядят.

<div id = "candy" value = "valueOfCandy" ></div>

<input type = "text" value = "javascript:document.getElementById('candy').getAttribute('value')"/>

Мне нужно получить доступ к значению конфеты внутри атрибута input (это может быть любой атрибут).

Я попробовал код, показанный выше, но это не сработало. Я тоже исследовал StackOverflow, но не нашел ничего удовлетворительного. Пожалуйста, помогите.

Обновлено: Всем спасибо. Я нашел ответ на тот вопрос, который отмечу. Кроме того, удалите этот вопрос, чтобы он никого не смутил.

Это не сработает. Что ты пытаешься сделать?

Ason 14.03.2018 13:48

Я избавлю тебя от боли и страданий. Никогда не помещайте JavaScript в HTML за пределами тега скрипта. Всегда.

Jared Smith 14.03.2018 13:48

Зачем нужно делать это внутри элемента? Почему бы не установить значение вне элемента?

adprocas 14.03.2018 13:48

И нет необходимости в этикетке javascript:.

mplungjan 14.03.2018 13:50

Возможно вы имеете в виду <input type = "text" onfocus = "this.value=document.getElementById('candy').getAttr‌​ibute('value')" value = "mouseover me"/>

mplungjan 14.03.2018 13:51
«Мне нужно получить доступ к значению конфеты внутри атрибута input (это может быть любой атрибут)».Когда вам это нужно? Как вы думаете, зачем это нужно делать в разметке? А что насчет того, когда пользователь меняет значение? Я думаю, у вас есть X / Y проблема здесь. Также обратите внимание, что value не является допустимым атрибутом для элементов div; если вам нужно встроить свои собственные данные в атрибуты, используйте Атрибут data-*.
T.J. Crowder 14.03.2018 13:53
I tried the code К сожалению, вы не пробовали код, здесь его нет.
Keith 14.03.2018 13:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
228
5

Ответы 5

Сделайте это в JavaScript вне кода, но после того, как объекты существуют.

Вот пример того, как этого добиться:

var candy = document.getElementById('candy').getAttribute('data-value');

document.getElementById('input').value = candy;
<div id = "candy" data-value = "valueOfCandy" ></div>
    
<input id = "input" type = "text"/>

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

См. Эквивалент $ (document) .ready без jQuery и Как расположение тега скрипта на странице влияет на определенную в нем функцию JavaScript? для получения дополнительной информации.

Что значит какое событие? В посте нет упоминания о событии.

adprocas 14.03.2018 13:53

@mplungjan: Это недостаток в Stack Snippets (о котором я сообщил много лет назад, но SE не заботился), а не в ответе. Когда вы запускаете фрагмент, они располагаются в правильном порядке.

T.J. Crowder 14.03.2018 13:54

@mplungjan, сниппет работает. Вопрос не в том, где разместить код JavaScript. Порядок - это то, как система сниппетов в stackoverflow добавляет разные разделы.

adprocas 14.03.2018 13:54

Фрагменты стека @mplungjan помещают тег <script> в конец <body> без оболочки события. Это совершенно верно.

Patrick Roberts 14.03.2018 13:54

Попытка объяснить выполнение скриптов с HTML может быть более полезной вне фрагмента стека.

Sven Writes Code 14.03.2018 13:55

Если я предполагаю, что вы хотите сделать это при загрузке страницы, сделайте это так

Примечание 1: настраиваемые атрибуты должны иметь префикс data- и использовать .dataset для доступа к его значению.

Примечание 2: для старых браузеров, таких как IE10 и ниже, вам понадобится getAttribute (как во втором примере ниже).

Фрагмент стека 1

<div id = "candy" data-value = "valueOfCandy"></div>

<input id = "candy2" type = "text" value = "" />

<script>
  document.getElementById('candy2').value =
  document.getElementById('candy').dataset.value
</script>

Фрагмент стека 2

<div id = "candy" data-value = "valueOfCandy"></div>

<input id = "candy2" type = "text" value = "" />

<script>
  document.getElementById('candy2').value =
  document.getElementById('candy').getAttribute('data-value')
</script>

Элементы div не имеют атрибута value.

Scott Marcus 14.03.2018 13:59

@ScottMarcus Правильно, и где я это использовал?

Ason 14.03.2018 13:59

В вашем теге div?

Scott Marcus 14.03.2018 14:00

@ScottMarcus Нет, взгляни еще раз ... candy2 - это input, div - это getAttribute

Ason 14.03.2018 14:02

Неважно, как вы извлекаете данные. value недопустим на div. HTML недействителен. getAttrbute() не заботится о действительности.

Scott Marcus 14.03.2018 14:03

Да, хотя может сработать. настраиваемые атрибуты должны начинаться с data-.

Keith 14.03.2018 14:03

@ScottMarcus Вы правы, я обновил свой ответ

Ason 14.03.2018 14:04

И теперь, когда ваш HTML действителен, вы должны использовать .dataset для извлечения атрибута data-* (даже если .getAttribute() работает).

Scott Marcus 14.03.2018 14:04

@ScottMarcus Спасибо ... держит меня в тонусе :) ... ответ обновлен

Ason 14.03.2018 14:08

@ScottMarcus. Интересно, getAttribute, конечно, более совместим со старыми браузерами ... Есть ли ссылка на то, почему вместо этого следует использовать .dataset ?.

Keith 14.03.2018 14:09

@Keith См. Мой ответ по ссылкам на документацию. Но .dataset уже несколько лет является стандартом (часть HTML5). Это не ново.

Scott Marcus 14.03.2018 14:11

Нет, это не было.

Scott Marcus 14.03.2018 14:12

@ScottMarcus Я все это понимаю, но изо всех сил пытаюсь понять, где следует избегать использования getAttribute. Судя по опубликованной ссылке @LGSon, это просто хорошая оболочка для доступа к атрибутам data-. Если это просто для лучшего кодирования, я могу это понять. Но просто беспокоился, что это обесцененный вариант использовать getAttribute и т. д.

Keith 14.03.2018 14:14

Наборы данных несовместимы с IE10 - getAttribute совместим со всеми браузерами, которые в настоящее время стоит поддерживать

mplungjan 14.03.2018 14:16

@Keith Это не является устаревшим, поскольку .getAttribute() является стандартным DOM API и необходим для доступа к множеству других атрибутов. Это просто API, соответствующий data-*. Как я уже сказал, getAttribute() работает.

Scott Marcus 14.03.2018 14:16

@mplungjan Спасибо ... добавил примечание об этом

Ason 14.03.2018 14:18

@ScottMarcus you should be using Да, может быть, это просто формулировка меня обеспокоила. Может, you could use, меня бы не так сильно напугал .. :)

Keith 14.03.2018 14:20

Попробуй это

document.getElementById('input').value =  document.getElementById('candy').dataset.value
<div id = "candy" data-value = "valueOfCandy" ></div>
<input id = "input" type = "text" value = ""/>

Это не то, как вы должны это делать.

JavaScript должен быть полностью отделен от HTML, чтобы избежать целого ряда проблем. Включение JavaScript в HTML, как вы пытаетесь, - это техника, которой уже более 20 лет, которая использовалась до того, как у нас появились стандарты.

Далее, элемент div не может иметь атрибут value. value предназначен только для полей формы. Но вы можете создать атрибут data-*, который позволяет вам создавать собственные атрибуты. Затем вы можете извлечь это значение, используя свойство .dataset.

См. ниже:

// This code would be placed inside of <script> and </script> tags and the whole 
// thing would be placed just before the closing body tag (</body>).
document.getElementById("result").value = document.getElementById('candy').dataset.value;
<div id = "candy" data-value = "valueOfCandy"></div>

<input type = "text" id = "result">

Поместите этот код либо в тег скрипта, либо в отдельный файл js.

Кроме того, всегда привязывайте событие DOMContentLoaded, когда вам нужно манипулировать элементами DOM.

DOMContentLoaded

The DOMContentLoaded event is fired when the initial HTML document has been completely loaded and parsed, without waiting for stylesheets, images, and subframes to finish loading. A very different event load should be used only to detect a fully-loaded page. It is an incredibly popular mistake to use load where DOMContentLoaded would be much more appropriate, so be cautious.

Таким образом, ваша логика полностью последовательна.

document.addEventListener("DOMContentLoaded", function(event) {
  console.info("DOM fully loaded and parsed");

  document.getElementById('candy2').value =
    document.getElementById('candy').getAttribute('value')
});
<div id = "candy" value = "valueOfCandy"></div>
<input id = "candy2" type = "text" value = "" />

Рекомендуется использовать data-attributes, потому что атрибут value связан с полями формы:

document.addEventListener("DOMContentLoaded", function(event) {
  console.info("DOM fully loaded and parsed");

  document.getElementById('candy2').value =
    document.getElementById('candy').dataset.value;
});
<div id = "candy" data-value = "valueOfCandy"></div>
<input id = "candy2" type = "text" value = "" />
всегда привязывайте событие DOMContentLoaded, когда вам нужно манипулировать элементами DOM На самом деле, если вы просто поместите код в конец body, вы получите правильные тайминги, с меньшим количеством кода и меньшим использованием памяти, поэтому всегда действительно не рекомендуется.
Scott Marcus 14.03.2018 14:08

@ScottMarcus настоятельно рекомендуется использовать DOMContentLoaded, чтобы избежать каких-либо проблем, связанных с будущими изменениями в структуре HTML. Это должны быть, потому что просто поместить этот код (javascript) в нижнюю часть тела недостаточно.

Ele 14.03.2018 14:20

Другие вопросы по теме