javascript - 当 AppBar 处于事件状态时使用焦点显示软键盘使内容跳回顶部

标签 javascript html windows-phone winjs uwp

目前刚刚开始开发 UWP WinJS 应用,在 Windows 10 Mobile 上进行测试。

我有一个应用程序栏和一个可内容编辑的 div - 如果我按应用程序栏上的按钮将内容区域中的某些单词加粗,div 会将其加粗,但当 editor.focus() 为叫。我希望它保持在当前位置。

我想做的是即使按下应用程序栏上的按钮也能显示键盘。 (如果没有 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:

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(因为它消失了),将编辑器置于焦点中,然后滚动回之前所在的位置。这需要几秒钟的时间来执行,并且滚动太明显,因此不是一个可行的解决方案。

最佳答案

如果你想滚动屏幕到你选择的位置,你应该计算坐标的偏移,该坐标是由于软件键盘的显示而移动的。

这是我的 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包,并使用method在这里计算偏移

关于javascript - 当 AppBar 处于事件状态时使用焦点显示软键盘使内容跳回顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33907608/

相关文章:

c# - 使用 C++ Baclground-Task 将解决方案部署到物理 WP8.1 设备

javascript - 通过javascript设置iframe marginheight ="0"

javascript - 尝试使用 javascript 访问 <a> 的 rel 属性

javascript - $q - 控制函数执行的顺序

html - 在两个全宽的 div 之间居中放置一个 div

javascript - 如何将另一个目录链接附加到 HTML 中的 <a>

javascript - Angular 2 - 路由不起作用

c# - 为 URI 关联注册应用程序 (Windows Phone 8.1 RT)

c# - Windows Phone 8 更改口音和主题颜色

javascript - &lt;script&gt; 关于 .click() 的帮助