- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Codepen 上发现了一个单词搜索游戏,在桌面上运行良好,但在移动设备上打开时,当我尝试突出显示单词时它不起作用。有人知道它是否可以适用于移动设备吗?
这是代码笔:http://codepen.io/collosic/pen/HBtwk
// JavaScript Documentvar pos = [];
var click = { "startPos": "", "endPos": ""
};
var letters = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
var words = [ { "word": "BUFFALO", "direction": "N", "start": 254 },
{ "word": "LAKERS", "direction": "SE", "start": 2 },
{ "word": "PRECIPITATE", "direction": "NE", "start": 323 },
{ "word": "CALDRON", "direction": "S", "start": 39 },
{ "word": "MISCIBLE", "direction": "NW", "start": 268 },
{ "word": "AEON", "direction": "E", "start": 132 },
{ "word": "SCRUTINY", "direction": "E", "start": 49 },
{ "word": "CLEANERS", "direction": "S", "start": 137},
{ "word": "SEETHING", "direction": "W", "start": 357 },
{ "word": "MOTH", "direction": "E", "start": 383 },
{ "word": "DOUBLE", "direction": "S", "start": 120 },
{ "word": "CREATURE", "direction": "N", "start": 395 },
{ "word": "GIPSY", "direction": "NW", "start": 340 },
{ "word": "MOBILE", "direction": "W", "start": 98 },
{ "word": "COMPUTER", "direction": "N", "start": 381 },
{ "word": "THEWEB", "direction": "N", "start": 145 },
{ "word": "HORSES", "direction": "E", "start": 6 },
{ "word": "HICKORYJUMP", "direction": "NE", "start": 204 },
{ "word": "CHROME", "direction": "NW", "start": 266},
{ "word": "MULDER", "direction": "S", "start": 41 },
];
// Prepare the wordsearch with random letters and word layout
$(document).ready(function() {
// grab the size of the grid. I used this method in case I need to
// scale this word search in the future
var size = 400; //($(".left").css("width").slice(0, 3) - 20) / 2 ;
// put random letters on the board
for (var i = 0; i < size; i++) {
$(".letters").append("<span class='" + (i + 1) + "'>" +
getRandomLetter() + "</span>");
}
// insert the words onto the board
for (var i = 0; i < words.length; i++) {
words[i].end = words[i].start;
displayWord(words[i]);
// save the start and end of each word for word checking later
pos[i] = { "start": words[i].start, "end": words[i].end };
$(".words").append("<span class='" + (i) + "'>" +
words[i].word + "</span>");
}
$("#menu").on("mouseup", function() {
$(this).css( {"display": "none"})
$("#main").slideDown("slow", function() {
})
});
})
function getRandomLetter() {
return letters[Math.floor(Math.random() * letters.length)];
}
function displayWord(w) {
for (var j = 0; j < w.word.length; j++){
if (w.direction == "N") {
$(".letters").find("." + w.end).text(w.word[j]);
if (j + 1 != w.word.length) w.end -= 20;
}
if (w.direction == "NE") {
$(".letters").find("." + w.end).text(w.word[j]);
if (j + 1 != w.word.length) w.end -= 19;
}
if (w.direction == "E") {
$(".letters").find("." + w.end).text(w.word[j]);
if (j + 1 != w.word.length) w.end += 1;
}
if (w.direction == "SE") {
$(".letters").find("." + w.end).text(w.word[j]);
if (j + 1 != w.word.length) w.end += 21;
}
if (w.direction == "S") {
$(".letters").find("." + w.end).text(w.word[j]);
if (j + 1 != w.word.length) w.end += 20;
}
if (w.direction == "SW") {
$(".letters").find("." + w.end).text(w.word[j]);
if (j + 1 != w.word.length) w.end += 19;
}
if (w.direction == "W") {
$(".letters").find("." + w.end).text(w.word[j]);
if (j + 1 != w.word.length) w.end -= 1;
}
if (w.direction == "NW") {
$(".letters").find("." + w.end).text(w.word[j]);
if (j + 1 != w.word.length) w.end -= 21;
}
}
}
// start of x & y, end of x & y.
var sX, sY, eX, eY, canvas, ctx, height, width, diff;
var r = 14;
var n = Math.sqrt((r * r) / 2);
var strokeColor = "black";
var isMouseDown = false;
var mouseMoved = false;
$(document).ready(function() {
$("#c").on("mousedown mouseup mousemove mouseleave", function(e) {
e.preventDefault();
//console.log(e);
if (e.type == "mousedown") {
setCanvas("c");
isMouseDown = true;
// Used for Firefox
sX = e.offsetX || e.clientX - $(e.target).offset().left;
sY = e.offsetY || e.clientY - $(e.target).offset().top;
// adjust the center of the arc
sX -= (sX % 20);
sY -= (sY % 20);
if (!(sX % 40)) sX += 20;
if (!(sY % 40)) sY += 20;
setPos(sX, sY, "start");
draw(e.type);
}
else if (e.type == "mousemove") {
if (isMouseDown) {
mouseMoved = true;
eX = e.offsetX || e.clientX - $(e.target).offset().left;
eY = e.offsetY || e.clientY - $(e.target).offset().top;
draw(e.type);
}
}
else if (e.type == "mouseup") {
isMouseDown = false;
ctx.clearRect(0, 0, width, height);
if (mouseMoved) {
mouseMoved = false;
eX -= eX % 20;
eY -= eY % 20;
if (!(eX % 40)) eX += 20;
if (!(eY % 40)) eY += 20;
// draw the last line and clear the canvas to check and see if its the
// correct word
draw(e.type);
ctx.clearRect(0, 0, width, height);
// if a correct word has been highlighted change the canvas to
// the permanent one and redraw the arcs and lines. Then scratch the
// word on the right.
if (checkWord()) {
setCanvas("a");
draw(e.type);
scratchWord();
// Check if the game is over
if(isEndOfGame()) {
alert("Good job!");
}
}
}
}
else if (e.type == "mouseleave") {
isMouseDown = false;
draw(e.type);
}
});
})
// This function is called when lines need to be drawn on the game
function draw(f) {
// used to draw an arc. takes in two numbers that represent the beginning
// and end of the arc
function drawArc(xArc, yArc, num1, num2) {
ctx.lineWidth = 2;
ctx.beginPath();
ctx.arc(xArc, yArc, r, num1 * Math.PI, num2 * Math.PI);
ctx.strokeStyle = strokeColor;
ctx.stroke();
}
// used to draw the two lines around letters
function drawLines(mX1, mY1, lX1, lY1, mX2, mY2, lX2, lY2) {
ctx.beginPath();
ctx.moveTo(mX1, mY1);
ctx.lineTo(lX1, lY1);
ctx.moveTo(mX2, mY2);
ctx.lineTo(lX2, lY2);
ctx.stroke();
}
// Check and see what event occured and create the action that belongs to that
// event.
if (f == "mousedown"){
ctx.clearRect(0, 0, width, height);
drawArc(sX, sY, 0, 2);
}
else if (f == "mousemove" || f == "mouseup") {
/*
This is to show the rise over run I used to get the limits for
all eight directions. This tells the conditionals when to activiate
the lines and in which direction.
rise = (sY - eY) * Math.sqrt(6);
run = sX - eX;
*/
limit = ((sY - eY) * Math.sqrt(6)) / (sX - eX);
// UP
if ((limit > 6 || limit < -6) && eY < sY) {
// clear the canvas
if (f == "mousemove") ctx.clearRect(0, 0, width, height);
drawArc(sX, sY, 0, 1); // draw bottom arc
drawArc(sX, eY, 1, 2); // draw top arc
// draw the two lines that connect the bottom and the top arcs
drawLines(sX + r, sY, sX + r, eY, sX - r, sY, sX -r, eY);
// if the player is selecting this as the last letter set its position
// for wordcheck
if (f == "mouseup") setPos(sX, eY, "end");
}
// DOWN
if ((limit < -6 || limit > 6) && eY > sY) {
// clear the canvas
if (f == "mousemove") ctx.clearRect(0, 0, width, height);
drawArc(sX, sY, 1, 2);
drawArc(sX, eY, 0, 1);
drawLines(sX + r, sY, sX + r, eY, sX - r, sY, sX -r, eY);
if (f == "mouseup") setPos(sX, eY, "end");
}
// LEFT
if ((limit < 1 && limit > -1) && eX < sX) {
if (f == "mousemove") ctx.clearRect(0, 0, width, height);
drawArc(sX, sY, 1.5, 0.5);
drawArc(eX, sY, 0.5, 1.5);
drawLines(sX, sY - r, eX, sY -r, sX, sY + r, eX, sY + r);
if (f == "mouseup") setPos(eX, sY, "end");
}
// RIGHT
if ((limit < 1 && limit > -1) && eX > sX) {
if (f == "mousemove") ctx.clearRect(0, 0, width, height);
drawArc(sX, sY, 0.5, 1.5);
drawArc(eX, sY, 1.5, 0.5);
drawLines(sX, sY - r, eX, sY -r, sX, sY + r, eX, sY + r);
if (f == "mouseup") setPos(eX, sY, "end");
}
/*
This is for the NW diagonal lines it requires a special number
n that is the adjacent lengths of a 45-45-90 triangle needed to draw these
lines. It also creates a diff for the difference between the
start and the end of the arcs
*/
// NW
if ((limit > 1 && limit < 6) && (eX < sX && eY < sY)) {
if (f == "mousemove") ctx.clearRect(0, 0, width, height);
diff = sX - eX;
drawArc(sX, sY, 1.75, 0.75);
drawArc(sX - diff, sY - diff, 0.75, 1.75);
drawLines(sX + n, sY - n, sX + n - diff, sY - n - diff,
sX - n, sY + n, sX - n - diff, sY + n - diff);
if (f == "mouseup") setPos(sX - diff, sY - diff, "end");
}
// NE
if ((limit < -1 && limit > -6) && (eX > sX && eY < sY)) {
if (f == "mousemove") ctx.clearRect(0, 0, width, height);
diff = sX - eX;
drawArc(sX, sY, 0.25, 1.25);
drawArc(sX - diff, sY + diff, 1.25, 0.25);
drawLines(sX + n, sY + n, sX + n - diff, sY + n + diff,
sX - n, sY - n, sX - n - diff, sY - n + diff);
if (f == "mouseup") setPos(sX - diff, sY + diff, "end");
}
// SW
if ((limit < -1 && limit > -6) && (eX < sX && eY > sY)) {
if (f == "mousemove") ctx.clearRect(0, 0, width, height);
diff = sX - eX;
drawArc(sX, sY, 1.25, 0.25);
drawArc(sX - diff, sY + diff, 0.25, 1.25);
drawLines(sX + n, sY + n, sX + n - diff, sY + n + diff,
sX - n, sY - n, sX - n - diff, sY - n + diff);
if (f == "mouseup") setPos(sX - diff, sY + diff, "end");
}
// SE
if ((limit > 1 && limit < 6) && (eX > sX && eY > sY)) {
if (f == "mousemove") ctx.clearRect(0, 0, width, height);
diff = sX - eX;
drawArc(sX, sY, 0.75, 1.75);
drawArc(sX - diff, sY - diff, 1.75, 0.75);
drawLines(sX + n, sY - n, sX + n - diff, sY - n - diff,
sX - n, sY + n, sX - n - diff, sY + n - diff);
if (f == "mouseup") setPos(sX - diff, sY - diff, "end");
}
}
else if (f == "mouseleave") {
setCanvas("c");
ctx.clearRect(0,0,width,height);
}
}
// change the canvas between the bottom and top layer
function setCanvas(id) {
canvas = document.getElementById(id);
ctx = canvas.getContext("2d");
width = canvas.width;
height = canvas.height;
}
// set the offsets to numbers that match the class names of each letter
function setPos(x, y, loc) {
tX = Math.floor((x / 8) / 5 ) + 1;
tY = Math.floor((y / 8) / 5 ) + 1;
if (loc == "start") click.startPos = (tY - 1) * 20 + tX;
else click.endPos = (tY - 1) * 20 + tX;
}
// verify if the word chosen is the correct one. If a player decides
// to highlight a word starting from last letter to first this function
// will also support that ability
function checkWord() {
// clears the pos array so that a player cannot highlight the same word twice
function clearPos(p) {
p.start = p.end = 0;
return true;
}
// user highlights from first letter to last
if (pos.some(function(o) { return o.start === click.startPos &&
o.end === click.endPos && clearPos(o); })) {
return true;
}
// if user highlights from last letter to first
else if (pos.some(function(o) { return o.start === click.endPos &&
o.end === click.startPos && clearPos(o); })) {
return true;
}
else return false;
}
// scratch the word on the right out when the word is found on the left
function scratchWord() {
for (var i = 0; i < words.length; i++) {
if ((click.startPos === words[i].start && click.endPos === words[i].end) ||
(click.startPos === words[i].end && click.endPos === words[i].start)) {
// little hack here
$(".words").find("." + i).addClass("strike");
}
}
// check if the game is over
}
function isEndOfGame(){
return pos.every(function(o) { return o.start === 0 && o.end === 0; });
}
最佳答案
在手机上,没有鼠标。 Codepen 链接中的代码通过绑定(bind)到 mouseup
/mousedown
事件来工作,因此这些事件永远不会在移动设备上触发。
通常 touchstart
/touchend
事件与 JavaScript 中的鼠标事件一起使用,以桥接缺少的鼠标控件,但事件的工作方式略有不同,因此是一个非常重要的问题要执行的任务。
在这里阅读更多关于鼠标事件的信息:https://developer.mozilla.org/en/docs/Web/API/MouseEvent
在此处阅读有关触摸事件的更多信息:https://developer.mozilla.org/en/docs/Web/API/Touch_events
关于javascript - Word Cross Game 不适用于手机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41007456/
我在我的 Xcode 项目目录中输入了以下内容: keytool -genkey -v -keystore release.keystore -alias mykey -keyalg RSA \
假设我有一个像这样的 DataFrame(或 Series): Value 0 0.5 1 0.8 2 -0.2 3 None 4 None 5 None
我正在对一个 Pandas 系列进行相对繁重的应用。有什么方法可以返回一些打印反馈,说明每次调用函数时在函数内部进行打印还有多远? 最佳答案 您可以使用跟踪器包装您的函数。以下两个示例,一个基于完成的
我有一个 DataFrame,其中一列包含列表作为单元格内容,如下所示: import pandas as pd df = pd.DataFrame({ 'col_lists': [[1, 2
我想使用 Pandas df.apply 但仅限于某些行 作为一个例子,我想做这样的事情,但我的实际问题有点复杂: import pandas as pd import math z = pd.Dat
我有以下 Pandas 数据框 id dist ds 0 0 0 0 5 1 0 0 7 2 0 0
这发生在我尝试使用 Gradle 构建时。由于字符串是对象,因此似乎没有理由发生此错误: No signature of method: java.util.HashMap.getOrDefault(
您好,有人可以解释为什么在 remaining() 函数中的 Backbone 示例应用程序 ( http://backbonejs.org/examples/todos/index.html ) 中
我有两个域类:用户 class User { String username String password String email Date dateCreated
问题陈述: 一个 pandas dataframe 列系列,same_group 需要根据两个现有列 row 和 col 的值从 bool 值创建。如果两个值在字典 memberships 中具有相似
apporable 报告以下错误: error: unknown type name 'MKMapItem'; did you mean 'MKMapView'? MKMapItem* destina
我有一个带有地址列的大型 DataFrame: data addr 0 0.617964 IN,Krishnagiri,635115 1 0.635428 IN,Chennai
我有一个列表list,里面有这样的项目 ElementA: Number=1, Version=1 ElementB: Number=1, Version=2 ElementC: Number=1,
我正在编译我的源代码,它只是在没有运行应用程序的情况下终止。这是我得到的日志: Build/android-armeabi-debug/com.app4u.portaldorugby/PortalDo
我正在尝试根据另一个单元格的值更改单元格值(颜色“红色”或“绿色”)。我运行以下命令: df.loc[0, 'Colour'] = df.loc[0, 'Count'].apply(lambda x:
我想弄清楚如何使用 StateT结合两个 State基于对我的 Scalaz state monad examples 的评论的状态转换器回答。 看来我已经很接近了,但是在尝试申请 sequence
如果我已经为它绑定(bind)了集合,我该如何添加 RibbonLibrary 默认的快速访问项容器。当我从 UI 添加快速访问工具项时,它会抛出 Operation is not valid whi
在我学习期间Typoclassopedia我遇到了这个证明,但我不确定我的证明是否正确。问题是: One might imagine a variant of the interchange law
我是一名优秀的程序员,十分优秀!