5509

$(fuga).wrap($boga)した後$bogaに何かしても反映されない

タイトルだけやとよくわからんですが・・・

wrap()メソッドは全然使ったことがなくて、なんとなく使ってみたらうっかりはまった例です。よくよく考えたらその通りなのでただのうっかりです・・・

wrap()メソッドについて

一応ふれておくとwrap()メソッドを使うと、対象のjQueryオブジェクトを指定したタグか要素で包めます。

$(boga).wrap("
");

とかすると

boga

になります。このwrapする要素はタグではなくてjQueryオブジェクトでも大丈夫なんですけど、

何がだめなのか

var $boga = $("
"); // これは大丈夫 $boga.method(/* something */); $(fuga).wrap($boga); // これはだめ $boga.method(/* something */);

結論から言うと、次みたいに$hogeを再取得しないとだめです。(そもそもreplaceWithとかのほうがいいかもとかは置いといて)

var $boga = $("
"); // これは大丈夫 $boga.method(/* something */); // wrapした後、親に移動してそれを $hoge に返す // つまり元の$hogeを再取得する $boga = $(fuga).wrap($boga).parent(); // これも当然大丈夫 $boga.method(/* something */);

何がどうなってるの

wrap()メソッド自体はほぼそのままwrapAllに渡してるだけなんですけど

wrap: function( html ) {
    return this.each(function() {
        jQuery( this ).wrapAll( html );
    });
}

下にコメントで書いたように、wrapAll()メソッドでwrapする要素はclone()メソッドで複製したものなので、元の$bogaにあれやこれやしようとしても、そもそも$bogaでwrapされているわけではないのでどうしようもない、ということでした。

wrapAll: function( html ) {
    // 略

    if ( this[0] ) {
        // The elements to wrap the target around
        var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
        // ↑ 実際に追加されるのは html ではなく html を複製したもの

        if ( this[0].parentNode ) {
            wrap.insertBefore( this[0] );
            // ↑ 複製したものを追加している
        }

        wrap.map(function() {
            // 略
        }).append( this );
    }

    return this;
}

カレー

たべたい

コンテンツにheight属性のない画像が含まれていると正しい高さが取れない

画像がロードされるのを待って、高さを更新しないとだめです。ってどうしても毎回忘れててうっかり計算あわへんとかで時間潰してしまう・・・

下のようなHTMLがあって、

Photo by Martin Gommel

"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?"

コンテンツの高さを取得するには例えば

jQuery(function($) {
    var contentsHeight = $("div.txt").get(0).offsetHeight;
});

とかで取れるんですけど、画像にheight属性がないので、画像がロードされるとコンテンツの高さが変わってしまうんですね。なので、画像がある場合には、画像がロードされるのを待ってからもう一度取得しないとだめです。

画像のロード完了はnew Image().completeを使うんですけど、そこの説明ははしょってm5ImgLoadっていうの使ってます。ちょっと前に$(“img”).load()(img.onloadも同じ)だと画像の読み込み完了が取れないみたいなエントリを書いてやっぱり必要なかったとか書いてたのですけど、やはりIEだと取れないので、これ使ってます。

jQuery(function($) {
    var $txt = $("div.txt"),
        contentsHeight = $txt.get(0).offsetHeight,
        $images = $("img", $txt),
        imgLength = 0,
        imgLoaded = 0;

    if ( $images.length ) {
        imgLength = $images.length;
        $images.each(function() {
            $(this).m5ImgLoad(function() {
                imgLoaded += 1;
            })
        });

        (function() {
            if ( imgLoaded === imgLength ) {
                contentsHeight = $txt.get(0).offsetHeight;
                return;
            }
            setTimeout(arguments.callee, 30);
        }());
    }
});

なんか長くなりましたけど、height属性がない場合も多いので面倒ですけど気にしておかないとはまります・・・

jQuery1.6以降でattr(“offsetHeight”)、attr(“offsetWidth”)が取れない

attr(“offsetWidth”)も。詳しい話は置いておいて、1.6からattr周りの仕様が変わって、prop(“offsetHeight”)とかやれってことなんでしょうかとか思ったら、後方互換の問題が当然発生してしまうので、やっぱり1.6.1で元に戻したよとか、そういう話になってたはずなのにattr(“offsetHeight”)は取れないのです。

たとえ以降のバージョンで直ったとしても、1.6と1.6.1でだめならなんかもう色々面倒なことになる気がする・・・exValidationとかjQselectableで、というか色んな場面でattr(“offsetHeight”)を乱用?してたのでこの仕様変更(バグ?)は結構辛いのです。

こういう人他にもいないですかね。propと併用するよりは、ピンポイントな話なので、

$(hoge).attr("offsetHeight")
$(hoge).attr("offsetWidth")

とかやってた箇所を

$(hoge).get(0).offsetHeight
$(hoge).get(0).offsetWidth

というように、DOMから参照するように置き換えると1.6以降でも動作するようになります。

使いやすいマルチプルセレクトへの道のり(セレクトボックスとチェックボックスについて)

jQselectableの拡張で、しっくりきて使いやすい、控えめなマルチプルセレクト(複数選択可能なセレクトボックス)を模索中、、つまり考察だけだす

おさらい

※ 仕様ではなくて、認識です

セレクトボックス
一覧の中からひとつを選択させるもの(そもそも)
チェックボックス
基本的には一覧である必要はなくて、複数ある項目の中から指定する項目を選択させるというもの

セレクトボックスのmultiple属性

どちらもそもそもの使い方が全然違うけど、セレクトボックスにはmultiple属性があって、trueにすると(multiple属性を追加するだけやけど)、PCではShiftかCtrl(Cmd)を押しながらクリックすると複数項目が選択できる

ただのmultiple select – jsdo.it – share JavaScript, HTML5 and CSS

この「ShiftかCtrl(Cmd)を押しながら」というのはかなり嫌な実装で、普通に見てそれが複数選択可能かなんて分からへんし、「Shift or Ctrl(Cmd)+クリック」をエンドユーザーが認識してる割合は超低い(自分周り調べ)

そもそもエクスプローラーとかFinderの仕様に沿ってるのかもしれないですけど、それできるのって普通知らないですよね

フォームでは複数項目選択可の場合って、だいたい「複数選択可」みたいなテキストをラベル付近に入れると思うけど、ていうか入れてほしいけど、この補助テキストがあったとしてもきっとよくわからん。マルチプルセレクトの場合。

forked: ただのmultiple select – jsdo.it – share JavaScript, HTML5 and CSS

(どうやんの?)

ほんだら、補助テキストを詳しく書いたりするんでしょーか

forked: ただのmultiple select – jsdo.it – share JavaScript, HTML5 and CSS

うーん、こんなごちゃごちゃうるさいフォームは美しくない(デザインではなくて手法が)

ここまでで分かることはセレクトボックスは複数選択に全くもって向いていないということ

ただし、iPhoneとAndroidでマルチプルセレクトを見ると、結構みやすいし使いやすい

ただし一覧性は低いのでたくさんある場合は一度一番下までスクロールして確認してから、選択という流れになりそう

チェックボックス

一方チェックボックスは複数選択に適していて、たくさん項目があってもチェックを付けていく間隔から「あ、これは複数選択できるんだな」ということが分かるし、使い方もクリックしてチェックするだけ

ただのチェックボックス – jsdo.it – share JavaScript, HTML5 and CSS

つまりー

どうしたいかというと、jQselectableのいいところは「一覧性が高く、目標に到達しやすい」ということで、これをマルチプルセレクトに対応させる場合、「一覧性が高く、目標に到達しやすい上に複数選択が可能であることが見てすぐ分かる」ということ

でまぁ、そもそも使いにくいセレクトボックスの更に使いにくいマルチプルセレクトなもんで、どうしようかなーというところで、とりあえず思ったこと書きだしただけです

個人的にはセレクトボックスにチェックボックスをあわせたものが見やすいとは思ってて、iPhoneのやつもチェックが入ってるから複数選択できることが分かるんですね

ただまぁ、非常におださい感じになってしまうので(※個人の感想です)、チェックボックス組み合わせるのはナシやなぁとかなんとか。色々見てはいるものの、こんなの使いやすかったよとかそゆのあれば教えてほしいです

あと、jQselectableはWeb界隈の人たちにはご好評いただいているものの、どこまでのエンドユーザーに対してやさしいかっていうのは、把握できてないですし、もしかしたら使いにくいかもしれませんし。自分周り調べでは、結構普通に選択してはりましたけど

むー

ピクセルグリッドに入社しました

先月までばたばたしていて、アーカイブの穴がまた空いてしまったのですが、、それはおいておいて、5月いっぱいでマインドフリーを退職し、6月からは居住地を東京に移し、ピクセルグリッドで働いています。

(pixelgrid.push(“5509″) とかしようと思ったけど意味違ってくるかと思ってやめました)

色んな意味で刺激的すぎて毎日鼻血出っぱなしです。血が足りない。

ディレクターからフロントエンジニアになり、いや以前もディレクターと言いつつ開発ばっかりしてましたけどw、UIをもっともっとアレしたいなぁと思ってるアレです。アレはソレとかコレで補完してください。

関東はこれで三度目なので特にこれといって不便とかないですが、まぁ・・・車が多いし道混みすぎてますね。大体バイク移動なのですいすいです。

そんなわけでせっかく東京に来たので、色々参加していこうと思ってるので、おもろいこと全然言われへん大阪人ですけど、こちらの方はよろしくです。今日Sugamo.cssに初参加してえどさんのおかげで逆にやる気なくなったり、とかしてないです、恐ろしい集まりやで・・・

とりあえず、雑貨屋たくさん探そー。いいとこ知ってる方教えてください:)

あれ、なんか色々書こうと思ったのにいざ書いたら書いたでめっちゃ短い・・・

どうでもいいこと

直接関係ないですけどFacebookのEmployerのところ変更したら

こういう表記になって、気がきいてるなぁとか思ったのでした。

Author

nori
nori
- UI Engineer
Location
- ,