JavaScriptを色々あれこれしようとするがひたすら失敗を繰り返している
| Revision | 36 (tree) |
|---|---|
| Time | 2016-12-01 20:42:53 |
| Author | |
dropで背景領域にも画像をセットできるように対応
| @@ -57,8 +57,11 @@ | ||
| 57 | 57 | margin: 0; padding: 0; |
| 58 | 58 | background-color: white; |
| 59 | 59 | } |
| 60 | + .FrameArea { | |
| 60 | 61 | |
| 62 | + } | |
| 61 | 63 | |
| 64 | + | |
| 62 | 65 | .DispBase, |
| 63 | 66 | .DispObj { |
| 64 | 67 | display: inline-block; |
| @@ -196,10 +196,28 @@ | ||
| 196 | 196 | } |
| 197 | 197 | return null; |
| 198 | 198 | }; |
| 199 | +function getCssRule(ruleName) { | |
| 200 | + var ss = document.styleSheets, | |
| 201 | + rule, i, x; | |
| 199 | 202 | |
| 203 | + for (i = 0; i < ss.length; ++i) { | |
| 204 | + if (ss[i].cssRules) { | |
| 205 | + // loop through all the rules | |
| 200 | 206 | |
| 207 | + for (x =0; x < ss[i].cssRules.length; x++) { | |
| 208 | + rule = ss[i].cssRules[x]; | |
| 209 | + if (rule.type === window.CSSRule.STYLE_RULE && rule.selectorText === ruleName) { | |
| 210 | + return rule; | |
| 211 | + } | |
| 212 | + } | |
| 213 | + } | |
| 214 | + } | |
| 215 | + return null; | |
| 216 | +}; | |
| 201 | 217 | |
| 202 | 218 | |
| 219 | + | |
| 220 | + | |
| 203 | 221 | // elementを起点に classNameを持った要素を遡って検索 |
| 204 | 222 | // 見つからなければ nullを返す |
| 205 | 223 | function findClassNameParent( |
| @@ -26,6 +26,22 @@ | ||
| 26 | 26 | this.DOMobject.addEventListener('dragstart', this.onDragStart.bind(this), false); |
| 27 | 27 | this.DOMobject.addEventListener('dragover', this.onDragover.bind(this), false); |
| 28 | 28 | this.DOMobject.addEventListener('drop', this.onDrop.bind(this), false); |
| 29 | + | |
| 30 | + let css = getCssRule('#DispField'); | |
| 31 | + if (null == css) { | |
| 32 | + console.error('キャンバス情報取得失敗 CSS定義が見つからない'); | |
| 33 | + return false; | |
| 34 | + } | |
| 35 | + let width = css.cssText.match(/[\s\S]*width ?: *([0-9]+)(px|%);/)[1]; | |
| 36 | + let height = css.cssText.match(/[\s\S]*height ?: *([0-9]+)(px|%);/)[1]; | |
| 37 | + this.x = 0; // position: relativeなのでx,yは0固定 | |
| 38 | + this.y = 0; | |
| 39 | + if (null == width || null == height) { | |
| 40 | + console.error('キャンバス情報取得失敗 CSSから幅高さが取れない\ncss=' + css.cssText); | |
| 41 | + return false; | |
| 42 | + } | |
| 43 | + this.width = parseInt(width); | |
| 44 | + this.height = parseInt(height); | |
| 29 | 45 | } |
| 30 | 46 | |
| 31 | 47 |
| @@ -30,6 +30,7 @@ | ||
| 30 | 30 | |
| 31 | 31 | |
| 32 | 32 | // 操作関数 ----------------------------------- |
| 33 | +/* | |
| 33 | 34 | getFieldData() { |
| 34 | 35 | // 表示情報取得 |
| 35 | 36 | let data = this.DOMobject.innerHTML; |
| @@ -76,9 +77,9 @@ | ||
| 76 | 77 | this.DOMobject.innerHTML = result; |
| 77 | 78 | return true; |
| 78 | 79 | } |
| 80 | + */ | |
| 79 | 81 | |
| 80 | 82 | |
| 81 | - | |
| 82 | 83 | // Mouse eventを拾ったときに通知してほしいときにセット |
| 83 | 84 | // 上書きすると前に設定されていた callbackが消えます |
| 84 | 85 | // callback: function mouseMove( evt ) move eventの evt.targetは目的のelementでない場合が多いため検索しない |
| @@ -35,6 +35,7 @@ | ||
| 35 | 35 | return false; |
| 36 | 36 | } |
| 37 | 37 | this.DOMobject = dom; |
| 38 | + this.DOMobject.classList.add('FrameArea'); | |
| 38 | 39 | } |
| 39 | 40 | |
| 40 | 41 |
| @@ -50,6 +51,24 @@ | ||
| 50 | 51 | } |
| 51 | 52 | } |
| 52 | 53 | |
| 54 | + hitCheck(x, y) { | |
| 55 | + let ret = false; | |
| 56 | + let chkx = parseFloat(x); | |
| 57 | + let chky = parseFloat(y); | |
| 58 | + // frameareaはサイズを持っていないため親elementから取得 | |
| 59 | + let thisx = window.displayField.x; | |
| 60 | + let thisy = window.displayField.y; | |
| 61 | + let thiswidth = window.displayField.width; | |
| 62 | + let thisheight = window.displayField.height; | |
| 53 | 63 | |
| 64 | + if (thisx <= chkx && chkx <= thisx + thiswidth) { | |
| 65 | + if (thisy <= chky && chky <= thisy + thisheight) { | |
| 66 | + ret = true; | |
| 67 | + } | |
| 68 | + } | |
| 54 | 69 | |
| 70 | + return ret; | |
| 71 | + } | |
| 72 | + | |
| 73 | + | |
| 55 | 74 | } |
| @@ -256,6 +256,10 @@ | ||
| 256 | 256 | // マウス座標直下にある要素を検索 |
| 257 | 257 | // (evt.targetは自分を指してしまうため) |
| 258 | 258 | let target = window.ObjIDMgr.hitCheck(evt.pageX, evt.pageY); |
| 259 | + if (null == target) { | |
| 260 | + if (window.frameArea.hitCheck(evt.pageX, evt.pageY)) | |
| 261 | + target = window.frameArea; | |
| 262 | + } | |
| 259 | 263 | |
| 260 | 264 | // Drag中 palette elementから target element へ CSS classを追加する |
| 261 | 265 | // 同じ種類のCSS class(Text color, BG imgなど)が既にある場合は上書き |
| @@ -57,8 +57,11 @@ | ||
| 57 | 57 | margin: 0; padding: 0; |
| 58 | 58 | background-color: white; |
| 59 | 59 | } |
| 60 | + .FrameArea { | |
| 60 | 61 | |
| 62 | + } | |
| 61 | 63 | |
| 64 | + | |
| 62 | 65 | .DispBase, |
| 63 | 66 | .DispObj { |
| 64 | 67 | display: inline-block; |
| @@ -196,10 +196,28 @@ | ||
| 196 | 196 | } |
| 197 | 197 | return null; |
| 198 | 198 | }; |
| 199 | +function getCssRule(ruleName) { | |
| 200 | + var ss = document.styleSheets, | |
| 201 | + rule, i, x; | |
| 199 | 202 | |
| 203 | + for (i = 0; i < ss.length; ++i) { | |
| 204 | + if (ss[i].cssRules) { | |
| 205 | + // loop through all the rules | |
| 200 | 206 | |
| 207 | + for (x =0; x < ss[i].cssRules.length; x++) { | |
| 208 | + rule = ss[i].cssRules[x]; | |
| 209 | + if (rule.type === window.CSSRule.STYLE_RULE && rule.selectorText === ruleName) { | |
| 210 | + return rule; | |
| 211 | + } | |
| 212 | + } | |
| 213 | + } | |
| 214 | + } | |
| 215 | + return null; | |
| 216 | +}; | |
| 201 | 217 | |
| 202 | 218 | |
| 219 | + | |
| 220 | + | |
| 203 | 221 | // elementを起点に classNameを持った要素を遡って検索 |
| 204 | 222 | // 見つからなければ nullを返す |
| 205 | 223 | function findClassNameParent( |
| @@ -26,6 +26,22 @@ | ||
| 26 | 26 | this.DOMobject.addEventListener('dragstart', this.onDragStart.bind(this), false); |
| 27 | 27 | this.DOMobject.addEventListener('dragover', this.onDragover.bind(this), false); |
| 28 | 28 | this.DOMobject.addEventListener('drop', this.onDrop.bind(this), false); |
| 29 | + | |
| 30 | + let css = getCssRule('#DispField'); | |
| 31 | + if (null == css) { | |
| 32 | + console.error('キャンバス情報取得失敗 CSS定義が見つからない'); | |
| 33 | + return false; | |
| 34 | + } | |
| 35 | + let width = css.cssText.match(/[\s\S]*width ?: *([0-9]+)(px|%);/)[1]; | |
| 36 | + let height = css.cssText.match(/[\s\S]*height ?: *([0-9]+)(px|%);/)[1]; | |
| 37 | + this.x = 0; // position: relativeなのでx,yは0固定 | |
| 38 | + this.y = 0; | |
| 39 | + if (null == width || null == height) { | |
| 40 | + console.error('キャンバス情報取得失敗 CSSから幅高さが取れない\ncss=' + css.cssText); | |
| 41 | + return false; | |
| 42 | + } | |
| 43 | + this.width = parseInt(width); | |
| 44 | + this.height = parseInt(height); | |
| 29 | 45 | } |
| 30 | 46 | |
| 31 | 47 |
| @@ -30,6 +30,7 @@ | ||
| 30 | 30 | |
| 31 | 31 | |
| 32 | 32 | // 操作関数 ----------------------------------- |
| 33 | +/* | |
| 33 | 34 | getFieldData() { |
| 34 | 35 | // 表示情報取得 |
| 35 | 36 | let data = this.DOMobject.innerHTML; |
| @@ -76,9 +77,9 @@ | ||
| 76 | 77 | this.DOMobject.innerHTML = result; |
| 77 | 78 | return true; |
| 78 | 79 | } |
| 80 | + */ | |
| 79 | 81 | |
| 80 | 82 | |
| 81 | - | |
| 82 | 83 | // Mouse eventを拾ったときに通知してほしいときにセット |
| 83 | 84 | // 上書きすると前に設定されていた callbackが消えます |
| 84 | 85 | // callback: function mouseMove( evt ) move eventの evt.targetは目的のelementでない場合が多いため検索しない |
| @@ -35,6 +35,7 @@ | ||
| 35 | 35 | return false; |
| 36 | 36 | } |
| 37 | 37 | this.DOMobject = dom; |
| 38 | + this.DOMobject.classList.add('FrameArea'); | |
| 38 | 39 | } |
| 39 | 40 | |
| 40 | 41 |
| @@ -50,6 +51,24 @@ | ||
| 50 | 51 | } |
| 51 | 52 | } |
| 52 | 53 | |
| 54 | + hitCheck(x, y) { | |
| 55 | + let ret = false; | |
| 56 | + let chkx = parseFloat(x); | |
| 57 | + let chky = parseFloat(y); | |
| 58 | + // frameareaはサイズを持っていないため親elementから取得 | |
| 59 | + let thisx = window.displayField.x; | |
| 60 | + let thisy = window.displayField.y; | |
| 61 | + let thiswidth = window.displayField.width; | |
| 62 | + let thisheight = window.displayField.height; | |
| 53 | 63 | |
| 64 | + if (thisx <= chkx && chkx <= thisx + thiswidth) { | |
| 65 | + if (thisy <= chky && chky <= thisy + thisheight) { | |
| 66 | + ret = true; | |
| 67 | + } | |
| 68 | + } | |
| 54 | 69 | |
| 70 | + return ret; | |
| 71 | + } | |
| 72 | + | |
| 73 | + | |
| 55 | 74 | } |
| @@ -239,7 +239,7 @@ | ||
| 239 | 239 | window.ObjIDMgr.clear(); // 表示中の要素を削除 (ObjIDMgr.deletebox()は隠すだけなので注意) |
| 240 | 240 | window.frameArea.clear(); |
| 241 | 241 | // canvas上の要素 |
| 242 | - let data = str.match(/<div id=\"FrameArea\"[\s\S]*/); | |
| 242 | + let data = str.match(/<div [\s\S]*/); | |
| 243 | 243 | if (null == data) { |
| 244 | 244 | console.error('ファイル読みこみ 失敗 キャンバス情報が取得できません data=' + data); |
| 245 | 245 | return; |
| @@ -256,6 +256,10 @@ | ||
| 256 | 256 | // マウス座標直下にある要素を検索 |
| 257 | 257 | // (evt.targetは自分を指してしまうため) |
| 258 | 258 | let target = window.ObjIDMgr.hitCheck(evt.pageX, evt.pageY); |
| 259 | + if (null == target) { | |
| 260 | + if (window.frameArea.hitCheck(evt.pageX, evt.pageY)) | |
| 261 | + target = window.frameArea; | |
| 262 | + } | |
| 259 | 263 | |
| 260 | 264 | // Drag中 palette elementから target element へ CSS classを追加する |
| 261 | 265 | // 同じ種類のCSS class(Text color, BG imgなど)が既にある場合は上書き |