+ JavaScript & jQuery 質問用スレッド vol.8 +
■ このスレッドは過去ログ倉庫に格納されています
JavaScript を自ら学ぶ人のための質問スレッドです。
>>2-4のテンプレを読んだ上で質問してください。次スレは>>950が>>2のテンプレ案(本スレで改善案があれば考慮)を元に立ててください
■質問を書く上で
(1) 煽り、コード制作依頼等、人を不快にさせる投稿はご遠慮下さい。公序良俗を守った応対を心がけてください。
(2) 他の人に迷惑をかけるスクリプトの質問はご遠慮ください。
(ブラクラ、[戻る], [閉じる], [クリック] の妨害、画面占有など)
(3) 質問者及び議論を行う人はメール欄を空欄にし、名前にレス番を入れることを強く推奨します。回答者はなりすましを判断できませんので、なりすましが現れても自己責任となります。
(4) 常に自発的に調べる心構えを持ってください。
具体的には「自分で調べてから質問する」「回答をもらってわからない単語があればGoogle検索してみる」など。
わからない内容を代わりに調べてくれる回答者をお望みの方は余所で質問してください。
(5) 出来るだけ一般的な用語を使用してください。脳内オレオレ用語は混乱の元です。
(6) 出来るだけサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。
※必ず「問題の事象が再現されること」を確認してください。
必要な部分だけ切り出したつもりで現象が再現できていなかったケアレスミスがしばしば見られます。
(7) サンプルコードに HTML が含まれる場合は http://validator.w3.org/ で [Check] してみてください。
(8) 質問を具体的かつ詳細に書くと回答を得られやすいです。>>2の質問テンプレートを活用してみてください。
(9) 時にはあなたが望む「答え」だけでなく、「意見」などが寄せられる場合もあります。
+ JavaScript & jQuery 質問用スレッド vol.7 + [無断転載禁止]©2ch.net
http://mevius.2ch.net/test/read.cgi/hp/1467906819/ >>491
この子は teratail で有名なアスペ君だから注意ね
https://teratail.com/questions/149753
> infologicmation
> 結局自己解決できました。
> 一応、参考までに私が作ったテストコードを載せておきます。
>
> ...中略...
>
> このサイトなら良い指針やアドバイスが得られると思って、わざわざ時間を掛けて質問文を作ったにもかかわらず、アスペみたいな見当違いの的外れの回答が送られたり、
> そんなのの相手に無駄に労力割かされたり散々な目に会ったのに、結局は自力で解決するという結末で、本当に不毛なことをさせられたと実感してます。
> teratailはもっと経験豊かな人が居るんじゃないんですか?どうなってんの?178viewもありながら(確認時点で)…
>
> 当然、ベストレビュアーは無しとします。 私たち日本人の、日本国憲法を改正しましょう。
総ム省の、『憲法改正國民投票法』、でググって
みてください。拡散も含め、お願い致します。 全部のjavascriptファイルにinitializeメソッド実装してるプロジェクトあるんだけど
それをどこから読んでるか全くわからんのだけどjavascriptとかhtmlの機能で
自動で呼ばれるなんて仕様ないよね? 質問です。
jQueryで、指定した要素がy座標で中央らへんになるようにページをスクロールしたいのですが、どうすればよいでしょうか?
var top = $(this).offset().top;
$('html, body').animate({ scrollTop: top }, 'fast');
とすることでなんとなくスクロールはできましたが、上端になったり下端になったり安定しません。 >>497 です。
試行錯誤の結果、あまりよくわかってませんがbodyにpadding: 50vh 0;を設定したうえで
var top = ( $(this).offset().top ) - 400;
$('html, body').animate({ scrollTop: top }, 0);
とすると一応、$(this)がどこにあっても真ん中に表示されるようになりました。
あとfastだと上にスクロールする動きが変だったので速度は0に。
これで一応自己解決した、ということになるでしょうか。
とりあえず自分の環境に合わせて400としましたが、ほんとはちゃんと画面の高さ/2で計算したほうがいいでしょうね。 画面の高さを取得する方法があるからそれ調べると良い。
あと画像などすべてのコンテンツが終わった後に呼び出さないと高さがずれると思う WordPressスレと迷ったのですが、こちらで質問させてください
WordPressにおけるfancyboxに関してです
現在、HTMLのウェブサイトをWordPressに移行しています
fancybox3を使っていたのでそのまま使おうとしたのですが、WordPressで使われているjqueryが古いのか反映されきれないオプションがあります
<a href="<?php echo content_url(); ?>/uploads/03-1.png" data-fancybox="03">テキスト</a><a href="<?php echo content_url(); ?>/uploads/03-2.png" data-fancybox="03"></a><br>
テキストをクリックするとまず画像が一枚表示され、他の画像もグループ化することによって順に表示されるようにしたいのです
HTMLのサイトでは上記の表記で問題なく動いています
easy fancyboxではテキストをクリックすると画像が呼び出される方法およびグループ化された画像を順に表示させる方法が分かりませんでした
WordPressでは固定ページでテンプレートにすべてコンテンツを入れているのでそれが原因なのでしょうか
色々調べたのですが、やり方が間違っているのかそもそも出来ないのか分からず、解決策をお持ちの方がいらっしゃれば教えてくださると嬉しいです
よろしくお願いします 途中で切れてしまいました 申し訳ないです
解決策をお持ちの方がいらっしゃいましたらお教えくださるとうれしいです
よろしくお願いします >>497-499
vh, vw は「Ctrl +-」で、文字・画像などが拡大縮小できなくなるから、使いづらい >>499
$().onで呼び出してるので大丈夫かとは思いますがありがとうございます!
画面の高さはjQuery的に言うと$(window).heightですかね、思ってたよりずっと単純明快でしたね 大勢に向けたサイトでなく、少数に向けたWebツールなのですが
Spaceキーを押すことで、対象をtoggleしようとしています
しかし、リマップソフトなどでSandS(SpaceキーをShiftキー代わりに使う)を設定している場合(主に僕ですが)は
Spaceを1度押すだけでキーイベントが2回発火してしまうようです
つまりtoggleが2回行われ、元に戻ってしまいます
ならいっそ4回押されるごとに、と変数を使ってみてもたまに半端にカウントがずれてしまいます
どうすれば1回だけの発火に抑えてうまくtoggleさせられるでしょうか…? 一応keyupでなくkeypressにすると1回のみのカウントになりますが、
keypressはどうもIMEがオフの状態でないと発火しないようで…
(あくまでIMEはオンである必要があるので…) jQueryオブジェクトは何度も使う場合は変数に代入しておいたほうが、探させる処理の負担を減らせるようですが
$(this)も変数に代入しておいたほうがいいですか?($thatとか?)
それとも「既に代入された結果が$(this)であるため、その必要はない」ですか? …と思いましたが()がある時点で引数がある、つまり関数なのでたとえthisといえど毎回処理してるということになりそうですね
やはり代入しておくほうが速い…? jQuery のソースコードでは、冒頭部分で、よく使うものを変数に入れてる
var arr = [];
var document = window.document;
var getProto = Object.getPrototypeOf;
var slice = arr.slice;
var concat = arr.concat;
var push = arr.push;
var indexOf = arr.indexOf;
var toString = class2type.toString;
var hasOwn = class2type.hasOwnProperty;
var fnToString = hasOwn.toString;
var ObjectFunctionString = fnToString.call( Object );
変数をループの外に出す、テクニックも使っている。
ただし、ループ中に、変数が変化しないに限る
length = elems.length;
for ( ; i < length; i++ ) { }
こう書くと、毎回メソッドが呼ばれてしまうから。
for ( ; i < elems.length; i++ ) { }
JavaScript のthis は、that に代入することが多いけど、
jQuery のthis は、必ずインスタンスを指すように修正されているから、
that に代入することは少ない >>503
ディスプレイの高さでも、色々ある
タスクバーのような、固定部分を引いた画面の高さ (ピクセル単位)とか。
window.screen.availHeight
固定部分を含むのか、含まないのか >>509
Windowsのタスクバーを左でなく上(あれ、いやタスクバーはそもそも元々下か。とりあえず左や上)
に置いてる身としてはそのへんも気になりますね…今回はとりあえず大体でしたが >>507
速いが、そもそも何度も同じjQueryオブジェクトを使うと
言うところに根本的な問題がある。
正しくjQueryを使っていれば、何度も同じjQueryオブジェクトを使うことはない >>511
例えば
$that = $(this);
let val = $that.val();
let xxx = $that.attr('xxx');
let yyy = $that.attr('yyy');
....(略)
のようなものを想定していましたが、何かもっと良い方法がありましたか?
(このくらいならjQueryを使わないでthis.valueなどとしたほうがほんとは速いのでしょうけれど、
へたに混ぜると細かな差異に振り回されないか不安で…) var c = $('#car');
と、jQuery Object を変数に入れても、メソッドチェーンでも同じ
$('#car').before(何々).prepend(何々).append(何々).after(何々);
return で、そのインスタンス(jQuery Object)を戻しているから、同じ
$('#car').attr({src: 何々, title: 何々}).css({top: 50, left: 100}); >>513
あ、すみません、実際には続けてではなく離れた場所でやる場合です…
あと
$that = $(this);
$that.val( $that.val() + 'ついか' );
$that.attr( 'xxx', $that.attr('xxx') + 'ついか' );
この場合はどうですか? $thatなんかいらない
$(this).val(function(i, value) {
return value + 'ついか';
}).attr('xxx', function(i, attr) {
return attr + 'ついか';
}); >>515
jQuery久々ですが、そういえばそういうの見かけた覚えがあります…
ドキュメント見たら普通に書いてありましたね
現代風にするとこうでしょうか…?
$(this).val( (i, value) => {
return value + 'ついか';
}).attr('xxx', (i, attr) => {
return attr + 'ついか';
});
indexは省略しても動くようですが、省略しないほうがいいんですかね? 長いと怒られましたので二つに分けます
かなり初歩的な質問になってしまうと思いますがよろしくお願いします。
最近勉強を始めHTMLCSSでサイトを作ろうとしておりました。
その中に画像のスライダーを入れたく思い、JSもしくはjQueryで組もうと
いろんなサイトを参考にしてたのですがうまくいきません。
現状、画像が縦に並んでる状態です。
jQueryをDLしてプラグインするのは難しそうだったので
head内からファイルで読み込む方法を選択しました。
明記できない部分が多かったので消去してますが
下記のコードで直す点があれば教えていただきたいです。
下記以外のコードでも試しましたができなかったので
もっと根本的なところが間違ってるとも思うのですが <!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="■■.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.flexslider-min.js"></script>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.1.min.js"></script>
<title>■■</title>
<style>
</style>
<script type="text/javascript" charset="utf-8">
$(window).load(function() {
$('.flexslider').flexslider();
//ここに指定するクラスと、先ほど<div>に指定したクラスを一致させること
});
</script>
</head> <body>
<div class="flexslider">
<ul class="slides"><!-- 必ずクラスは slides -->
<li>
<img src="1.jpg" /><!-- 表示させたい項目を<li>に囲んで並べる -->
</li>
<li>
<img src="2.jpg" />
</li>
</ul>
</div>
</div>
</body>
</html>
長くなりましたがどうぞよろしくお願いいたします 使っている、jQuery のバージョンが古くない?
それに、jQueryを2つも読み込んでいるのも、おかしい
それに、jQueryよりも先に、jquery.flexslider-min.js を読み込んでいるのも、おかしい。
たいてい、jQueryを一番先に読み込む
参考にしているソースコードが古いのでは?
「javascript jquery slider」で検索! ありがとうございます
やはり根本的に間違えてるようですね
指摘いただいたところを直し
教えていただいた情報でやり直してみます jQueryにて
…
<div.aaa>
<div.iii>
<div.aaa>
<div.iii> ★
<div.iii> ★
<div.iii> ★
<div.aaa> ←$(this)
<div.iii>
…
$(this)から見て、違うクラス(あるいは特定のクラス)の連続した兄たち ★★★
(thisと同じクラスの兄に挟まれた兄弟)
を絞り込むにはどうすればよいでしょうか? >>539
すみません、色々複雑になってはいますがひとまずその場で閉じているということで…
こうですね
<div.aaa></div>
<div.iii></div>
<div.aaa></div>
<div.iii></div> ←★
<div.iii></div> ←★
<div.iii></div> ←★
<div.aaa></div> ←$(this)
<div.iii></div> >>531
開始タグと終了タグの対応関係がおかしい
オレオレ用語で説明を省略しすぎ >>531
以前ちょっと使っただけだから忘れたが
prevAll(セレクタ)とかprevUntil(セレクタ)とかはどうか >>533
prevUntilを使って兄要素を全部取得、eachで直近の兄のクラスを取り、直近の兄以降のクラス判定をして格納、って感じかな >>533
prevUntil便利そうですね…!こういうのを探してました、ありがとうございます!
>>534
each…
あれ、
$a = $(this).prevAll('.aaa').first();
//ここlastにしてハマりかけましたがprevの場合は後ろから数えるんですね…
$i = $(this).prevUntil($a, '.iii');
でも行けそう?
間にあるのが.iiiだけなら
$i = $(this).prevUntil($a);
でもいいのかな?
やってみます >>535
そうそう、書き忘れたが$(this)に近い方からになるので感覚的に逆
ついでにお気づきだろうが、後ろならnextAll(セレクタ)、nextUntil(セレクタ)ね そのサイトを閲覧している間(タブを最前面にしている間)だけ動くスクリプトって作れますか?
ブックマークレットでもなんでもいいんですけど、自分用に
「このタブを閲覧しているときだけ動くストップウォッチ」
的なものが欲しくて…
つまり他のタブを閲覧中は止まるようにしたいのです
拡張機能も見かけましたがどちらかというと「今まで何時間見たか」を計るやつっぽくて
そうではなくストップウォッチ的に頻繁にスタートとリセットを繰り返しながら計測したく…
「マウスカーソルがbodyに乗ってる間だけ時計が進む」みたくすれば可能でしょうか? >>537
visibilitychangeイベントとdocument.hidden >>538
まさにこれですね!ありがとうございます! $(document).on('mousemove', function() {
});
って効かないんですか?
ドラッグ時、マウスがbody外に出てもいいようにしたかったんですけど
mousemoveイベント自体を検知しなくなってしまいました
(documentでなく何かしらのdom要素に対して設定しないといけない?)
mouseupはdocumentに設定しても大丈夫だった(boby外でも検知できた)のですが… >$(document)
コンソールに、エラーが出ているはず
$( '#abc' )
文字列型で、CSS セレクターを書く >>543
うーん…?
でも単に
let wa= 0;
$(document).on('mousemove', function() {
wa++
console.log(wa);
return false;
});
としただけなら、別にエラーにならずちゃんとログも出るので
何か別の部分がおかしかったのかもしれません
(それともたまたま動いてしまっているだけで本当は推奨されていなかったりする…?) mousemoveは "対象要素の上で" 動いたときに発生するんだよ
bodyの外で動いても発生しない
外に出るのを検出するのはmouseleave >>545
> bodyの外で動いても発生しない
html要素でも正しく発火する
mousemoveはウインドウ内限定の発火装置 $(document)
この、document って、" " で囲んでいないから変数だよな。
変数を入れても動くのか
知らなかった こんなことしても動くよ
DOM要素の配列
$(document.querySelectorAll('A'))
二重jQueryオブジェクト(普通はしない)
$($('A'))
数値でも良い(もちろん任意のオブジェクトもOK)
$(1).each(function() { console.log(this.valueOf()) });
数値の配列でもいい
$([1,2,3]).each(function() { console.log(this.valueOf()); });
要するに、$()の中が配列として扱えればそのまま、単数であれば
配列に変換して、それをjQueryオブジェクトでラップしてるだけ
jQueryプラグインを作ったことがあればわかるんだけど、
$(・・・).on()とか$(・・・).addClass()とか言ったjQueryオブジェクトの
メソッドが呼ばれたら、中でループして(配列に変換できるのでループは必ずできる)
一つ一つの要素に対して、その要素(DOM要素とは限らない)のメソッドを呼び出しているだけ
シンプルで汎用的な設計だから柔軟な使い方ができる。
DOM APIとの相性も良い(混ぜて使える) 次のプロジェクトからjQueryは重いから使うなって言われたんだが
便利なjQueryプラグインも使わないわけだよね
どうすんの? >>550
jQueryよりも軽いという代替案を要求しろ
そしてそれにより開発工数が減るのか検討したい、と言え
(検討に結果jQueryを使った方が良いことになるだろうw) >>550
CSSとサーバーサイドでなんとかする… >>551
俺も同じ感じでjQuery否定されてreactになった ReactってjQueryより重いんだけどねw
しかもそのReactは将来性が危ういからなぁ
一部の企業でReact Native離れが始まる
https://tech.nikkeibp.co.jp/it/atcl/idg/14/481709/082000458/?ST=cio-appli&P=2
少なくともReactはNative使ってスマホアプリと
コード共有しないと意味がないね
そもそもスマホアプリがないならやる意味がない jQuery+underscore.jsで小規模案件たいてい何とかなるよ。
個人的にはvue.jsとかもやるけども。 >>551 >>553 >>554
まあそりゃそうだね。なんかノリと流行りで
jQuery否定しているだけみたいだし
理論詰めで問い詰めようw 使ってもいいけど、学習コストかかりますよ
とか言えば大抵流れるw jQueryでどんなことしてましたか?って聞かれて、開いたり閉じたり以外が思いつかなかった
クラスつけたりはずりたりもたまにやるけど…
みんなjQueryで何してるの? >>561
それはjQueryっていうより、JavaScriptで何をしましたかの答えだと思うね ReactNativeはiOSとAndroidのコードを共通にするためのもの。
iOSとAndroid、だ。
Webとアプリではない。
Webビュー使った今までのクロスプラットフォームフレームワークと全然違うから突っ込まれないようにな。
React叩くときにうっかりReactNativeまで話を広げて自爆しないようにしよう。 reactやvueとjQueryは相性悪いよね
両方使いたい場合は片方諦める? reactやvueはDOM操作を直接やるなってやつだっけ?
DOM APIも使っちゃだめなのかな 相性悪いっていうか、jqueryが要らなくなるんだよ
vueのプロジェクト上でjquery読み込んでゴリゴリ作ったりできるけど、わざわざそんな事する必要がない
プラグインに頼りたいなら同居させても良いんじゃない? >>568
DOM APIが使えるならjQueryも使えるんじゃね? わざわざそんな事する必要がないっていうのは
DOM APIを使用する意味がないってことね >>563
jQueryは世の中に出回ってるプラグイン、コピペ、開いたり閉じたりで
大抵のことができるからjQueryできますと言いにくい
だからといってゴリゴリのJavaScriptを要求されることはない
(´;ω;`)… jQueryは一番はDOMを自由にいじれるのと、プラグインだよなあ
プラグインも素のjsに対応していないやつも多いし >>572
まぁjQuery得意です!っていう奴は大体他にアピールないことが多いから取りづらいわ… >>572
知らんがなw
お前の問題であってjQueryの問題じゃないだろ >>545
画面の端からはみ出てもドラッグ距離を測れたらよかったんですが、やはり無理っぽかったですね…
その後別の問題が発生して
mousedownでaddClass('.dragging')→mousemoveで移動→mouseupで.removeClass('.dragging')
みたいな感じのこと(実際はもっと複雑)をしてるのですが
たまにmouseupを検知してくれず、ボタンから指を離しているのに.draggingになりっぱなしになってしまいます
何かこれを回避する方法ってあるでしょうか? >>576 訂正
誤 mousedownでaddClass('.dragging')→mousemoveで移動→mouseupで.removeClass('.dragging')
正 mousedownでaddClass('dragging')→mousemoveで移動→mouseupでremoveClass('dragging') >>574
そういうものなんだ、参考になった
>>575
うん、jQueryは何も悪くない
今の現場でVue使えるはずだったけど世の中には悪い奴がいっぱいいるっていう問題で頭いっぱい 世の中には悪い奴がいっぱいいるって書いてあるじゃん 世の中に悪いヤツがいっぱいいるというのは真実ですよ でも良い奴だってたくさんいるッ!
そんな世界を滅ぼすなんて間違ってるッ!! >>576
addEventListenerでcapturing phaseは? 非同期の promise とか then とかがよくわからないんだけど
書けるのは書けるけど人のかいた非同期コードが全く読めない
わかりやすい解説サイトとかないですか callback を登録しているだけ
すぐに実行されない。
後から実行されるというだけ >>587
初心者が書いたコードはわかりにくいからねw
Promise使ってるのに、なぜかネストしていたり
Promiseを使ったコードはリファクタリングしていくと最終的にこんな感じになる
https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Using_promises#Error_propagation
doSomething()
.then(result => doSomethingElse(result))
.then(newResult => doThirdThing(newResult))
.then(finalResult => console.log(`Got the final result: ${finalResult}`))
.catch(failureCallback);
最初、Promiseを返す関数(doSomething())から始まって、
thenでPromiseを返す関数 もくは Promiseを返さない関数
(そういうのは内部でPromiseに変換される) をつなげていく >>589
こうかくためにはdoSomethingにPromiseを返す関数を実行するプロミスを返す関数を実行するプロミスを…
って定義しなきゃいえないんじゃないの? >>590
意味がわからん
最初のdoSomeThingだが、標準でresolve状態のPromsieを
返してくれるメソッドがあるから、こんな感じのコードでも動く
Promise.resolve(123)
.then(v1 => v1)
.then(v2 => v2)
.then(v3 => console.log(v3))
functionで書き換えるならば、
Promise.resolve(123)
.then(function(v1) { return v1; })
.then(function(v2) { return v2; })
.then(function(v3) { console.log(v3); })
関数実行をただ連続で行っているだけ。この例では値をそのまま返しているだけだから
すぐに次の関数が実行されるが、Promiseを返せば処理が完了してから次の関数が実行される
だから、
1. (たくさん)作るのは、ただの関数 または Promiseを返す関数
2. その関数を引数にして、処理をthenでつないでいける
という単純な形にまで落とし込まないで使うから、初心者が書くPromiseは複雑になりがち ■ このスレッドは過去ログ倉庫に格納されています