特定のサイト上の変数を動的に操作する

[2005-06-22-1],[2005-01-14-3]でも書きましたが、

javascript:…

というURI スキームについてですが、当然これはそのままブラウザの URL として指定できます。
 
javascript: 以下には、任意の JavaScript コードを指定できるので、ブラウザ(IE, Firefox, Opera でもなんでも)を有用な簡易 JavaScript デバッグ環境として利用することができます。
 
例えば、任意のサイトで変数 foo の現在の値を閲覧したい場合は、そのサイトを表示した状態で

javascript: alert(foo);

とすればよく、逆に foo の値を変更したい場合は
 

javascript: foo=”new value”; focus();

などとすればいいわけです( 最後の focus() は画面遷移を防ぐ目的)。
 
実例を挙げると, こちらで紹介されている、モグラたたきゲームのサンプルは、ソースによるとten が点数なので、ゲーム動作中に

javascript:ten=50000;focus()

とする事で得点が50000 点になります。
動作検証をする場合に、ソースに変更を加えることなくテストができるので、開発後のメンテナンス時に役立つのではないでしょうか。
 

実行中の画面
実行後の画面

<script src="…"> で注意すべき点

で注意すべき点">

ドメイン間のデータ送信テスト(docodemo door Test)
<script src=”…”>を用いた、パスワード入力フォームの内容を悪意あるサイトに送るテスト。
 
たとえばブログペットやアクセスカウンター、アフィリエイトなどは <script src=”http://サービス提供サイト/xxx”>という形式の HTML タグをブログに埋め込みますが、埋め込んだブログがトップページからログイン可能なものであった場合、サービス提供サイト側がブログのパスワードを盗み出すことができてしまいます。
 
対策として
– 信頼できる(盗まれても問題が無い,あるいは自分で構築した)サイトのサービスのみ利用する。
-重要な情報が含まれる(入力される)ページには信頼できるサイト以外のサービスを付加しない。
などが挙げられます。
 
JSONP を利用する場合も当然注意する必要があります。

で注意すべき点">

JSON で実現する快適な Ajax

AJAX で JavaScript でサーバからの出力を解釈する際に、最も用意にパースできる出力形式として、JSON(JavaScript Object Notation)形式があります。出力が XML ではなくなるため、厳密には Ajax(Asynchronous JavaScript + XML)ではなくなりますが、JSON を利用することで、JavaScript でのパース作業が格段に容易になる上、クロスドメイン呼び出しが可能になるというメリットがあります。
 
基本的な文法についてはこちらが参考になりますが、大体このようになります。

var person = {
      name: “John”, // name プロパティ
      age: 30,
      family: [ // 配列
        {name: “Jane”, age: 24}, // 配列内オブジェクト
        {name: “Richard”, age: 1}
      ]
   };
// 参照例
alert(person.name); // John が出力される
alert(person.family[0].name); // Jane が出力される

 
JavaScript で動的利用する場合、
JavaScript – JSONでデータを受信する方法2種類(s.h.log)
dojo toolkit の ScriptSrcIO(snippets from shinichitomita’s journal)
が参考になります。
これを PHP で生成する場合、PHP 5.2.0 以降デフォルトで組み込まれるようになったJSON関数(PECL:php-json)を利用します。日本語使用時の注意として、json_encode に渡す文字列の文字コードは UTF-8 にする必要があります。

  echo json_encode(array(“name”=>”John”, “age”=>30));

また、JSONP (JSON with Padding) という手法により、サーバ側からクライアントに対し非同期コールバック関数を実行させることができます。
リクエストURL:

http://foo.example.com/api/person?name=John&callback=myPersonHandler

リクエスト結果:

myPersonHandler({name: “John”, age:30});

埋め込む HTML:

<script type=”text/javascript” src=”http://foo.example.com/api/person?name=John&callback=myPersonHandler” charset=”UTF-8″><!–
    function myPersonHandler(result){
        alert(result.name + ” is ” + result.age + “years old”);
    }
//–></script>

こうすると、サーバからの結果の出力完了後に自動的に myPersonHandler が呼ばれるようになります。なお、myPersonHandler という関数名は、リクエストURL の callback パラメータを元にしているため、クライアント側で任意の関数に置き換えることが可能です。
 
参考:
PHP で JSON(Do You PHP?)
Collection & Copy – JSON 入門
JavaScript – dojo の ScriptSrcIO で動的クロスドメイン JSON 読み込み
JSONP とコールバック関数(戯れ言++ – 入門 JSON 3)

Flash の IE 仕様変更対応のための汎用 JavaScript クラス

<object> が自動でアクティブ化しなくなった([2006-04-18] 参照)対策には
SWFObject (旧 FlashObject )を使うと楽に対応できます。

