
現在共有ボタンを作成中で、クリックすると SNSシェアリンクとテキストボックス(中にページURL)とページURL をコピーするボタンをポップアップで表示させ、✕ボタンで閉じる機能を作成しております。
ポップアップ時に生成しているため共有ボタンをクリックするたびに追加されてしまい困っております…
ポップアップを閉じる時に削除するという方法で改善できるのではないかとアドバイス頂いたのですが、1回目のポップアップの時点で生成予定のものが消えてしまいます。
コードをどのように修正すれば良いでしょうか?
※ 該当コード
https://wandbox.org/permlink/tOIPsHFR0IlYikVb
No.4ベストアンサー
- 回答日時:
No3です。
>コードは短縮した方が良いでしょうか?
ご自身がわかりやすい方法で良いと思いますが、何でも一度変数化していると、数が多くなるとどの変数が何を意味しているのか分かりにくくなってきます。
グローバルでこのような変数が多数あると、わかりにくくなってきます。
スコープ内で消費できる変数は、スコープ内に納まるような考え方の方が、わかりやすくなると思います。
(個々のスコープで、機能的に独立できるような考え方)
例えば、ご提示のスクリプトでも
>const textboxHref = location.href;
>let url = location.href
と同じ内容を、別の変数に代入しているのは無駄に思えます。
また、jQueryを読み込んでいるようですが、最後の数行を除いて、ほとんど利用していませんよね?
(読み込み手間をかけながら、利用しないというのは不可思議)
イベントのバインドも、「addEventListener」であったり「onclick」であったりと一貫性が感じられません。
ご提示のスクリプトに限って言えば、「textContent」と「innerHTML」も同様です。
要素取得のためだけに、jQueryを読み込むのであれば、例えば自前で
const QS = s => document.querySelector(s);
のような関数を定義しておけば、読み込みは不要になりますし、「要素を取得する関数」とだけ覚えておけば、個別に要素の変数を多数作成するよりもわかりやすくなる可能性がありますし、スクリプトも全体的に短縮化が可能です。
(jQueryに慣れているなら、関数名を$にしておいてもよい)
短い構文が必ずしも良いわけではありませんけれど、複雑にならない程度に短縮できるのなら、目視で追う上では視認性が上がる可能性はあります。
どちらがわかりやすいかは人にも寄るので、当面はご自身がわかりやすい記述にしておくのが良いのではないでしょうか。
Q.同じ内容を、別の変数に代入しているのは無駄に思えます。
また、jQueryを読み込んでいるようですが、最後の数行を除いて、ほとんど利用していませんよね?
イベントのバインドも、「addEventListener」であったり「onclick」であったりと一貫性が感じられません。
ご提示のスクリプトに限って言えば、「textContent」と「innerHTML」も同様です。
短い構文が必ずしも良いわけではありませんけれど、複雑にならない程度に短縮できるのなら、目視で追う上では視認性が上がる可能性はあります。
どちらがわかりやすいかは人にも寄るので、当面はご自身がわかりやすい記述にしておくのが良いのではないでしょうか。
A.回答ありがとうございます。
同じ関数をまとめて直接URLを代入するということですね。
確かに jQuery をほとんど使わず Javascript で書いているのなら統一すべきでした。
それぞれ addEventListener と textContent に統一致しました。
可能な限りコードを短縮するように心がけてみます。
No.3
- 回答日時:
No2です。
>現在のページのURLを取得するコードでエラーが発生しており
>どうすべきか分かりません…
エラーメッセージをしっかり読みましょう。
「取得するコード」ではなく、セットする際のエラーではありませんか?
しかも、
> Cannot set properties of null (setting 'value')
「null値に属性(=value)を設定できません」
という内容ですので、要素の取得ができておらず、null値になっているものと推測できます。
スクリプトが長すぎて、却って読みにくいのですが、要素取得時のセレクタが間違っているものと思われます。
>document.querySelector("scope-renderer");
はタグ名を探しますが、クラス名で検索したいのではありませんか?
なお、ご質問には関係ありませんけれど、処理手順として、
要素の変数 = document~~~;
内容 の変数= 実際の内容;
要素の変数.value = 内容の変数;
全体的に上記のような方法を取っていらっしゃいますが、それぞれの内容を一度変数に代入してから使用するという手順になっています。
しかしながら、一回の処理に一度しか使用しない内容ですので、直接代入するようにしてしまえば、行数としては1/3程度(文字数は1/2くらいか?)にできると思われます。
例えば、上記であれば
document~~~.value = 実際の内容;
の1センテンスで済ませられます。
※ 何度も繰り返して使用する場合は、後者の方がごくわずかに遅い可能性がありますが、大量に処理をしているわけではないので、差はないと考えても良いでしょう。
A.回答ありがとうございます。
エラー文をしっかり確認すべきでした申し訳ありません。
fujillin さんのご指摘通り document.querySelector("scope-renderer"); にセレクタが欠けていたようです。
後ほど見返した際に分かりずらいのかと思い直接代入する事は避けていたのですが、コードは短縮した方が良いでしょうか?
参考サイトを見ながら頂いたアドバイスを修正したところ URL をコピーするボタンを実装することが出来ました。
※ 修正コード
https://wandbox.org/permlink/XfNit4uORmVJ1T8p
※ 参考サイト
https://qiita.com/RYO_nami/items/4543edfc7febe88 …
https://dubdesign.net/javascript/execcommand-copy/
No.2
- 回答日時:
こんばんは
ご提示のスクリプトは追加するのみの内容なので、
>1回目のポップアップの時点で生成予定のものが消えてしまいます。
をどのようにして実現しようとしているのか不明です。
ですので、修正点と言われてもわかりませんけれど・・
普通に、Xマークをクリックした際の「閉じる」処理の中に、追加した要素を削除する処理を加えておけば良いのではありませんか?
とは言うものの・・
毎回、同じ要素を作成したり削除したりすることになるので、無駄な処理を行っているように思われます。
最初からテンプレート内にHTMLで要素は記述しておいて、異なる部分(=inputの値)だけを書き換えるような仕組みにしておけば、生成・追加するスクリプトも削除するスクリプトも不要になると思います。
そうすることで、「増えてしまう」とか「削除しなければならない」などということも考える必要が無くなるのではないでしょうか。
回答ありがとうございます。
fujillinさんのおっしゃるようにJavascript で毎回同じ要素を作成したり削除したりするのは負荷になるという考えが最も適切だと思われます。
コードを修正してみたのですが、現在のページのURLを取得するコードでエラーが発生しておりどうすべきか分かりません…
アドバイスお願い致します。
※ 修正コード
https://wandbox.org/permlink/nWR3a4eTnKFnolqD
※ エラー文
Uncaught TypeError: Cannot set properties of null (setting 'value')
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
Javascript で条件分岐を使い共通コードをまとめる方法が分かりません
JavaScript
-
覚えることが少ないプログラミング言語を教えて下さい。
その他(プログラミング・Web制作)
-
ホームページ
ホームページ作成・プログラミング
-
-
4
指定したフォルダからjpegならjpegだけを取り出し、スライドショーを作成できませんか?スマホの中
画像編集・動画編集・音楽編集
-
5
至急助けてください!!!あと2時間しかないです! ボタンを押したら0ランプが点灯し、コンマ5秒後に1
その他(プログラミング・Web制作)
-
6
会社でパソコンを4、5台買うのですが Microsoftアカウントとメールアドレス(Outlookな
グループウェア
-
7
IEを使わずHTMLを取得する
Excel(エクセル)
-
8
PCを効率的にセットアップしたい
その他(開発・運用・管理)
-
9
皆さんはGUCCIはハイブランドだと思いますか? また、GUCCIを持ってる年齢層のイメージを教えて
CGI
-
10
iso ファイルを作成する方法をお教え下さい。 私はDVD Fab を持っていますが、今一使い方が良
その他(コンピューター・テクノロジー)
-
11
フォルダ内のファイルが50音順で並ばないのですがなぜでしょうか?
Windows 10
-
12
webデザインの会社の現実を教えてください
HTML・CSS
-
13
パソコンを買い替える際、前のパソコンで使用していたMicrosoft Officeのアカウントを新し
その他(Microsoft Office)
-
14
従業員が1名だけのSierっているんですか? プログラマー
その他(プログラミング・Web制作)
-
15
ウインドウズアップデートは、大規模アップデートもあり、 PCを多少時間起動しただけでは、自動ダウンロ
その他(OS)
-
16
誰か試して欲しいのですが、PCのメモ帳を保存せずにPCを再起動すると保存されていますよね?
その他(コンピューター・テクノロジー)
-
17
至急助けて!PDFを編集する方法 就職先から契約手続きが送られてきて、その中に給与所得者の扶養控除を
PDF
-
18
C言語 関数、変数の宣言について
C言語・C++・C#
-
19
インターネット上の説明がウソだらけなんですけど… どうやったら画面録画出来ますか。 Win11です。
その他(OS)
-
20
会社のホームページをご自身で作られた方いますか? 簡単ですか? またおすすめのメーカー等あれば教えて
ホームページ作成・プログラミング
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて!goo でいただいた回答を...
-
ホームページを作ろうと思いま...
-
エクセルの数式について教えて...
-
アニメ公式サイト風なWebページ...
-
ビフォアーアフターのページは...
-
無料のホームページを作成でき...
-
hpの画像の公開
-
メールフォーム設置の文字化け...
-
ホームページビルダー15で作っ...
-
XREA使用で作成したHTMLファイ...
-
友人のホームページを引き継ぐには
-
ホームページビルダー11で作...
-
FC2ホームページの変更に仕方
-
友達にドッキリをしたくて、ホ...
-
ホームページの画面文字を濃く...
-
【ホームページ作製】HPのWebペ...
-
古いウェブ作成ソフト使ってる...
-
マウスオーバーすると色が変わ...
-
ホームページ作成に伴い、元デ...
-
会社のホームページをご自身で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ホームページを作ろうと思いま...
-
教えて!goo でいただいた回答を...
-
ホームページの画面文字を濃く...
-
友達にドッキリをしたくて、ホ...
-
ホームページビルダー22でリン...
-
XREA使用で作成したHTMLファイ...
-
FFFTPでサーバに新規フォルダが...
-
ホームページビルダーを複数の...
-
ホームページビルダー19文字化け
-
ホームページを作りたいのです...
-
Adobe FLASH に代わるソフトは...
-
ビルドとリビルドの違いを教え...
-
ホームページビルダー15で作っ...
-
クリック時に生成したものを削...
-
ホームページを作ろうかと
-
ワードプレスで、画像の横に文...
-
ホームページ作成に伴い、元デ...
-
無料で作成、更新できるホーム...
-
友人のホームページを引き継ぐには
-
AIチャットで、ガセが多いサイ...
おすすめ情報