我正在创建一个“Itunes LP”格式的触摸应用程序,它使用Itunes中的html,css和javascript来创建“数字LP”。该应用程序将有几个LP通过触摸屏进行探索。 在全屏模式下(在Itunes和LP中),您可以按“esc键”退出LP并输入“coverflow view”,您可以在其中选择要探索的另一个LP。我将没有键盘或鼠标,所以我需要创建一个按钮/链接,当用户点击此链接时,它会做一件事,那就是模拟按下的ESC键。
所以我的问题是;是否可以模拟在链接中使用JavaScript按下的键盘快捷键?我的链接将是“Home”,通过单击此链接,浏览器将按下ESC键。
任何有关此方面的提示都会对您有所帮助。 谢谢!
大卫
已添加30/6;
(Itunes LP的TuneKit.js的一部分)
/* ==================== Keyboard Navigation ==================== */
TKSpatialNavigationManager.prototype.handleKeydown = function (event) {
var key = event.keyCode;
// check if our controller knows what it's doing and let it take over in case it does
if (this._managedController.wantsToHandleKey(key)) {
// prevent default actions
event.stopPropagation();
event.preventDefault();
// have the controller do what it think is best in this case
this._managedController.keyWasPressed(key);
return;
}
// reset the sound
TKSpatialNavigationManager.soundToPlay = null;
// check we know about this key, otherwise, do nothing
if (TKSpatialNavigationManagerKnownKeys.indexOf(key) == -1) {
return;
}
var navigation = TKNavigationController.sharedNavigation;
// first, check if we're hitting the back button on the home screen, in which case
// we don't want to do anything and let the User Agent do what's right to exit
if (event.keyCode == KEYBOARD_BACKSPACE && navigation.topController === homeController) {
return;
}
// before we go any further, prevent the default action from happening
event.stopPropagation();
event.preventDefault();
// check if we're busy doing other things
if (TKSpatialNavigationManager.busyControllers > 0) {
return;
}
// see if we pressed esc. so we can pop to previous controller
if (event.keyCode == KEYBOARD_BACKSPACE) {
var top_controller = navigation.topController;
if (top_controller !== homeController) {
// at any rate, play the exit sound
TKUtils.playSound(SOUND_EXIT);
// see if the top controller has a custom place to navigate to with the back button
if (top_controller.backButton instanceof Element && top_controller.backButton._navigationData !== undefined) {
navigation.pushController(TKController.resolveController(top_controller.backButton._navigationData.controller));
}
// otherwise, just pop the controller
else {
navigation.popController();
}
}
}
****我的脚本将如下所示:****
var albumHelper = {};
albumHelper.playAlbum = function() {
var playlist = bookletController.buildPlaylist(appData.songs);
playlist.play();
};
var event = {};
event.keyCode = function() {
var escapeKeyProxy = TKSpatialNavigationManager.prototype.handleKeydown({'keyCode':27});
document.getElementById('btnExitFullScreen').onclick = escapeKeyProxy;
};
var homeController = new TKController({
id: 'home',
actions : [
{ selector: '.menu > .play', action: albumHelper.playAlbum },
{ selector: '.menu > .linernotes', action: event.keyCode }
],
navigatesTo : [
{ selector: '.menu > .songs', controller: 'songs' },
{ selector: '.menu > .photos', controller: 'photos' },
{ selector: '.menu > .videos', controller: 'videos' },
{ selector: '.menu > .credits', controller: 'credits' }
],
// make the PLAY button be default highlight
highlightedElement : '.menu > .play'
});
所以我想要的是.linernotes的图像,点击后,模拟正在推送的ESC键!
答案 0 :(得分:0)
这个答案假定iTunes LP应用程序使用JS功能退出全屏。
虽然你可能,但你不应该模拟这个事件。您正在使用的Key事件由函数的事件侦听器或事件处理程序绑定(在这种情况下,是退出全屏模式的函数)。您应该能够创建一个按钮并将其(通过类似的事件监听器或事件处理程序)绑定到同一个函数。
您不能直接绑定它,因为关键事件传递有关按下哪个键的信息,而鼠标事件没有,因此您需要通过代理发送它。您的代码可能看起来像这样。在这种情况下,接收iTunes LP库中Key事件的代码将被称为iTunesLPKeyPressEvent。我不知道它实际上叫什么。
var escapeKeyProxy = function() {
iTunesLPKeyPressEvent({'keyCode':27});
}
document.getElementById('btnExitFullScreen').onclick = escapeKeyProxy;
您可能需要按摩一下,但基本想法应该有效。
[编辑]
根据您的更新,我会这么说
TKSpatialNavigationManager.prototype._managedController
是您需要使用的对象,很可能TKSpatialNavigationManager.prototype._managedController.keyWasPressed(key)
是捕获转义键的代码。请查看addEventListener("keypress",SOME_METHOD,true)
(或keyup
或keydown
)的代码,它将是处理该事件的SOME_METHOD
。那是你想要劫持的方法。希望它会在你可以轻松到达的范围内。