Kinopyo's Blog

Web開発のいろいろ、まだ初心者段階

jQuery1.3.2のバグ?IEで を$.trimするとき変な結果に

March 10th, 2010

jQuery 1.4.2ではこれは治ったようです。

jQuery最新版をお使いの方は下記のようなバグはもう発生しません。

サンプル

※jQuery 1.3.2で発生する問題※

HTML
<select>
	<option id="foo">&nbsp;</option>
	<option>11</option>
	<option>22</option>
</select>

<tr id="bar">&nbsp;</tr>
Javascript
var optionText = $("#foo").text();

// firefoxは0、IEは1
alert("select optionタグの をtrimした後のlength: " + $.trim(optionText).length);

var trText = $("#bar").text();

// firefoxは0、IEも0!
alert("trタグの をtrimした後のlength: " + $.trim(trText).length);

結果

selectのoptionタグのテキストにある“&nbsp;”

$.trimをかけて見ると

Firefoxはちゃんとtrimしてlengthが0になったが、

IEはtrimできずlengthが1のままです。

しかしtrタグのテキストにある”&nbsp;”をtrimすると

IEも正しくtrimしてlengthが0になるんです。。。

DEMO

jQuery最新版(1.4.2)を使うDEMO

Javascript index指定で配列の要素を削除するには

March 8th, 2010

今まで全然気付かなかったんです、

JavascriptのArrayにはdeleteみたいなAPIがないことに。

配列の要素をindex指定で削除したい場合は代わりにsplice関数を使います。

splice関数

とほほからのレファレンスでは

array.splice(start, n, e1, e2, …) (N4)

0 から数えて、start 番目から n 個の要素を削除し、その代わりに e1, e2, …を値とする要素を埋め込みます。戻り値は JavaScript のバージョンによって異なります。

var xx = new Array("A", "B", "C", "D", "E", "F", "G");
xx.splice(2, 3, "c", "d", "e");   // "C", "D", "E" が小文字になります

indexで配列の要素を削除するには

myArray.splice(index, 1);

indexは削除する要素のindex、1はこの一つだけを削除する意味で

他のパラメータはいらないです。

またsplice後は配列そのものが変更されます。

jQuery IDに括弧がついたオブジェクトを取るには

March 3rd, 2010

こんなHTMLがあるとします。

idに[]が付いてますね。

<input id="foo[0]" type="text" />
<input id="foo[1]" type="text" />
<input id="foo[2]" type="text" />

こういうIDに括弧が付いたモノに対して

普通の#付きのjQueryセレクタでは選択できません。

$("#foo[0]");    // 取れません

属性フィルタ[attribute=value]でとるのが正解です。

$("[id='foo[0]']");

スクロールを最下部に移動するJavascript

March 2nd, 2010

スクロールバーを最下部に移動するJavascriptです。

普通のJavascriptで書くと

function go_bottom(targetId){

    var obj = document.getElementById(targetId);

    if(!obj) return;

    obj.scrollTop = obj.scrollHeight;
}

完全にjQueryで書くとこんな感じ

function go_bottom(targetId){

   var $obj = $("#" + targetId);

    if($obj.length == 0) return;

    $obj.scrollTop($obj[0].scrollHeight);
}

これ以外はhiddenのinput項目を最下部に置いといて、

それをfocusするような技もありけど、、

Chromeの内蔵翻訳ツールバーを無効にする方法

March 2nd, 2010

すべての言語でAutomatic Translationを無効にしたい人のために。

  • C:\Users\(ユーザ名)\AppData\Local\Google\Chrome\User Data\Defaultへアクセスします。
    • WinXPはC:\Documents and Settings\(ユーザ名)\Local Settings\Application Data\Google\Chrome\User Data\Default
  • 「Preferences」ってファイルがあります。
  • 「translate」で検索すると、最後あたりでこのような文字列があるはずです。

chrome_preference

  • translate_language_blacklistを、以下コードに書き換える。
"translate_language_blacklist": [ "en", "de", "zh-TW", "it", "af", "sq", "ar", "be", "bg", "ca", "zh-CN", "hr", "cs", "da", "nl", "et", "tl", "fi", "fr", "gl", "el", "he", "hi", "hu", "is", "ja", "ko", "lv", "lt", "mk", "ms", "mt", "no", "fa", "pl", "pt", "ro", "ru", "sr", "sk", "sl", "es", "sw", "sv", "th", "tr", "uk", "vi", "cy", "yi" ],
  • 修正完了

chrome_preference_modified

Javascriptのforループのパフォーマンスのいい書き方

February 22nd, 2010

面白いかと思ったのでメモしときます。

普通の書き方

var rows = document.getElementsByTagName('tr');

for( var i = 0; i < rows.length; i++ ) {

   rows[i].className = 'newclass';

   rows[i].style.color = 'red';
  ...
}

効率のいい書き方

var rows = document.getElementsByTagName('tr');

for( var i = 0, row; row = rows[i]; i++ ) {

    row.className = 'newclass';

    row.style.color = 'red';
    ...
}

参考サイト:大家来讨论Javascript的效率/优化问题 – JavaScript – web – JavaEye论坛

jsp内のコメントアウトはjsp式の記述で

February 17th, 2010

基本

多分ほとんどの人は分かっていると思いますが、

