- PR -

javascriptで書かれたカレンダーをダイアログのような動きにする方法

1
投稿者投稿内容
みきてぃ
会議室デビュー日: 2005/09/16
投稿数: 14
投稿日時: 2005-12-04 15:44
お世話になります。

標記にもありますが、現在javascriptを使ってポップアップでカレンダーを表示させていますが、今回「表示させている間は親フレームの操作をさせない」というダイアログのような処理をさせたいと考えています。

いろいろ調べてみると、html化させてモーダルダイアログでやるとよいと思ったのですが、現在のソースからhtml化の方法に悩んでいます。

どなたかソースをご教授いただけるとありがたいです。下記がjavascriptのソースになりますのでよろしくお願いいたします。


//--マウスボタンを押し下げた時
// レイヤー内のカーソルoffset位置取得
function mdown_wrtCalendarLay(e) {
if(navigator.userAgent.indexOf('Gecko')!=-1) //n6,m1用
if(e.currentTarget.className != 'dragLays') return
else clickElement = e.currentTarget.id
var selLay = getLayOj(clickElement)
if (selLay){
offsetX = getMouseX(e) - getLEFT(selLay.id)
offsetY = getMouseY(e) - getTOP(selLay.id)
if(document.layers){
offsetX = getMouseX(e)+10 ; offsetY = getMouseY(e)+10
}
}
return false
}

//--マウスボタンを上げた時ドラッグ解除
var zcount = 0
function mup_wrtCalendarLay(e) {
if(!window.clickElement) return
if (getLayOj(clickElement)) {
calendarLay[clickElement].zindexLAYOJ(
getStyleOj(clickElement),zcount++)
clickElement=null
}
}

//--イベントキャプチャー開始
function set_event__wrtCalendarLay(){
document.onmousemove = mmove_wrtCalendarLay //n4,m1,n6,e4,e5,e6,o6用
document.onmouseup = mup_wrtCalendarLay //n4,m1,n6,e4,e5,e6,o6用
if(navigator.userAgent.indexOf('Gecko')!=-1) //m1,n6用
document.onmousedown = mdown_wrtCalendarLay
if(document.layers){ //n4用
document.captureEvents(Event.MOUSEMOVE)
document.captureEvents(Event.MOUSEUP)
}
}

//--イベントキャプチャー停止
function stop_event__wrtCalendarLay(){
document.onmousemove = null //n4,m1,n6,e4,e5,e6,o6用
document.onmouseup = null //n4,m1,n6,e4,e5,e6,o6用
if(navigator.userAgent.indexOf('Gecko')!=-1) //m1,n6用
document.onmousedown = null
if(document.layers){ //n4用
document.releaseEvents(Event.MOUSEMOVE)
document.releaseEvents(Event.MOUSEUP)
}
}

//--ブラウザの言語を取得
function getBrowserLANG(){
if(document.all)
return navigator.browserLanguage //e4,e5,e6,o6用
else if(document.layers)
return navigator.language //n4用
else if(document.getElementById)
return navigator.language.substr(0,2) //n6,n7,m1用
}

/*--/////////////ここまで///////////////////////////////////////--*/
みきてぃ
会議室デビュー日: 2005/09/16
投稿数: 14
投稿日時: 2005-12-04 15:44
すいません・・・・ソースが足りませんでした。下記がjavascriptのソースになります。


var now = new Date()
var absnow = now
var Win = navigator.userAgent.indexOf('Win')!=-1
var Mac = navigator.userAgent.indexOf('Mac')!=-1
var X11 = navigator.userAgent.indexOf('X11')!=-1
var Moz = navigator.userAgent.indexOf('Gecko')!=-1
var msie = navigator.userAgent.indexOf('MSIE')!=-1
var bwlang = getBrowserLANG()
var _utf = "あ".length > 1
var nonja = ( _utf || bwlang == 'en')
if( nonja )
var week = new Array('sun','mon','tue','wed','thu','fri','sat');
else
var week = new Array('日','月','火','水','木','金','土');
//入力後退避位置
if( Mac && msie ){ var gox=2000 ; var goy=2000 }
else { var gox=-300 ; var goy=-300 }
//n4用レイヤー出力位置
if(document.layers){var n4_left=300 ; var n4_top= 100 }

