当AppBar处于活动状态时显示软键盘,使用焦点使内容跳回到顶部
Show soft keyboard when AppBar is active using focus makes the content jump back to the top
目前刚刚开始开发UWP WinJS应用程序,在Windows 10 Mobile上进行测试。
我有一个appbar和一个内容可编辑的div-如果我按下appbar上的按钮在内容区域中加粗一些单词,div会将其加粗,但在调用editor.focus()时也会完全跳到顶部。我希望它保持目前的位置。
我想做的是,即使按下了AppBar上的按钮,也要让键盘出现。(在没有编辑器.focus()的情况下,按一下按钮键盘就会消失。)不幸的是,有了这行额外的代码,我就出现了上面的滚动问题。
<div id="editor" contenteditable="true">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam tristique convallis aliquet. Proin ac urna ut diam luctus facilisis vel in ligula. Morbi porta volutpat est eget semper. Sed elementum tincidunt libero. Cras a felis leo. Fusce lacinia turpis vel turpis facilisis sollicitudin. Suspendisse blandit, nisi gravida fermentum placerat, velit ipsum volutpat mi, ut finibus enim mauris at massa. Etiam placerat et mi eget iaculis. Aliquam et semper nisl. Integer id magna non sapien tempus suscipit at eget sem. Integer quam risus, placerat sit amet iaculis ac, ultrices non diam. Aliquam at convallis velit, vitae iaculis lectus. Morbi non orci eget mi placerat aliquet. Sed at neque a eros efficitur egestas. Donec sed luctus leo, ac ullamcorper dui.
Nullam volutpat ultricies leo, ut congue risus egestas euismod. Suspendisse nisi ligula, volutpat id tempor convallis, facilisis in justo. Nulla porta neque eget ante tincidunt pellentesque. Integer felis libero, rutrum eu interdum eu, finibus a felis. Vestibulum vel est dictum, tempor ex vel, facilisis lorem. Nulla facilisi. Nulla ut ornare tortor, vitae blandit augue. Quisque imperdiet pretium turpis, ac fermentum diam imperdiet vitae. Pellentesque vel mollis odio. Quisque tempus eget neque non pretium.
Cras eu velit sit amet dolor pulvinar ultricies at id lectus. Suspendisse quis metus sem. Etiam lectus mauris, lobortis volutpat consectetur at, sodales in nisl. Fusce euismod magna in leo tempor, quis bibendum leo gravida. Nulla varius velit vel ultrices sollicitudin. Morbi at odio efficitur, iaculis odio ut, auctor mauris. Phasellus nec lacus arcu. Duis porttitor, urna sit amet tempor dapibus, velit libero malesuada erat, eget pulvinar velit quam id leo. Quisque vulputate vehicula ante, vel condimentum dui consectetur eget.
Curabitur lobortis porta justo quis pulvinar. Aliquam quam nisl, aliquam vel risus et, semper molestie nulla. Aenean mollis facilisis odio vel convallis. Suspendisse vestibulum nec sapien ut pretium. Duis vehicula, mi sed rutrum luctus, odio magna hendrerit nisl, laoreet eleifend augue neque vestibulum dui. Proin vitae metus convallis, condimentum enim in, volutpat nisl. Aliquam at est id felis placerat fermentum. Duis suscipit commodo convallis. Aliquam imperdiet mollis tortor, sit amet placerat tellus malesuada in. Nunc fringilla sem lorem, nec efficitur purus lobortis mollis. Duis non eros aliquam, luctus libero sed, ullamcorper odio.
Fusce orci est, rutrum non urna a, finibus suscipit dolor. Mauris suscipit mi ut dolor cursus, quis laoreet est porta. Etiam bibendum fringilla turpis et sagittis. Aenean vehicula maximus dui ut pretium. Vestibulum iaculis id sapien nec condimentum. Donec a aliquet enim. Donec non mauris convallis, tincidunt elit sit amet, ultrices nulla. Duis vel auctor nisl, vitae ultrices mi. Suspendisse potenti. Vivamus sit amet lacus urna. Fusce a sagittis risus. Cras facilisis porta purus, vitae scelerisque mauris vehicula eu.
</div>
<div data-win-control="WinJS.UI.AppBar" id="appBar" data-win-options="{placement: 'bottom', sticky: 'true'}" style="background-color: #e6e6e6;">
<button data-win-control="WinJS.UI.AppBarCommand" data-win-options="{id: 'boldBtn', icon: 'bold', section:'selection', tooltip:'bold'}"></button>
</div>
Javascript:
element.querySelector("#boldBtn").addEventListener("click", toggleBold, false);
function toggleBold() {
document.execCommand('bold', false, null);
editor.focus(); // this will cause the div to jump back to the top if it's not already at the top
}
使用tryShow()尝试了另一种解决方案,以检测键盘何时将被隐藏。一旦检测到,强制键盘出现。此外,显示AppBar(因为它消失了),将编辑器放在焦点上,然后滚动回以前的位置。这需要几秒钟的时间来执行,而且滚动太明显了,不可能成为一个可行的解决方案。
如果您想将屏幕滚动到您选择的位置,您应该计算坐标的offset
,它是由于显示软件键盘而移动的。
这是我的Javascript
代码:
(函数(){"严格使用";
var app = WinJS.Application;
var activation = Windows.ApplicationModel.Activation;
var userHeight, cursorY0, range;
app.onactivated = function (args) {
if (args.detail.kind === activation.ActivationKind.launch) {
if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
// TODO: This application has been newly launched. Initialize your application here.
} else {
// TODO: This application was suspended and then terminated.
// To create a smooth user experience, restore application state here so that it looks like the app never stopped running.
}
args.setPromise(WinJS.UI.processAll().done(
function () {
//var editor = document.getElementById("editor");
//editor.addEventListener("click", toggleBold, false);
var button = document.getElementById("boldBtn");
var text = document.getElementById("editor");
var oRange = document.createRange();
button.addEventListener("click", toggleBold, false);
text.addEventListener('mouseup',function(e){
if (window.getSelection) {
var selection = window.getSelection();
} else if (document.selection) {
var selection = document.selection.createRange();
}
range = selection.getRangeAt(0);
cursorY0 = window.event.pageY;
console.log(cursorY0);
})
/*text.addEventListener("click", function () {
cursorY0 = window.event.pageY;
console.log(cursorY0);
}, false);*/
//console.log(window.innerHeight);
userHeight = window.innerHeight;
})
);
}
};
app.oncheckpoint = function (args) {
// TODO: This application is about to be suspended. Save any state that needs to persist across suspensions here.
// You might use the WinJS.Application.sessionState object, which is automatically saved and restored across suspension.
// If you need to complete an asynchronous operation before your application is suspended, call args.setPromise().
};
function toggleBold() {
var text = document.getElementById("editor");
//Array.prototype.slice.apply(document.querySelectorAll("b")).forEach(function (b) {
// b.parentNode.replaceChild(b.firstChild, b);
//});
text.focus();
var currentHeight = window.innerHeight;
var cursorY1 = window.event.pageY;
if (cursorY1 > currentHeight) {
window.scrollTo(0, currentHeight - (cursorY1 - cursorY0));
}
var selectionContents = range.extractContents();
var boldDom = document.createElement("b");
boldDom.appendChild(selectionContents);
range.insertNode(boldDom);
}
app.start();
})();
这是一个非JQuery方法,我想你也可以导入一个JQuery包,并使用这里的方法来计算offset
。
相关文章:
- keyup事件处理程序更改焦点不适用于快速键入
- 单击时将焦点更改为元素
- 单击顶部导航时如何进行向下滚动效果(向下滑动).
- 后焦点更改为IE 11中的地址栏,而不是转移到表单中的下一个控件
- jQuery粘性插件可变顶部间距
- 使用jQuery更改元素的顶部位置
- 在IE9中的输入字段中输入焦点最近按钮
- Javascript游戏输入失去焦点
- ExtJS网格单元格编辑器,防止焦点松动问题
- 检查元素是如何获得焦点的
- 背景图像顶部的滚动图像不移动
- 滚动然后捕捉到顶部而不是取消捕捉
- 当带有渲染器的DOM元素不在屏幕顶部时,移动了场景的坐标
- angularjs移除焦点上的活动类并添加到下一个项目
- Don'不允许将焦点集中在自动完成的选择上
- 当点击另一件事时,将焦点设置为一件事
- 文本框焦点上的自动完成菜单
- 在自动重影文本区域中打字时,会将焦点集中在元素的顶部
- 当AppBar处于活动状态时显示软键盘,使用焦点使内容跳回到顶部
- 对于移动浏览器,当文本字段处于焦点中时,我如何“推送”?将文本字段移至页面顶部,而不是默认的中间位置