2009年11月19日 #ie javascript

経緯

iframeで動的に画面を読み込む際URL不正などによる通信エラーが起こした場合の

エラーハンドラを追加したかったので判断するロジックが必要でした。

わざと誤ったURLを渡して検証しましたが、以下のコードはだめでした。

// documentがnullかと思ってそれで判断しようとしたんです。
if (this.contentWindow.document) {}

現象

あるプロパティは存在しているのに、アクセスができない。コードで書くと

// プロパティがオブジェクトに存在するかを判断
// ここはアラーとが出した、つまり存在したってこと
if ("aProperty" in obj) alert('obj has aProperty');
// 次にそのオブジェクトにアクセスしようとすると
// エラーになった
obj.aProperty

IE8の開発ツールで見たら「アクセスが拒否されました」と書いてある。

エラーをcatch

判断のロジックをtry-catch文に書けばいいです。

try {
  this.contentWindow.document;
} catch (e) {
  if (e.number == -2147024891) {
    //アクセスが拒否されました。
    alert(e.message);
  } else {
    alert("別のメッセージ");
  }
}

参考サイト:http://sei.qee.jp/docs/freetalk/2009/02.html

2009年11月18日 #javascript

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

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

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

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

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

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

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

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

argumentsはarray-likeオブジェクト

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

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

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

予約語

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

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

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


