使用JSON搜索结果中的条目生成URL。

huangapple go评论68阅读模式
英文:

Generate URL using entry from JSON search result

问题

以下是翻译好的部分代码:

const userCardTemplate = document.querySelector("[data-user-template]");
const userCardContainer = document.querySelector("[data-user-cards-container]");
const searchInput = document.querySelector("[data-search]");

let users = [];

searchInput.addEventListener("input", e => {

  const value = e.target.value.toLowerCase();
  const xy = value.split(' ');

  users.forEach(user => {

    if (parseFloat(value.length) < 3) {
      user.element.classList.toggle("hide", true);
    } else {
      var distance = Math.sqrt(
        Math.pow(parseFloat(xy[0]) - parseFloat(user.x), 2) +
        Math.pow(parseFloat(xy[1]) - parseFloat(user.y), 2))
      const isVisible =
        user.name.toLowerCase().includes(value) || distance <= 10
      user.element.classList.toggle("hide", !isVisible);
    }
  })
})

fetch("https://ucc.ar/_clusters/test.json")
  .then(res => res.json())
  .then(data => {
    users = data.map(user => {
      const card = userCardTemplate.content.cloneNode(true).children[0];
      const header = card.querySelector("[data-header]");
      const body = card.querySelector("[data-body]");
      header.textContent = user.name;
      body.textContent = user.company;
      card.classList.add('hide');
      userCardContainer.append(card);
      return {
        name: user.name,
        x: user.x,
        y: user.y,
        element: card
      }
    })
  })

希望这对你有所帮助!

英文:

The simple HTML template below is populated by cards through a JavaScript search bar. Right now all the cards show the same fixed url: &quot;https://www.url.com/aaa. I need to replace the aaa in each url with the url element from the JSON file being searched.

This is my working code: https://jsfiddle.net/25tmakbu/1/

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

const userCardTemplate = document.querySelector(&quot;[data-user-template]&quot;)
const userCardContainer = document.querySelector(&quot;[data-user-cards-container]&quot;)
const searchInput = document.querySelector(&quot;[data-search]&quot;)
let users = []
searchInput.addEventListener(&quot;input&quot;, e =&gt; {
const value = e.target.value.toLowerCase()
const xy = value.split(&#39; &#39;)
users.forEach(user =&gt; {
if (parseFloat(value.length) &lt; 3) {
user.element.classList.toggle(&quot;hide&quot;, true)
} else {
var distance = Math.sqrt(
Math.pow(parseFloat(xy[0]) - parseFloat(user.x), 2) +
Math.pow(parseFloat(xy[1]) - parseFloat(user.y), 2))
const isVisible =
user.name.toLowerCase().includes(value) || distance &lt;= 10
user.element.classList.toggle(&quot;hide&quot;, !isVisible)
}
})
})
fetch(&quot;https://ucc.ar/_clusters/test.json&quot;)
.then(res =&gt; res.json())
.then(data =&gt; {
users = data.map(user =&gt; {
const card = userCardTemplate.content.cloneNode(true).children[0]
const header = card.querySelector(&quot;[data-header]&quot;)
const body = card.querySelector(&quot;[data-body]&quot;)
header.textContent = user.name
body.textContent = user.company
card.classList.add(&#39;hide&#39;);
userCardContainer.append(card)
return {
name: user.name,
x: user.x,
y: user.y,
element: card
}
})
})

<!-- language: lang-css -->

.search-wrapper {
display: flex;
flex-direction: column;
gap: .25rem;
}
input {
width: 80%;
margin: 0 auto;
display: block;
padding: 12px 20px;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
font-size: 18px;
background-color: #ffffff;
}
.user-cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: .25rem;
margin-top: 1rem;
}
.card {
border: 1px solid black;
background-color: white;
padding: .5rem;
text-align: center;
}
.card&gt;.header {
margin-bottom: .25rem;
}
.card&gt;.body {
font-size: .8rem;
color: #777;
font-weight: bold;
}
.hide {
display: none;
}

<!-- language: lang-html -->

&lt;div class=&quot;search-wrapper&quot;&gt;
&lt;input type=&quot;search&quot; id=&quot;search&quot; placeholder=&quot;Search the catalogue&quot; data-search&gt;
&lt;/div&gt;
&lt;div class=&quot;user-cards&quot; data-user-cards-container&gt;&lt;/div&gt;
&lt;template data-user-template&gt;
&lt;div class=&quot;card&quot;&gt;
&lt;a href=&quot;https://www.url.com/aaa&quot;&gt;
&lt;div class=&quot;header&quot; data-header&gt;&lt;/div&gt;
&lt;/a&gt;
&lt;div class=&quot;body&quot; data-body&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/template&gt;

<!-- end snippet -->

答案1

得分: 1

由于您正在复制&lt;a href=&quot;https://www.url.com/aaa&quot;&gt;标签以及卡片模板的其余部分,您需要覆盖href的值。card.querySelector(&quot;a&quot;).setAttribute(&quot;href&quot;, &quot;https://www.url.com/&quot; + user.url);应该可以达到效果。

英文:

Since you are copying the &lt;a href=&quot;https://www.url.com/aaa&quot;&gt; tag along with the rest of the card template, you'll need to override the href value. card.querySelector(&quot;a&quot;).setAttribute(&quot;href&quot;, &quot;https://www.url.com/&quot; + user.url); should do the trick.

huangapple
  • 本文由 发表于 2023年4月20日 03:50:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/76058318.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定