@natty_xx

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

楽天ブックのAPIの反映

解決したいこと

楽天ブックスのAPIの記述において、クリック処理と、データ取得、HTML生成、表示処理など分離させることでメンテナンス性を上げる為、結果取得後のif(data.count > 0) {内を関数化するようしようとしたのですが、反映されなくなってしまいました。
関数に変更し、呼び出すだけでは反映されないのか、教えていただきたいです。

初心者な質問ですみません。
よろしくお願いいたします。

この方のコードを使用させていただいています。
https://qiita.com/takuyahori/items/8b80bf0c28da37bd1112

発生している問題・エラー

エラーはありません

該当する元のソースコード

 }).done(function(data) {
      if(data.count > 0) {
        $(".comment").remove();
        let list = "";
        for (let i=0; i<data.Items.length; i++) {
          list += '<li class=lists__item>' +
          '<div class=lists__item__inner>' +
          '<a href=${data.Items[i].Item.itemUrl} class=lists__item__link target=_blank>' +
          '<img src=${data.Items[i].Item.largeImageUrl} class=lists__item__img alt>' +
          '<p class=lists__item__detail>作品名: ${data.Items[i].Item.title}</p>' +
          '<P class=lists__item__detail>作者  : ${data.Items[i].Item.author}</p>' +
          '<p class=lists__item__detail>出版社: ${data.Items[i].Item.publisherName}</p>' + '</a>' + '</div>' + '/li>';
        };
        $(".lists").prepend(list);
      } else {
        $(".commit").remove();
        $(",lists").before("<div class='commit'</div>");
        $(".comment").html("<p class='message'>検索結果が見つかりませんでした。<br>別のキーワードで検索してください。 </p>");
      };
    });

自分で試したコード

function HtmlItem (item) {
    let list = “”;
    for (let i = 0; i < data.Items.length; i++){
      list += `<li class=lists__item>` +
      `<div class=lists__item__inner>` +
      `<a href=${data.Items[i].Item.ItemUrl} class=lists__item__link target=_blank>` +
      `<img src=${data.Items[i].Item.largeImageUrl} class=lists__item__img alt>` +
      `<p class=lists__item__detail>作品名:  ${data.Items[i].Item.title}</p>` +
      `<p class=lists__item__detail>作者:  ${data.Items[i].Item.author}</p>` +
      `<p class=lists__item__detail>出版社:  ${data.Items[i].Item.publisherName}</p>` +
      `</a>` +
      `</div>` + `</li>`;
    };
    let HtmlItem =  HtmlItem (item);

  })
  .done(function (data) {
    if(data.count > 0) {
      $(“.comment”).remove();
      HtmlItem (item);
      $lists.prepend(list);
      console.log(data);
    } else {
      $(“.comment”).remove();
      $lists.before(“<div class=‘comment’></div>“);
      $(“.comment”).html(“<p class=‘message’>検索結果が見つかりませんでした。<br>別のワードを検索してください。</p>“);
      console.log(“い”);
    };
  });

0 likes

3Answer

変なとこで分割しててそもそも構文として成立しなくなってしまっているので,分けるなら分けるでエディタの補助に頼るなりしてきちんと関数を分離してください.

スコープが理解できてないうちにリファクタリングを試みるのは無謀です.最近のJavaScriptは意図的にクロージャやconstを使うので,むやみな変更は設計をぶっ壊すことになります.

0Like
  • function HtmlItem ... を書く位置が間違っています。参考元ページのコードで言えば $.ajax({ の前の行あたりに置くべきです。
  • 変更後ではダブルクォート " が開きと閉じのダブルクォートに変わっていますが、これは正しくありません。元と同じにしてください。
  • let HtmlItem = HtmlItem (item); は無意味な代入であり、また自分自身を呼び出しているため無限再帰します。消してください。
  • $lists が未定義です。適切に定義してください。
HtmlItem (item);
$lists.prepend(list);

は未定義の引数 itemHtmlItem 関数に渡しています。また HtmlItem は受け取った item を使っていませんし、関数内で組み立てた list を使ってもいないので、何も起きません。この部分は以下のように書き換えた上で、 HtmlItem もその下のように変えるべきです。

$lists.prepend(HtmlItem(data));
function HtmlItem (data) {
    let list = "";
    for (let i = 0; i < data.Items.length; i++){
      // ここは同じため省略
    };
  return data;
}
0Like

元のソースコードとして質問に挙げられているコードの $(",lists") も間違っていて、参考元ページにあるように $(".lists") (コンマではなくドット)が正しいです。利用中のコードがあるなら書き写しや編集をミスしていないか確かめてください。

0Like

Your answer might help someone💌