```js 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.

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

```js function(x) { if (x <= 1) return 1; return x * arguments.callee(x-1); } ```
2009年11月18日 #ie

開発においてローカルでいろいろテストすることが多いでしょう。

その時ブラウザを開くと「セキュリティ保護のため、このコンピューターにアクセスする可能性のあるスクリプトやActiveXコントロールを実行しないよう、IEで制限されています。オプションを表示するには、ここをクリックしてください」という警告がそのたびに出て、気分が悪くなっちゃいます。IEの[セキュリティ]タブをいじってもファイルはローカルなので、効きません。


解決方法

  • [マイコンピュータ内のファイルでのアクティブコンテンツの実行を許可する*]をチェックしIEを再起動(*がついてるので再起動は絶対必要とされている)

f:id:kinopyo:20091117012539j:image:right

f:id:kinopyo:20091117012540j:image

  • 「スクリプトを実行しても安全とマークされているActiveXコントロールのスクリプトの許可」をチェック

f:id:kinopyo:20091117012541j:image

バージョン情報

  • OS: Windows XP
  • IE: IE8

参考サイト:How to disable "ActiveX Control May Be Unsafe" popup - Stack Overflow

2009年11月17日 #javascript

知っておくべきこと

  • 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

2009年11月17日 #diary

ブログをキャリアの礎にしようと思っている方へ - GoTheDistanceこういうすてきな記事を見つかりました。

自分の興味関心をエントリにしていることで、輪郭を帯びてきて色んなことが可視化されていきます。それだけでも、大きな意味があります。「ああ、オレはやっぱこういうの嫌い or 好き」の方向性が見えてくるようになります。


特にこの言葉に感じたことが多かったのです。

最近仕事の関係で、よくIE6~IE8とFirefoxでのJavaScript、CSSの不具合を調査したり、悩んだりしました。

特定のブラウザで画面が崩れるのは本当に嫌だなと

痛感しました。

これがウェブ開発の現状なんですかと?

なぜ自分はもっと立派なプログラムの問題と戦うのではなく、

ブラウザと戦わなきゃならないのか?

なぜActiveXの無効を前提とするユーザがいるのか?

なぜIEがアップグレードするたびに新たな不具合を招くのか?

なぜマイクロソフトはもっと強制的にユーザにIEのバージョンをアップグレードさせないのか?

もしChrome、Opera、Safariなどの市場シェアが大きくなったら、それらも対応するとの要求が出てくるのか?

なぜお客さんは低いバージョンのIEを未だも使っているのか?Firefoxに切り替えるのはそんなに不現実の話なのか?


こんなのは嫌です。

そもそもFlexを勉強しよと思ったきっかけは

会社の先輩のサイトを見て、

デザインやアニメーションがすごいきれで聞いたら、

「Flexならこんなの簡単に作れるよ、ブラウザと関係ないし」の言葉でした。

自分の好きの方向性というのはこんなことでしょう。

ブラウザのわがままを避けたい、

純粋なプログラミングがしたいです。

2009年11月16日 #ie

概要

ローカルのファイルを参照する際のセキュリティを変更したとします。

IEの[インターネット オプション] ダイアログ ボックスの [セキュリティ] タブでは

ローカルのマイコンピュータのセキュリティゾーンがデフォルトでは非表示になっています。

それを表示させるにはレジストリを編集する必要があります。

動作環境

以下の環境で動作確認済みです。

その他の環境についてはマイクロソフトのサポートヘルプを参照してください。

  • OS: Win XP
  • IE: IE8

方法

警告 : レジストリ エディタの使い方を誤ると、深刻な問題が発生することがあります。


[インターネット オプション] ダイアログ ボックスの [セキュリティ] タブにマイ コンピュータのセキュリティ ゾーンを表示するかどうかは、次のレジストリ キー内にある Flags 値によって設定できます。

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\0

Flags 値は DWORD 値です。Flags 値のデータ値を 47 (16 進) に設定すると、マイ コンピュータのセキュリティゾーンが表示されるようになります。Flags 値のデータ値を 21 (16 進) に設定すると、マイ コンピュータのセキュリティゾーンが非表示になります。

http://support.microsoft.com/kb/315933
2009年11月15日 #jquery

@IT新しい連載:jQuery逆引きリファレンスが始まりました。

既に一ヶ月前になりますが、

自己テスト用でもいいともいます。

私は自信がない項目が結構ありました。


jQueryで使ったシンタックス英単語は

ほとんど簡単な単語で

ぱっと見たら分かるような気がするけど、

本気で使おうとしたらまたいろいろ調べないと

と感じました。

例えば:containのフィルタにはテキスト(case-sensitive)

しか入りません。

逆に:hasにはセレクタ分が使えるなど

意味合い的には似てますが、

使い方がまったく違うところが

落とし穴だと思います。


以下がセレクタ編のタイトルです。

自信があるのは何項目ですか?

* id値で要素を特定するには?

* タグ名で要素を特定するには?

* スタイル・クラスで要素を特定するには?

* 複数のセレクタをまとめて指定するには?

* すべての要素を取得するには?

* ある要素の配下にある要素だけを取得するには?

* ある要素の直下にある要素だけを取得するには?

* 指定した要素の次要素を取得するには?

* 指定した要素以降の兄弟要素を取得するには?

* 先頭/末尾の要素だけを取得するには?

* 指定された親要素の先頭/末尾の子要素を取得するには?

* 偶数/奇数番目の要素だけを取得するには?

* 指定したインデックス番号(より大きい/未満)の要素を取得するには?

* 指定された要素直下から特定の子要素だけを取得するには?

* 指定したセレクタ以外の要素を取得するには?

* 配下に特定のテキストを含んだ要素を取得するには?

* 空要素だけを取得するには?

* 何らかの子要素を持つ要素を取得するには?

* 指定した子要素を持つ要素を取得するには?

* 子要素が1つだけである要素を取得するには?

* 属性の値によって取得要素を絞り込むには?

* 複数の属性フィルタを組み合わせるには?

* フォーム要素やヘッダ要素を取得するには?

* 特定の状態にある要素のみを取得するには?

第1回 セレクタ編 - @IT

これをきっかけに曖昧なところをいったん全部整理しようと思います。

後の記事でまた詳しく書きます。

2009年11月14日 #diary

プログラマ、あるいはIT技術者の週末はどう過ごしていますか?
技術の記事をメインとした私のブログは
週末になるとアクセス数が普段の60%しかありません。。。
多分平日はみんな仕事でいろいろと検索していると思います。
週末はやはり余裕を持ってリラックスしていますよね。

やはり週末の直前はエンターテーメントの記事を書こうと思ってます。
自分もリラックスが必要だし、
それにあわせた気持ちを記事の形で残してもいいですよね。

2009年11月13日 #flex

Flex3 builderにはスタンドアロンとEclipseのプラインの形があります。

しかしFlex Builder 3.0.2 Professional Plug-Inは Eclipse3.2.2、3.3、3.4しか対応していません。

Eclipse3.5に載せる場合はFlexのインストール完了後

以下のように設定してください。


  • Eclipseルートディレクトリ\linksフォルダにあるcom.adobe.flexbuilder.feature.core.linkファイルを開く
  • path=<Flex Builder 3 Plug-inのディレクトリ> に編集
    • デフォルトではpath=以降のディレクトリが書いてあるはずなので、"path="だけを追加すればOK
  • Eclipseを再起動し、パースペクティブにはFlex開発を選択

Windows7でOKでした。MacOS Xで同じやり方ではダメでした。

ネットでもいろいろ検索しましたが、

やはりMacではうまく動作してくれないみたいで、

しょうがなくスタンドアロンをインストールしました。


参考サイト: Flex Builder 3 Plug-in: “Eclipse 3.5 Galileo”でFlex開発 | t.p.fields - web+tech info

2009年11月13日 #ajax

前記

恥ずかしいことに今仕事でjQueryでばりばりAjaxを使ってますが、
実際はただjQueryの便利なAPIを使っただけで
Ajaxそのものの仕組みも分かっていません。

今更ですが、その辺の基礎知識を勉強しできるだけ誰にも分かるように
自分が理解したことをメモとして残したいです。

XMLHttpRequestとは

JavaScriptなどのウェブブラウザ搭載のスクリプト言語で、サーバとのHTTP通信を行うための組み込みオブジェクト(API)である。 すでに読み込んだページからさらにHTTPリクエストを発することができ、ページ遷移することなしにデータを送受信できるAjaxの基幹技術である。 XMLHttpRequest - Wikipedia

なるほど、これがAjaxを支える基幹ですね。
JavaScriptのオブジェクトです。
名前にXMLがついていますが、XML以外のデータも扱うことができます。

XMLHttpRequestの歴史

XMLHttpRequestは、マイクロソフトがOutlook Web Access 2000のダイナミックHTMLによるウェブインターフェースに活用するため、1999年公開のInternet Explorer 5においてActiveXオブジェクトとして実装したのが始まりである[1]。その後、2001年にMozillaプロジェクトがこれと互換性のある組み込みオブジェクトをMozilla 0.9.7およびNetscape 7で実装し、アップルも2004年にSafari 1.2でMozillaと同様の組み込みオブジェクトを実装し始めた[2]。 このように徐々にInternet Explorer以外のブラウザにも実装されていったXMLHttpRequestは、2005年にAjaxによって一躍有名になった。 XMLHttpRequest - Wikipedia

ようは各ブラウザが先にXMLHttpRequestオブジェクトを実装した、
そして偉い人がAjaxを提唱してから一気に有名になった訳ですよね。

XMLHttpRequestの仕組み

AllAboutの記事に載ってた仕組みを自分で書きました。
f:id:kinopyo:20091114023141j:image
XMLHttpRequestのメソッドやプロパティは多分これからも使うことはありませんが、
一応図で見て大体把握しておきましょう。
openメソッドはイニシャライズみたいな感じで、GETかPOSTか、URLなどのパラメータを受け取ります。
そしてsendメソッドによるサーバに送信する前に、onreadystatechangeイベントのコールバックでステータスを判断しresponseTextやresponseXML プロパティのデータを返す流れですね。

拡張機能から XMLHttpRequest を使いたい場合は、非同期でロードするようにすべきです。
非同期の使用法では、データを受け取ったときにコールバックを受け取ります。
そのため、リクエストが発生している間はブラウザは通常どおりに動き続けます。

XMLHttpRequestの宣言

ブラウザにより異なる。 IE では、ActiveXObject("Microsoft.XMLHTTP") を使用。 IE のバージョンによっては、ActiveXObject("Msxml2.XMLHTTP.5.0") , ActiveXObject("Msxml2.XMLHTTP.4.0") , ActiveXObject("Msxml2.XMLHTTP.3.0") , ActiveXObject("Msxml2.XMLHTTP") なども使用出来る。 Mozilla 系ブラウザでは、XMLHttpRequest() を使用。 http://ponpon-village.net/ajax/xmlhttp.htm

非同期通信のサンプルコード

  var req;
  if( window.XMLHttpRequest){
    req = new XMLHttpRequest();
  }else if(window.ActiveXObject){
    try {
      req = new ActiveXObject("MSXML2.XMLHTTP");
    } catch (e) {
      req = new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  if (req) {
    req.open('GET', 'http://www.example.com/contents.txt');
    req.onreadystatechange = function() {
      if (req.readyState == 4) {
        document.write(req.responseText);
      }
    }
    req.send(null);
  }

req.statusはHTTPレスポンスコードで200はOK、404はよく見るNot Foundです。

注意点

  • file:/// および ftp:// は HTTP ステータスを返しません。そのため、status についてはゼロが、statusText については空文字列を返されます。
  • XMLHttpRequestは、セキュリティを考慮して、リクエストを送信できるのは同一ドメイン内に制限されています。

とりあえず自分が気になった点を書きました。
肝心なところはonreadystatechangeでのコールバックだと思います。

次回

XMLHttpRequestは同一ドメイン内に制限されていますね。
別のドメインとのやり取りはどう行うのかを次のテーマにします。
なんかJSONPとかクロスドメインなどのキーワードがよく見えますが、
その辺をはっきりしようと思います。

参考サイト:

XMLHttpRequest - Wikipedia
XMLHttpRequest - MDC
Ajaxはじめの一歩 XMLHttpRequest - [JavaScript]All About