<script type=”text/javascript” src=”../js/swfobject.js”></script>
<!– 略 –>
<div id=”flashcontent”></div>
<script type=”text/javascript”><!–
// SWFObject(filepath, id, width, height, version, bgcolor)
var so = new SWFObject(“main.swf”, “foo”, 960, 640, “6”, “#FFFFFF”);
so.write(“flashcontent”); // id=flashcontent に対して書き出し
 
// 今回の肝はここまで。
//–></script><noscript>
<!– JavaScript OFF の時は既存の object, embed タグを表示 –>
<object classid=”clsid:d27cdb6e-ae6d-11cf-96b8-444553540000″
       codebase=”http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0″
       width=”960″ height=”640″ id=”foo” align=”middle”>
<param name=”movie” value=”main.swf”><param name=”bgcolor” value=”#FFFFFF”>
<embed src=”main.swf” loop=”false” menu=”false” quality=”high” bgcolor=”#FFFFFF”
 width=”960″ height=”640″ name=”foo” align=”middle”
 type=”application/x-shockwave-flash”
 pluginspage=”http://www.macromedia.com/go/getflashplayer”>
</object>
</noscript>

 
なお、SWFObject は MIT ライセンスで公開されているため、制限なく利用が可能です。
 
参考:
SWFObjectのドキュメントを日本語に翻訳してみたよ
SWFObject(公式 / 上の原文)

Smarty + overLIB で簡単にポップアップ

overLIB は簡単に見栄えのいいポップアップ表示を行うためのフリーの JavaScript ライブラリです。overLIB は PHP/Smarty なしでも勿論動作します。
overLIB 単体を利用する場合は次のようにします(公式マニュアルより抜粋)。

<!– 必須の初期化処理(ひとつのページにつき一度だけ必要) –>
<div id=”overDiv” style=”position:absolute; visibility:hidden; z-index:1000;”></div>
<script language=”JavaScript” src=”overlib.js”><!– overLIB (c) Erik Bosrup –></script>
<!– マウスオーバー時に ポップアップを表示する –>
 <a href=”javascript:void(0);” onmouseover=”return overlib(‘This is an ordinary
  popup.’);” onmouseout=”return nd();”>here</a>

Smarty のテンプレートでは popup_initpopup というカスタム関数を使えば、さらに簡単に overLIB を利用する事が可能です(Smarty の公式マニュアルより)。

{* popup_initは popup を使う前に、<BODY>から</BODY>の間で一度だけ呼び出す必要があります(訳注: この文章は原文とは異なります 😉 *}
{popup_init src=”/javascripts/overlib.js”}

{* マウスオーバー時にポップアップウィンドウを表示するリンクを作成する *}
<a href=”mypage.html” {popup text=”This link takes you to my page!”}>mypage</a>

{* popup の text ではリンク等の HTML 文も利用可能です *}
<a href=”mypage.html” {popup sticky=true caption=”mypage contents”
text=”<UL><LI>links<LI>pages<LI>images</UL>” snapx=10 snapy=10}>mypage</a>

参考:
overLIB 公式
Smarty 公式
Smarty 2.6.6 日本語マニュアル

エンターキーで入力欄を移動する

事務入力とかでよくある機能です。TabIndex 属性に指定した順番で移動します。
IE のみ対応してます。
onKeyDown でキーコード(Event.keyCode)を書き換えているのがミソです。

<html><head>
<script type=”text/javascript”>
<!–
    function onKeyDown(){
         if(event.keyCode == 13){ event.keyCode = 9; }
    }
// –></script>
</head>
<body>
    <form>
        <input type=”text” value=”abc” onKeyDown=”onKeyDown();” tabIndex=”1″>
        <input type=”text” value=”def” onKeyDown=”onKeyDown();” tabIndex=”2″>
        <input type=”text” value=”ghi” onKeyDown=”onKeyDown();” tabIndex=”3″>
        <input type=”text” value=”jkl” onKeyDown=”onKeyDown();” tabIndex=”4″>
    </form>
</body>
</html>

JavaScript から画像の存在有無を調べる

– Image オブジェクトを使うとスマートにできる。Firefox1.0.4, IE6 で確認。

function existImage(sImageUrl){
    var img = new Image();
    img.src = sImageUrl;
    return img.height > 0; // 読み込みに失敗すれば 0 になる。
}
  
if(existImage(“http://www.google.co.jp/intl/ja_jp/images/logo.gif”)){
  alert(“存在します”);
}else{
  alert(“存在しません”);
}

 
追記(2009-08-18):
メモリークラフトさんの記事より、この方法はIE7以降では動作しないようです。代替実装はリンク先を参照してください。

JavaScript で ActiveX を使う

– ActiveXObject というクラスがあった。これを直接インスタンス化する方法と、Object タグを使って id 属性の名前で参照する方法の2通りがある。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/js56jsobjactivexobject.asp
– MSDN Japan Home – MSDN Library Japan – Windows スクリプトテクノロジ – JScript – リファレンス – オブジェクト – ActiveXObject

JavaScriptでランダムなパスワードを生成する

JavaScriptを使ったランダムなパスワード文字列を生成するサンプルコードです。

/// length 桁のパスワードを生成する
function createRandomPassword(length){
  var lc = "abcdefghijklmnopqrstuvwxyz"; 
  var sList = lc + lc.toUpperCase()+"0123456789_-"; // 小文字 + 大文字 + 数字 + 対応する記号
  var password = ""; 
  for (i = 0; i < length; i++)
      password += sList.charAt(Math.floor(Math.random() * sList.length));
  return password;
}

// 利用例
var passwordLength = 12; 
var myPassword = createRandomPassword(passwordLength);
console.log(myPassword);
prompt(passwordLength + "桁のパスワードを生成しました。", myPassword);

デモ:

桁数:

ボタンを押すたびランダムなパスワード文字列を作成します。
ポチポチ押してみてくださいね。