Kinopyo Blog

プログラマとしてRuby, Rails, iPhone, iPad,Macなどなどと向き合う日々のログポース

Posts Tagged ‘Snippet’

jQueryで右クリックを無効にする方法

2010年01月07日

jQueryでマウス右クリックを無効にする方法です。

“contextmenu”のイベントはjQueryのドキュメントには乗ってませんが、

それのハンドラでreturn falseすることで簡単に実現できます。


$("document").bind("contextmenu", function(){

    return false;

});

jQuery #idでは一つし要素か選択できない、同じIDを持つ複数要素を選択するには

2009年12月20日

そもそもIDというのは一つのページ内でユニークなはずですが、

何らかの理由で同じIDを持つ形になったとしましょう。

その場合普通のjQueryの#idセレクタでは一つの要素(順番的に最初に合致した要素)しか選択できません。

そこで[id=xx]の形で属性フィルタで全ての選択することができます。

以下サンプルコードです。


$("#foo").css("background-color","gray");

$("[id=bar]").css("background-color","green");



use #id selector






use attribute selector [id=xx]




jQuerySelectorByID

テキストボックスの文字列を選択(色逆転)、取り消すには

2009年12月10日

テキストボックスの文字を選択された状態にする方法とその解除方法です。

IEの場合selectボックスにselect()関数を使うとJavaScriptエラーになります。

Firefoxは大丈夫です。


function selectFocusText(element){

	// for IE

	if (element.nodeName == "SELECT") return;

	element.select();

};

function unselectFocusText(){

	// for IE

	if (document.selection) {

		document.selection.empty();

	// for Firefox

	} else if (window.getSelection) {

		window.getSelection().removeAllRanges();

	}

};

jQueryでoptionが一つのSelectボックスをラベル表示

2009年11月28日

htmlにoptionが一つしかないselectboxがあるとします。

このようなselectを非表示にし、そのテキストラベルで表示させたいのもありですね。



jQuery文はこれ:

//:only-childフィルタで子要素が一つしかない要素を選択
var $target = $("select :only-child");

$.each($target, function(index, item) {

	// spanのhtmlを構築
	var span = '' + $(this).text() + '';

	// thisはoptionを指しているため、そのparentのselect要素を非表示
	// 構築したspanを挿入
	$(this).parent().hide().after(span);

});

さらにブランクの要素をフィルタ

selectボックスの先頭がblankのケースが結構あると思います。

その場合はラベル表示させたくないです。

なのでそれをフィルタするには、以下のようにfilter()を使います。

var $target = $("select :only-child").filter(function(index) {

	return $.trim($(this).text()).length != 0;

});


$.trim()の1000倍速い方法でブランクを検出

jQueryにはblankを検出するメソッドがないため、上記のソースコードでは

$.trim()を利用して判断しています。

しかしこの$.trim()は遅いとの報告がありました。

そこでblankのテキストを検出するためのメソッドも提供されました。

$.trim()が2000msかかったものがこれだと0.5msになったようです。

blank: function( text ) {
	return !text || !/\S/.test(text);
}

興味のある方はこの記事を参照してください。英語のサイトです。

Zipalong Blog » Blog Archive » jQuery: x1000 faster test for blank strings (on large strings)

jQueryのtoggle(switch)が大変便利、条件文5行のコードが1行に短縮!

2009年11月27日

toggle()の普通の使い方は多分皆さんご存知だと思います。

該当要素をクリックするたびに表示/非表示を切り替えます。

f:id:kinopyo:20091128134759g:image:right

今日紹介するのはこのswitchパラメータ付のtoggleです。

swtich文を評価しtrueであれば要素を表示、falseであれば非表示です。

これで下記のコードがこのswtich付きのtoggle文なら一行ですみます。

if (name == "kinopyo") {
	$("p").show();
} else {
	$("p").hide();
}

これがこうなります。

$("p").toggle(name == "kinopyo");

どうですか?すごくないですか?

まさにjQueryの「The Write Less, Do More」ですよね。