calendarLay['calendar']=new calendarLay('calendar',-100,-100,'')

function wrtCalendarLay(oj,e,dateType,arg1){

set_event__wrtCalendarLay() //イベントキャプチャースタート

// 日付タイプデフォルト値設定と空白文字列除去
if(!arguments[2])dateType='yyyy/mm/dd';
else arguments[2].split(' ').join('').split(' ').join('')

// 月移動フラグデフォルト設定
if(!arguments[3])arg1=0

wrtCalendarLay.arg1=arg1
wrtCalendarLay.oj=oj
wrtCalendarLay.dateType=dateType

// 現在初期化
if(arg1==0)now = new Date()

// 年月日取得
nowdate = now.getDate()
nowmonth = now.getMonth()
nowyear = now.getYear()

// 月移動処理
if(nowmonth==11 && arg1 > 0){ //12月でarg1が+なら
nowmonth = -1 + arg1 ; nowyear++ //月はarg1-1;1年加算
} else if(nowmonth==0 && arg1 < 0){ //1月でarg1が-なら
nowmonth = 12 + arg1 ; nowyear-- //月はarg1+12;1年減算
} else {
nowmonth += arg1 //2-11月なら月は+arg1
}

// 2000年問題対応
if(nowyear<1900)nowyear=1900+nowyear

// 現在月を確定
now = new Date(nowyear,nowmonth,1)

// YYYYMM作成
nowyyyymm=nowyear*100+nowmonth

// YYYY/MM作成
nowtitleyyyymm=nowyear+'/'+(nowmonth + 1)

// カレンダー構築用基準日の取得
fstday = now //今月の1日
startday = fstday - ( fstday.getDay() * 1000*60*60*24 ) //最初の日曜日
startday = new Date(startday)

// カレンダー構築用HTML
ddata = ''
ddata += '<FORM>\n'
ddata += '<TABLE BORDER=0 BGCOLOR="#dddddd" BORDERCOLOR="#dddddd"
WIDTH=140 HEIGHT=140\n'
ddata += 'STYLE="\n'
ddata += 'font-family : Arial;\n'
ddata += 'font-size : 14px;\n'
ddata += 'border-top : 1px outset #ffffff;\n'
ddata += 'border-right : 1px outset #888888;\n'
ddata += 'border-bottom : 1px outset #555555;\n'
ddata += 'border-left : 1px outset #ffffff;"\n'
ddata += '>\n'

// Month
ddata += ' <TR id="trmonth" BGCOLOR=#6699ff BORDERCOLOR=#6699ff
WIDTH=140 HEIGHT=14>\n'
ddata += ' <TH COLSPAN=7 WIDTH=140 HEIGHT=14 ALIGN="right">
<NOBR>\n'
ddata += ' <FONT SIZE="4" FACE="Arial">\n'
ddata += nowtitleyyyymm
ddata += ' </FONT>\n'
ddata += '<INPUT TYPE=button VALUE="<<" \n'
ddata += 'onClick="wrtCalendarLay(window.document.'+oj.form.name+'.
'+oj.name+',null,\''+dateType+'\',-1)"\n'
ddata += '><INPUT TYPE=button VALUE="o" \n'
ddata += 'onClick="wrtCalendarLay(window.document.'+oj.form.name+'.
'+oj.name+',null,\''+dateType+'\',0)"\n'
ddata += '><INPUT TYPE=button VALUE=">>" \n'
ddata += 'onClick="wrtCalendarLay(window.document.'+oj.form.name+'.
'+oj.name+',null,\''+dateType+'\',1)">\n'
ddata += '</NOBR></TH>\n'
ddata += ' </TR>\n'

// Week
ddata += ' <TR BGCOLOR=#00cccc WIDTH=140 HEIGHT=14>\n'

for (i=0;i<7;i++){
ddata += ' <TH WIDTH=14 HEIGHT=14>\n'
ddata += ' <FONT SIZE="2">\n'
ddata += week[i]
ddata += ' </FONT>\n'
ddata += ' </TH>\n'
}
ddata += ' </TR>\n'

// Date
for(j=0;j<6;j++){
ddata += ' <TR BGCOLOR=#eeeeee>\n'
for(i=0;i<7;i++){
nextday = startday.getTime() + (i * 1000*60*60*24)
wrtday = new Date(nextday)
wrtdate = wrtday.getDate()
wrtmonth = wrtday.getMonth()
wrtyear = wrtday.getYear()
if(wrtyear < 1900) wrtyear = 1900 + wrtyear
wrtyyyymm = wrtyear * 100 + wrtmonth
wrtyyyymmdd = ''+wrtyear +'/'+ (wrtmonth+1) +'/'+wrtdate
getday = getWeek(wrtyyyymmdd)
var outputdate=eval( getDateType(dateType))
wrtdateA = '<A HREF="javascript:function v(){'
wrtdateA += 'document.'+oj.form.name+'.'+oj.name+'.
value=(\''+outputdate
wrtdateA += '\');if(!(Mac&&document.layers))calendarLay[\'calendar\'].
moveLAYOJ(getStyleOj(\'calendar\'),'
wrtdateA += gox+','+goy+');stop_event__wrtCalendarLay()};v()" >\n'
wrtdateA += '<FONT COLOR=#000000>\n'
wrtdateA += wrtdate
wrtdateA += '</FONT>\n'
wrtdateA += '</A>\n'

if(wrtyyyymm != nowyyyymm){
ddata += ' <TD BGCOLOR=#cccccc WIDTH=14 HEIGHT=14>\n'
ddata += wrtdateA

} else if( wrtdate == absnow.getDate()
&& wrtmonth == absnow.getMonth()
&& wrtday.getYear() == absnow.getYear()){
ddata += ' <TD BGCOLOR=#ff99ff WIDTH=14 HEIGHT=14>\n'
ddata += '<FONT COLOR="#ffffff">'+wrtdateA+'</FONT>\n'

} else {
ddata += ' <TD WIDTH=14 HEIGHT=14>\n'
ddata += wrtdateA
}
ddata += ' </TD>\n'
}
ddata += ' </TR>\n'

startday = new Date(nextday)
startday = startday.getTime() + (1000*60*60*24)
startday = new Date(startday)
}
// ステータス行 日付タイプ
ddata += ' <TR>\n'
ddata += ' <TD COLSPAN=7 ALIGN=center STYLE="font-size:11px">\n'
ddata += wrtCalendarLay.dateType
ddata += ' <INPUT TYPE=button VALUE="close" \n'
ddata += 'onClick="moveLAYOJ(getStyleOj(\'calendar\'),'+gox+','+goy+')">\n'
ddata += ' </TD>\n'
ddata += ' </TR>\n'

ddata += '</TABLE>\n'
ddata += '</FORM>\n'
ddata += '</BODY>\n'
ddata += '</HTML>\n'

calendarLay['calendar'].outputLAYOJ(getLayOj('calendar'),'')//一時クリア
calendarLay['calendar'].outputLAYOJ(getLayOj('calendar'),ddata)

if(e!=null){
if(navigator.userAgent.indexOf('Gecko')!=-1){ //n6,m1用
var left = e.currentTarget.offsetLeft + 50
var top = e.currentTarget.offsetTop - 30
} else {
var left = getMouseX(e) + 50
var top = getMouseY(e) - 30
}
if(document.layers){ var left = n4_left ; var top = n4_top }//n4修正
calendarLay['calendar'].moveLAYOJ(getStyleOj('calendar'),left,top)

}

}
// 曜日取得
function getWeek(date){
if(arguments.length>0)date=date
else date=null
if( Mac && msie )//MacIE5用
week = new Array('sun','mon','tue','wed','thu','fri','sat');
var now = new Date(date) ;
return week[now.getDay()] ;
}
// 出力日付のデータタイプ
function getDateType(dateType){
if(nonja || ( Mac && msie )){ //漢字式表記の回避
if ( dateType == 'yyyy年mm月dd日(曜)') dateType = 'yyyy/mm/dd(曜)'
else if( dateType == 'mm月dd日') dateType = 'mm/dd'
else if( dateType == 'mm月dd日(曜)') dateType = 'mm/dd(曜)'
}
switch(dateType){
case 'yyyy'
: dtate= "''+wrtyear " ; break ;
case 'yyyy/mm'
: dtate= "''+wrtyear +'/'+ (wrtmonth+1) " ; break ;
case 'yyyy/mm/dd'
: dtate= "''+wrtyear +'/'+ (wrtmonth+1) +'/'+wrtdate " ; break ;
case 'mm/dd'
: dtate= "''+ (wrtmonth+1) +'/'+wrtdate " ; break ;
case 'mm'
: dtate= "''+ (wrtmonth+1) " ; break ;
case 'dd'
: dtate= "''+ wrtdate " ; break ;
case 'yyyy/mm/dd[曜]'
: dtate= "''+wrtyear +'/'+ (wrtmonth+1) +'/'+wrtdate +' ['+getday +']' " ; break ;
case 'yyyy/mm/dd(曜)'
: dtate= "''+wrtyear +'/'+ (wrtmonth+1) +'/'+wrtdate +' ('+getday +')' " ; break ;
case 'mm/dd(曜)'
: dtate= "''+ (wrtmonth+1) +'/'+wrtdate +' ('+getday +')' " ; break ;
case 'yyyy年mm月dd日(曜)'
: dtate= "''+wrtyear +'年'+ (wrtmonth+1)+'月'+wrtdate +'日('+getday +')'" ; break ;
case 'mm月dd日'
: dtate= "''+ (wrtmonth+1) +'月'+wrtdate +'日' " ; break ;
case 'mm月dd日(曜)'
: dtate= "''+ (wrtmonth+1) +'月'+wrtdate +'日('+getday +')'" ; break ;
default
: dtate= "''+wrtyear +'/'+ (wrtmonth+1) +'/'+wrtdate " ;
}
return dtate
}



//--レイヤー生成
function calendarLay(layName,x,y,dateType){
this.id = layName // ドラッグできるようにするレイヤー名
this.x = x // 初期left位置
this.y = y // 初期top位置
this.dateType = dateType // YYYY/MM/DD
this.day = new Array()
if(document.layers) //n4用
this.div='<layer name="'+layName+'" left="'+x+'" top="'+y+'"\n'
+' onfocus="clickElement=\''+layName
+'\';mdown_wrtCalendarLay(event);
return false">\n'
+'<a href="javascript:void(0)"\n'
+' onmousedown="clickElement=\''+layName
+'\';mdown_wrtCalendarLay(event);
return false">\n'
+ '</a></layer>\n'
else //n4以外用
this.div='<div id="'+layName+'" class="dragLays"\n'
+' onmousedown="clickElement=\''+layName
+'\';mdown_wrtCalendarLay(event);
return false"\n'
+' style="position:absolute;left:'+x+'px;top:'+y+'px">\n'
+ '</div>\n'
document.write(this.div)
return
}
calendarLay.prototype.moveLAYOJ = moveLAYOJ //メソッドを追加する
calendarLay.prototype.outputLAYOJ = outputLAYOJ //メソッドを追加する
calendarLay.prototype.zindexLAYOJ = zindexLAYOJ //メソッドを追加する

//--レイヤー移動
function moveLAYOJ(oj,x,y){
if(document.getElementById){ //e5,e6,n6,m1,o6用
oj.left = x
oj.top = y
} else if(document.all){ //e4用
oj.pixelLeft = x
oj.pixelTop = y
} else if(document.layers) //n4用
oj.moveTo(x,y)
}
//--HTML出力
function outputLAYOJ(oj,html){
if(document.getElementById) oj.innerHTML=html //n6,m1,e5,e6用
else if(document.all) oj.innerHTML=html //e4用
else if(document.layers) //n4用
with(oj.document){
open()
write(html)
close()
}
}
//--奥行きZ座標set
function zindexLAYOJ(oj,zindex){
if(document.getElementById) oj.zIndex=zindex //n6,m1,e5,e6,o6用
else if(document.all) oj.zIndex=zindex //e4用
else if(document.layers) oj.zIndex=zindex //n4用
}

//--layNameで指定したオブジェクトを返す(必ずonload後に実行すること)
function getLayOj(layName){
if(document.getElementById)
return document.getElementById(layName) //e5,e6,n6,m1,o6用
else if(document.all) return document.all(layName) //e4用
else if(document.layers)return document.layers[layName] //n4用
}
function getStyleOj(clickElement){
return (!!document.layers)?getLayOj(clickElement)
:getLayOj(clickElement).style
}

//--マウスX座標get
function getMouseX(e){
if(window.opera) //o6用
return e.clientX
else if(document.all) //e4,e5,e6用
return document.body.scrollLeft+event.clientX
else if(document.layers||document.getElementById)
return e.pageX //n4,n6,m1用
}

//--マウスY座標get
function getMouseY(e){
if(window.opera) //o6用
return e.clientY
else if(document.all) //e4,e5,e6用
return document.body.scrollTop+event.clientY
else if(document.layers||document.getElementById)
return e.pageY //n4,n6,m1用
}

//--レイヤ−左辺X座標get
function getLEFT(layName){
if(document.all) //e4,e5,e6,o6用
return document.all(layName).style.pixelLeft
else if(document.getElementById) //n6,m1用
return (document.getElementById(layName).style.left!="")
?parseInt(document.getElementById(layName).style.left):""
else if(document.layers) //n4用
return document.layers[layName].left
}

//--レイヤ−上辺Y座標get
function getTOP(layName){
if(document.all) //e4,e5,e6,o6用
return document.all(layName).style.pixelTop
else if(document.getElementById) //n6,m1用
return (document.getElementById(layName).style.top!="")
?parseInt(document.getElementById(layName).style.top):""
else if(document.layers) //n4用
return document.layers[layName].top
}

//--マウスカーソルを動かした時レイヤーもmoveLAYOJで動かす
function mmove_wrtCalendarLay(e) {
if(!window.clickElement) return
if (getLayOj(clickElement)) {
movetoX = getMouseX(e) - offsetX
movetoY = getMouseY(e) - offsetY
var oj=getStyleOj(clickElement)
calendarLay[clickElement].moveLAYOJ(oj,movetoX,movetoY)
return false
}
}
//--マウスボタンを押し下げた時
// レイヤー内のカーソルoffset位置取得
function mdown_wrtCalendarLay(e) {
if(navigator.userAgent.indexOf('Gecko')!=-1) //n6,m1用
if(e.currentTarget.className != 'dragLays') return
else clickElement = e.currentTarget.id
var selLay = getLayOj(clickElement)
if (selLay){
offsetX = getMouseX(e) - getLEFT(selLay.id)
offsetY = getMouseY(e) - getTOP(selLay.id)
if(document.layers){
offsetX = getMouseX(e)+10 ; offsetY = getMouseY(e)+10
}
}
return false
}

//--マウスボタンを上げた時ドラッグ解除
var zcount = 0
function mup_wrtCalendarLay(e) {
if(!window.clickElement) return
if (getLayOj(clickElement)) {
calendarLay[clickElement].zindexLAYOJ(
getStyleOj(clickElement),zcount++)
clickElement=null
}
}

//--イベントキャプチャー開始
function set_event__wrtCalendarLay(){
document.onmousemove = mmove_wrtCalendarLay //n4,m1,n6,e4,e5,e6,o6用
document.onmouseup = mup_wrtCalendarLay //n4,m1,n6,e4,e5,e6,o6用
if(navigator.userAgent.indexOf('Gecko')!=-1) //m1,n6用
document.onmousedown = mdown_wrtCalendarLay
if(document.layers){ //n4用
document.captureEvents(Event.MOUSEMOVE)
document.captureEvents(Event.MOUSEUP)
}
}

//--イベントキャプチャー停止
function stop_event__wrtCalendarLay(){
document.onmousemove = null //n4,m1,n6,e4,e5,e6,o6用
document.onmouseup = null //n4,m1,n6,e4,e5,e6,o6用
if(navigator.userAgent.indexOf('Gecko')!=-1) //m1,n6用
document.onmousedown = null
if(document.layers){ //n4用
document.releaseEvents(Event.MOUSEMOVE)
document.releaseEvents(Event.MOUSEUP)
}
}

//--ブラウザの言語を取得
function getBrowserLANG(){
if(document.all)
return navigator.browserLanguage //e4,e5,e6,o6用
else if(document.layers)
return navigator.language //n4用
else if(document.getElementById)
return navigator.language.substr(0,2) //n6,n7,m1用
}

/*--/////////////ここまで///////////////////////////////////////--*/
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-12-04 20:14
そんなに長いソースを単純にコピペされても・・・

ダイアログで表示したいのであれば、
window.openで開いている部分を
window.showModalDialogで開けば、
ダイアログで表示されます。

showModalDialog関数の使い方はGoogleで調べれば、
いくらでもサンプルがありますので、解説は省きますね。
みきてぃ
会議室デビュー日: 2005/09/16
投稿数: 14
投稿日時: 2005-12-06 00:06
window.openはどこにも記述していないのですが・・・・

モーダルダイアログ以外に方法はないのでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-12-06 01:01
いまゆっくりソースを見てみましたが、
レイヤーやDIVタグで実装していたんですね。
失礼しました。

完全なダイアログにしたければ、showModalDialogで開くしかありませんが、
IEでしか検証したことがないです。

ちなみに以前実装した事があるのですが、
ポップアップさせたいレイヤと、通常画面の間に
サイズが100%かつ透明のレイヤを表示させるという方法を使用しました。

普通にはクリックできませんでしたが、
・タブキーでフォーカス移動可能
・リストボックスが常に前に出る為に操作可能状態
って感じでした。

目的が良くわからないですが、
ダイアログでなければ致命的であるというのであれば、
設計やプラットフォームを見直すべきです。

いのき
ベテラン
会議室デビュー日: 2005/10/06
投稿数: 88
投稿日時: 2005-12-09 13:13
いつもお世話になります。いのきです。

みきてぃさん、この問題は既に解決済でしょうか?
ソースを見て、どっかのサイトからコピッたのが一目でわかりました。
私もこれで、カレンダを作成したことがあるので(笑)。

ちなみに参考サイトを添付しておきます。

http://game.gr.jp/js-ml/samples/199912/calendar/calendar.htm

これは「window.open」で画面を開いていますが、ここを「showModalDialog」にし、
値の受け渡し方法を変えれば、うまくいきます。
みきてぃ
会議室デビュー日: 2005/09/16
投稿数: 14
投稿日時: 2005-12-16 00:39
いのきサン返信ありがとうございます。

パラメータの「URL」はどういったURLを指定すればよいのでしょうか?現在Javascriptに入っているソースを直接呼び出しているのですが。
1

スキルアップ/キャリアアップ(JOB@IT)