使用Javascript触摸映射和输入聚焦在移动设备上

时间:2011-10-25 17:32:52

标签: javascript html ios events touch

我最近在我的一个页面中添加了一个js触摸映射函数(在这里,在stackoverflow中找到),这样我就可以让我的Jquery draggables在iOS上运行了(如果没有这个映射,拖放将无法工作,如就我所见)

这是功能:

function touchHandler(event)
{
var touches = event.changedTouches,
    first = touches[0],
    type = "";

     switch(event.type)
{
    case "touchstart": type = "mousedown"; break;
    case "touchmove":  type="mousemove"; break;        
    case "touchend":   type="mouseup"; break;
    default: return;
}
altKey, shiftKey, metaKey, button, relatedTarget);

var simulatedEvent = document.createEvent("MouseEvent");
simulatedEvent.initMouseEvent(type, true, true, window, 1,
                          first.screenX, first.screenY,
                          first.clientX, first.clientY, false,
                          false, false, false, 0, null);

first.target.dispatchEvent(simulatedEvent);
event.preventDefault();
}

一切都很好......除非我专注于输入或textarea(特别是Facebook评论插件)并且iOS键盘出现。

在我输入文本并单击输入上方的“发送”按钮后,该函数为模拟鼠标事件提供错误的Y坐标(我相信这是因为键盘改变了页面的高度)并且我最终点击某处在那个按钮上方。

输入模糊,但不会点击发送按钮。好像这还不够悲伤,页面上的另一个按钮(发送一个上方的一些像素)会被点击并链接到另一个页面。

我认为我可以在输入聚焦时禁用映射,但似乎那些Facebook评论插件元素根本无法访问。

感谢任何帮助,我已经在这几天工作了......

1 个答案:

答案 0 :(得分:1)

在显示键盘时,您是否使用过UIview来推送内容?

    - (void)textFieldDidEndEditing:(UITextField *)textField {   
        [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationBeginsFromCurrentState:YES];
        textfield.frame = CGRectMake(textfield.frame.origin.x, (textfield.frame.origin.y + 100.0), textfield.frame.size.width, textfield.frame.size.height);
    [UIView commitAnimations];
    }

它现在正从它的原点移动它100,如果你的元素需要它,你可以改变它。完成输入文本后,您还必须添加代码以从键盘中删除键盘。

        - (void)textFieldDidEndEditing:(UITextField *)textField {   
            [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDuration:0.5];
        [UIView setAnimationBeginsFromCurrentState:YES];
textfield.frame = CGRectMake(textfield.frame.origin.x, (textfield.frame.origin.y + 100.0), textfield.frame.size.width, textfield.frame.size.height);
        [UIView commitAnimations];

}