ただし判断の条件文が行の最後になるので、

読みやすさは多少落ちると思います。


ちなみに、Googleの単語とよく似ているので、ついついtoogleと書いちゃいますorz

Flash,JSONでのクロスドメインアクセス勉強メモ

2009年11月24日

gihyoサイトの「ここが危ない!Web2.0のセキュリティ」連載の第4回:「Flash,JSONでのクロスドメインアクセス」の勉強メモです。

Flashのクロスドメインアクセス

動作原理

データ提供側で認証のファイルを設置するだけです。

ファイル名は「crossdomain.xml」で、これが例なのかこう書かなければならないのかは明確に書いてません。


	

JSONでも実はクロスドメインアクセスが可能

動作原理

eval()関数でデータを評価するだけで使用可能になる

var obj = eval("("+req.responseText+")");
クロスドメインの実現

setterメソッドをサポートしているブラウザ(FirefoxやSafari 3等)では,setterメソッドを再定義することによって,JSONもSCRIPTタグで呼び出して使うことが可能になる。


	
	

 

jQuery逆引きレファレンス、属性&コンテンツ編(@ITより)

2009年11月23日

@IT連載:jQuery逆引きリファレンスの第二回のテーマは属性&コンテンツです。

目次は以下になります。

* 属性値を取得するには?

* 属性値を設定するには?

* 複数の属性値をまとめて設定するには?

* 関数の結果によって動的に属性値を設定するには?

* 属性値を削除するには?

* スタイル・クラスを追加/削除するには?

* スタイル・クラスが適用されているかを判定するには?

* スタイル・クラスの適用/解除を交互に行うには?

* 要素に適用されたスタイル情報を取得するには?

* 要素に特定のスタイルを適用するには?

* 複数のスタイル・プロパティをまとめて設定するには?

* 要素の表示位置を取得するには?

* ページのスクロール位置を取得/設定するには?

* 要素の高さや幅を取得するには?

* 要素の高さや幅を設定するには?

* 要素のテキストを取得するには?

* 要素のテキストを設定するには?

* フォーム要素の値を取得/設定するには?

勉強メモ

text()とhtml()の違い

(1)取得する対象

 要素セット(jQueryオブジェクト)が複数の要素を含んでいる場合、htmlメソッドは先頭要素の内容だけを取得しますが、textメソッドはすべての要素の内容を結合したものを取得します。

(2)取得する内容

 名前のとおり、htmlメソッドは要素の内容をHTML文字列として取得しますが、textメソッドは純粋なテキストだけを取得します。

(3)対応する形式

 textメソッドはHTML/XMLいずれの形式でも動作しますが、htmlメソッドはHTML(XHTMLを含む)形式でしか動作しません。このサンプルでは扱っていませんが、textメソッドをXML形式で利用する方法については、あらためてAjax編で紹介する予定です。

http://www.atmarkit.co.jp/fdotnet/jqueryref/02attribute/attribute_16.html

height(val)、width(val)

引数valには数値、もしくは「em」や「%」などの単位付きの数値を指定できます(単なる数値の場合はピクセル値として認識します)。

要素の高さや幅を取得するには?

- height()、width()、innerHeight()、innerWidth()、outerHeight()、outerWidth()

