2010年10月24日日曜日

file要素を隠す方法

ファイルアップロードするための「file」要素とういのは
「参照...」ボタンなどの外観をコントロールできない。
以前は「file」要素を見えないようにして、
$("a.upload").click(function(){ $("input[type=file]").click(); });
などとできた気がしたのだが、
いつの間にかできなくなっていた。
、、、で、フォーム初期化時に「file」要素のスタイルをいじる方法。

<a class="upload" href="javascript:;">
アップロード
<input type="file" style="display:none;" />
</a>

<script type="text/javascript">
$(function(){
$("a.upload")
.css({display:'block',position:'relative',overflow:'hidden'})
.find("input[type=file]")
.css({position:'absolute',right:'0',opacity:'',display:''})
.change(function(){
//アップロード処理
alert($(this).val());
});
});
</script>

2010年10月21日木曜日

クロージャ?

クロージャの定義がいまいち分からないのですが、、、
要するに名前空間が「とある局所」で維持できればいいので、、、

インラインスクリプト
<div class="portlet" id="portlet-1">
<script type="text/javascript">
(function() { //無名関数を実行
//スクリプトファイルを同期で読み込んで実行
eval($.ajax({url:'portlet.js',async:false}).responseText);
var portletName = 'ポートレット1'; //ローカル変数の上書き
$(initPortlet); //「portlet.js」の初期化関数呼出
})();
</script>
</div>

<div class="portlet" id="portlet-2">
<script type="text/javascript">
(function() {
eval($.ajax({url:'portlet.js',async:false}).responseText);
var portletName = 'ポートレット2';
/////////////////////////////////////////////////////////
//「portlet.js」で定義されている関数のオーバーライド
var superClickPortlet = clickPortlet;
var clickPortlet = function() {
superClickPortlet.call(this,this,'Override');
};
/////////////////////////////////////////////////////////
$(initPortlet);
})();
</script>
</div>


外部スクリプト(portlet.js)
//スクリプトタブの親を判定
var container = $("script:last").parents("div:first");

//ローカル変数
var portletName = 'ポートレット';

//ローカル関数
var clickPortlet = function(e,a) {
alert("portletName:"+portletName+", containerId:"+this.id+", arg1:"+a);
};

//ローカル関数
var initPortlet = function() {
$(container).click(clickPortlet);
};

2010年10月9日土曜日

SCRIPTタグのDOM要素位置の取得

同じ画面にまったく同じ(JavaScriptを含む)HTML要素を出力して、
それぞれのブロックが別々に動作するようにしたい場合の方法。

<div id="p1" class="portlet">
<script type="text/javascript">
(function(){
var container = $("script:last").parents("div:first");
var hello = function() {
alert(this.id);
};
$(function(){
container.click(hello);
});
})();
</script>
</div>

<!-- 上のDIVと中身は全く同じ -->
<div id="p2" class="portlet">
<script type="text/javascript">
(function(){
var container = $("script:last").parents("div:first");
var hello = function() {
alert(this.id);
};
$(function(){
container.click(hello);
});
})();
</script>

</div>