jspファイル内のコメントの記述は以下になります。

<%-- JSPのコメント --%>

そしてHTMLのコメントの記述は

 <!-- HTMLのコメント -->

問題

SP内でもHTMLのコメント記述が使えますが、

コメントアウトした部分にJavaプログラムが埋め込んだ場合

そのコードは実はコンパイルされてしまいます。

例えば、

<!-- コメントアウト
<input type="text" value="<%= request.getNotExistMethod() %>" />
 -->

ここでは全く存在しないJavaのメソッドを書きました。

このままだとJSPがコンパイルエラーになります。

“The method getNotExistMethod() is undefined for the type HttpServletRequest”というメッセージです。

正しい方法

Javaプログラムが埋め込んだコードをコメントアウトするには

JSPのコメント式を記述します。

上記の例で言うとこうなります。

<%-- JSPコメントアウト
<input type="text" value="<%= request.getNotExistMethod() %>" />
--%>

補足

下記のようなコンパイルが通るJavaコードが書かれた場合は、

もちろんエラーは出ないし、 HTMLの部分もコメントアウトされたため画面には何も表示されません。

<!-- コメントアウト
<input type="text" value="<%= request.getContextPath() %>" />
-->

MagicMouseを買いました

February 16th, 2010

マルチタッチがサポートされているマジックマウス、

ついに購入しました。

今のところはまだクリックとスクロールだけデフォルトで使えますが、

そのうちフルパワーを発揮したいと思います。


マルチタッチ以外でBluetoothが使えるのも私にとって大きなポイントです。

今はACアダブタ以外にMacに接続する線などがなくなり

整然とした感じです。

ちなみにクリーニングも大変便利になりそうです。

毛が立ってない布を使って表面を掃除できます。


あとはゲームでもマルチタッチが使えるなら最高。。。

以下写真を御覧下さい。

クロスサイトのリンクはいいか悪いか

February 15th, 2010

Question

If I have 3 websites, Is there a problem to cross link websites?

Answer by Google Webmaster Central

要はサイト間の”関連性”が一番大事です。

関連性があればOKで、なければ無意味って感じです。

「海外SEO情報ブログ」からの訳文

サイト同士に何らかの関連性があるかが問題だね。

1つがドライクリーニングのサイト、もう1つが古美術のサイト、もう1つが携帯レビューのサイトだとしたら、ページの下にリンクがあるのは奇妙だ。

漫画のサイトを見ていたのに、ページの最後に行ったら自動車保険やコーヒーテーブルのサイトへのリンクが突然出てくるのは、何にも関係がない。

「どのくらい関連性があるのか」をまず先に考えてほしい。

3つのサイトで相互リンクしてもたいした数じゃないから、大きな問題にはならないと思う。

でも、30サイト、300サイトでクロスリンクしていたら、「何の関係があるんだろうか」と一般のユーザーも競合も不思議に思うだろう。

紳士洋服・婦人洋服・子供洋服がクロスリンクしあうのは、関連があるから完全に理由がある。

同じ企業傘下にある会社同士も、正当な理由があるから問題があるとは思えない。

少ない数だったらまだいいかもしれないけど、サイトの規模が大きくなるに連れてページの下に大量のリンクが出現するのは良くないね。

Javascript変数にブロックスコープはない

February 12th, 2010

JavaをやってからJavascriptを触ったので、

Javascript変数にブロックレベルのスコープがないことにビックリしました。

if文ブロックか、forループブロックか関係なく、

function内に定義された変数は全て同じスコープ:functionのスコープになります。


例えば

function test(o) {

    var i = 0;                      // i is defined throughout function

    if (typeof o == "object") {

        var j = 0;                  // j is defined everywhere, not just block

        for(var k=0; k < 10; k++) { // k is defined everywhere, not just loop

            document.write(k);

        }

        document.write(k);          // k is still defined: prints 10

    }

    document.write(j);              // j is defined, but may not be initialized

}


変数kとjはそれぞれif文のブロック、forループのブロック内に定義されたが、

実はfunctionのスコープとなりfunction内ならどこでも参照できます。


これをしっかり理解しないと以下のようなミスが起こしやすいです。

var scope = "global";

function test( ) {

    alert(scope);         // Displays "undefined", not "global"

    var scope = "local";  // Variable initialized here, but defined everywhere

    alert(scope);         // Displays "local"
}

test( );


一番目のalertは”global”だと思ったらこの記事を読む価値はあるでしょう。

一番目のalertは”undefined”を表示します。

なぜならさっき言ったように変数のスコープはfunction内に跨るのです。

varで宣言する位置、順番と関係ありません。


ここではfunction内で同じ名前でscopeという変数が宣言され、

“global”の値を持つグローバル変数は上書きされました。

そして一番目のalert時のscopeは初期化されていないため、undefinedとなってしまいます。


上記のコードを書き換えると以下と同じです。

function test( ) {

    var scope;       // Local variable is declared at the start of the function

    alert(scope);    // It exists here, but still has "undefined" value

    scope = "local"; // Now we initialize it and give it a value

    alert(scope);    // And here it has a value

}

誤解を招かないように変数の宣言はfunctionの先頭に置くのが大事ですね。

Get Adobe Flash playerPlugin by wpburn.com wordpress themes