関数 padding border-width margin
height、width x x x
innerHeight、innerWidth o x x
outerHeight、outerWidth o o x
outerHeight、outerWidth(true o o o


関数の結果によって動的に属性値を設定するには?

- attr(name, fnc) -

コールバック関数の戻り値を用いて設定。

$(function() {
	$('li > img').attr(
			'src',
			function(index) {
				return "http://www.wings.msn.to/books/" + this.id + "/"
						+ this.id + "_logo.jpg";
			});
});


jQuery Tips: live関数はすべてのイベントに有効じゃない、その他…

今までjQueryを使ってきたtipsをメモします。

Tipsの定義とおり知っていればちょっと便利になるけど、

知らなくても特に問題ないですね。

ただしlive関数においてはすべてのイベントに有効じゃないのは

知っておいてほしいです。

live関数

liveはすべてのイベントに対応していない。

サポート

click, dblclick, mousedown, mouseup, mousemove, mouseover, mouseout, keydown, keypress, keyup

非サポート

blur, focus, mouseenter, mouseleave, change, submit


ajax関数のurlパラメータ

AJAXのURLではセレクタも併用できる。セレクタによりあるページの一部だけを読み込むことができる。

こんな形です:”url #some > selector”

デフォルトは”body>*”のセレクタが適用されていますよ。

$("#links").load("/Main_Page #jq-p-Getting-Started li");


:has(selector)フィルタ

:has(selector)は持ってるすべての子要素に対して動作してる

divい対して:hasフィルタを使うと、p要素までフィルタが走る

span ... p..

属性フィルタの組み合わせ

[filter][filter]……のように複数を連続して記述することもできます。この場合、すべての属性フィルタに合致する要素だけが取り出されます。

htmlの組み立て

ハードコードで書く
$(select).append("


");
jQueryの関数を用いて書く
$(select).append($('

このほうが簡潔だと思いますが、、

:nth-child

:nth-childフィルタによりn行おきに子要素を取得することができる

例えば、2、5、8行目……のように3行おきに(「3で割ったときの余りが2」番目の)要素を取得したい場合には、以下のように記述できます。

$('ol > li:nth-child(3n + 2)')


validationプラグイン

jQueryのvalidationプラグイン:showErrorを定義するとhighlightとunhighlightとは実行しない

そもそもshowErrorはエラーをどう表示するかを決めるための高レベルの関数なので、

簡略化したhighlightとunhighlightは隠蔽されたっぽいの感じで、完全に実行しません。

JavaScript: argumentsは配列じゃない、配列のメソッドを使うには

2009年11月18日

argumentsは配列じゃないため、配列のメソッドは

使えません。ということは本を読んだとき当たり前だと思ったんですが、

実際コードに落としたときは

自然とargument.slice()を書いちゃいました。

argumentsで配列のメソッドを使うには

Array.prototype.<配列のメソッド>.call(arguments,<パラメータ>)

Array.prototype.slice.call(arguments,2)

上記の意図としてはarguments.slice(2)の表現に近いです。

argumentsはarray-likeオブジェクト

ここでちょっとargumentsの基本知識を復習します。

length属性もあるし、[]でindex指定のオブジェクトを参照できますけど、

argumentsは配列に似ているオブジェクトだけです。

予約語

Technically, argumentsは予約語ではないですが、

予約語として認識してよいです。

つまりargumentsという変数は作成しないでってことです。


function foo(x){
alert(x);
var arguments;
arguments[0] = null;	//xの値が変更されちゃう
alert(x);	// null が出力される
}
callee Property

Refers to the function that is currently being executed.

今実行中のファクションを参照しています。

function(x) {
if (x <= 1) return 1;
return x * arguments.callee(x-1);
}


 

クライアント側のActiveXが有効か無効かを検出するJavaScript

2009年11月17日

知っておくべきこと

  • ActiveXはIE専用のものと理解してよい、Firefoxなどでは存在しない
  • new ActiveXObject(“Microsoft.XMLHTTP”)でIEのXMLHttpRequestが生成される
    • IE のバージョンによっては、”Microsoft.XMLHTTP”の代わりにこれらも使用できるそうです:
    • “Msxml2.XMLHTTP.5.0″
    • “Msxml2.XMLHTTP.4.0″
    • “Msxml2.XMLHTTP.3.0″
    • “Msxml2.XMLHTTP”
  • もし生成できればActiveXコントロールは有効になっている


検出ソースコード

// ブラウザがIEの場合
if (window.ActiveXObject) {
try {
//IEのXMLHttpRequestオブジェクトを試しに生成
var xhr = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert('ActiveXコントロールは無効になっています');
}
}


参考サイト

動画をHTMLに埋め込むヒント – faireal.net