#javascript #svelte
Вопрос:
Я хотел бы получить значение data-url
в:
{#each profiles as p}
<div data-url={p.url} class="item" on:click={goToPage}>
<div class="row">
<div class="col s12 l4">
<div class="a">
<br />
</div>
</div>
<div class="col s12 l8">
<p>
<strong>{p.fn} {p.ln}</strong><br />
{p.ttl}
</p>
</div>
</div>
{p.dsc}
<hr />
</div>
{/each}
Функция заключается в:
const goToPage = (e) => {
var slug = e.target.querySelector("item").getAttribute("url");
console.log("slug is:", slug);
window.location.href = slug;
};
Однако это не работает, и я получаю
Uncaught TypeError: Cannot read properties of null (reading 'getAttribute')
Я пробовал и другие вещи, такие как
e.target.querySelector("item").getAttribute("data-url");
и
e.target.getAttribute("data-url");
но ни один из них не сработал.
Комментарии:
1. Используйте для этого привязку атрибутов. svelte.dev/документы#свойство bind_element_property
2. @SandipNirmal это неприменимо, потому что div находится в цикле, и здесь есть несколько
someUrl
s.
Ответ №1:
Самый простой и простой способ-просто передать пули в качестве аргумента функции вместо этого:
<div data-url={p.url} class="item" on:click={() => goToPage(p.url)}>
и функция становится:
const goToPage = (slug) => {
console.log("slug is:", slug);
window.location.href = slug;
};
Комментарии:
1. Да! таким образом, атрибут данных
data-url={p.url}
даже не нужен, и мы избавлены от взаимодействий объекта события javascript. Спасибо за совет.
Ответ №2:
e.target
ссылается на то, что вы только что нажали, вам нужно будет использовать currentTarget
вместо этого, и вам не нужно этого делать querySelector
напр.:
var slug = e.currentTarget.getAttribute("data-url");
Я привел простой пример
function goToPage(e){
console.debug(e.currentTarget.getAttribute('data-url'));
}
<div data-url="https://google.com" class="item" onClick="goToPage(event)">
<div class="row">
<div class="col s12 l4">
<div class="a">
<br />
</div>
</div>
<div class="col s12 l8">
<p>
<strong>{p.fn} {p.ln}</strong><br />
{p.ttl}
</p>
</div>
</div>
{p.dsc}
<hr />
</div>
<div data-url="https://google2.com" class="item" onClick="goToPage(event)">
<div class="row">
<div class="col s12 l4">
<div class="a">
<br />
</div>
</div>
<div class="col s12 l8">
<p>
<strong>{p.fn} {p.ln}</strong><br />
{p.ttl}
</p>
</div>
</div>
{p.dsc}
<hr />
</div>
Комментарии:
1. Это работает, но это удар и промах. Пожалуйста, обратитесь к моему отредактированному вопросу. Я бы хотел, чтобы все
div class="item"
это было закреплено.2. @Babr Не на 100% ясно, что вам нужно, было бы полезно просмотреть весь код — если это происходит в цикле, то определенно много упущенного контекста в том, чего вы пытаетесь достичь, что было бы полезно для вас
3. Правильно, я добавил div в цикл (немного сокращенно). Пожалуйста, ознакомьтесь с вопросом. В принципе, я бы хотел, чтобы весь div был доступен для кликабельности.
4. @Babr Я расширил свой ответ и включил рабочий фрагмент.
5. Это тоже не работает. Я сажусь
slug is: null
за пульт.