简体   繁体   English

使用焦点激活AppBar时显示软键盘,使内容跳回到顶部

[英]Show soft keyboard when AppBar is active using focus makes the content jump back to the top

Currently just started developing a UWP WinJS app, testing on Windows 10 Mobile. 目前刚刚开始开发UWP WinJS应用程序,并在Windows 10移动版上进行了测试。

I have an appbar and a contenteditable div - if I press a button on the appbar to bold some word in the content area, the div will bold it, but will also jump completely to the top when editor.focus() is called. 我有一个应用程序栏和一个内容可编辑的div-如果按应用栏上的按钮以加粗内容区域中的某些单词,则div会将其加粗,但在调用editor.focus()时也将完全跳到顶部。 I'd like for it to stay in its current position. 我希望它保持当前位置。

What I'm trying to do is to have the keyboard appear even when a button is pressed on the AppBar. 我想做的是即使在AppBar上按下按钮时也要出现键盘。 (Without editor.focus(), the keyboard disappears on button tap.) Unfortunately, with that additional line of code, I have the above scrolling issue. (如果没有editor.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: 使用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
}

Tried another solution using tryShow() , to detect when the keyboard is about to be hidden. 使用tryShow()尝试了另一种解决方案,以检测何时键盘将被隐藏。 Once detected, force the keyboard to appear. 一旦检测到,请强制出现键盘。 Also, show the AppBar (since it disappeared), place the editor in focus and then scroll back to where you were before. 另外,显示AppBar(因为它消失了),将编辑器放在焦点上,然后滚动回到以前的位置。 This takes a few seconds to execute and the scrolling is too obvious for it to be a viable solution. 这需要花费几秒钟的时间来完成,并且滚动效果太明显了,因此不可行。

If you want to scroll the screen to your selected position, you should calculate the offset of the coordinate, which is moved cause by the showing of a software keyboard. 如果要将屏幕滚动到所选位置,则应计算坐标的offset ,该offset是由软件键盘的显示引起的。

Here is my Javascript code: 这是我的Javascript代码:

(function () { "use strict"; (function(){“ use strict”;

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();
})();

This is a Non-JQuery method, I think you can also import a JQuery package, and use the method here to calculate the offset . 这是一个Non-JQuery方法,我想您也可以导入JQuery包,并在此处使用该方法来计算offset

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM